2010-04-05 13 views
8

Supponiamo di avere una lingua ambigua espressa in parser combinatore. C'è un modo per rendere certe espressioni localmente avide? Ecco un esempio di cosa intendo.Scala: posso spingere un parser combinatore ad essere localmente avido?

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))) 
    } 
} 

Dopo la compilazione, posso correre come segue:

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

vorrei per istruire in qualche modo la prima parte del obj ad essere localmente avidi e abbinare longchain. Se cambio l'ordine, corrisponde allo longchain, ma non per l'avidità.

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

La nozione di "ingordigia" si applica solo alla chiusura ('rep' o Postifx' * 'operatore) e nella tua grammatica che è applicato solo alla parte seguente '(longchain | shortchain)' o '(shortchain | longchain)'. –

risposta

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

Grazie per la tua risposta! –

Problemi correlati