2010-04-05 5 views
8

Angenommen, ich habe eine mehrdeutige Sprache im Kombinator Parser ausgedrückt. Gibt es eine Möglichkeit, bestimmte Ausdrücke lokal gierig zu machen? Hier ist ein Beispiel, was ich meine.Scala: Kann ich einen Kombinator-Parser anstoßen, um lokal gierig zu sein?

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

Nach dem Kompilieren, kann ich es laufen wie folgt:

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

Ich möchte irgendwie den ersten Teil der obj anweisen, lokal gierig und Spiel mit longchain zu sein. Wenn ich die Reihenfolge umschalte, stimmt es mit der longchain überein, aber das liegt nicht an der Gier.

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

Der Begriff "Gefräßigkeit" nur Schließung gilt ('rep' oder Postifx' * 'Operator) und in der Grammatik, die sich nur auf die Seiten angewendet wird folgende '(longchain | shortchain)' oder '(shortchain | longchain)'. –

Antwort

13

Verwendung |||:

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

Danke für Ihre Antwort! –