2010-04-05 9 views
8

Supongamos que tengo un lenguaje ambiguo expresado en el analizador combinador. ¿Hay alguna forma de hacer que ciertas expresiones sean codiciosas localmente? Aquí hay un ejemplo de lo que quiero decir.Scala: ¿Puedo empujar un analizador combinador para que sea localmente codicioso?

import scala.util.parsing.combinator._ 

object Example extends JavaTokenParsers { 
    def obj: Parser[Any] = (shortchain | longchain) ~ anyrep 

    def longchain: Parser[Any] = zero~zero~one~one 
    def shortchain: Parser[Any] = zero~zero 

    def anyrep: Parser[Any] = rep(any) 
    def any: Parser[Any] = zero | one 
    def zero: Parser[Any] = "0" 
    def one: Parser[Any] = "1" 
    def main(args: Array[String]) { 
    println(parseAll(obj, args(0))) 
    } 
} 

Después de compilar, puedo ejecutarlo de la siguiente manera:

$ scala Example 001111 
[1.7] parsed: ((0~0)~List(1, 1, 1, 1)) 

me gustaría dar instrucciones de alguna manera la primera parte de obj a ser localmente codiciosos y combinar con longchain. Si cambio el orden, coincide con el longchain, pero eso no se debe a la codicia.

def obj: Parser[Any] = (longchain | shortchain) ~ anyrep 
+1

La noción de "avidez" sólo se aplica a cierre ('rep' o la postifx' * 'operador) y en su gramática que sólo se aplica a la parte siguiente '(longchain | shortchain)' o '(shortchain | longchain)'. –

Respuesta

13

Uso |||:

object Example extends JavaTokenParsers { 
    def obj: Parser[Any] = (shortchain ||| longchain) ~ anyrep 

    def longchain: Parser[Any] = zero~zero~one~one 
    def shortchain: Parser[Any] = zero~zero 

    def anyrep: Parser[Any] = rep(any) 
    def any: Parser[Any] = zero | one 
    def zero: Parser[Any] = "0" 
    def one: Parser[Any] = "1" 
    def main(args: Array[String]) { 
    println(parseAll(obj, args(0))) 
    } 
} 

scala> Example.main(Array("001111")) 
[1.7] parsed: ((((0~0)~1)~1)~List(1, 1)) 
+0

¡Gracias por tu respuesta! –

Cuestiones relacionadas