2016-10-20 9 views
2

ich einen Parser für arithmetische Ausdrücke haben:Reuse-Parser in einem anderen Parser mit Scala Parser Kombinatoren

object FormulaParser extends JavaTokenParsers { 
    def apply(input: String) = parseAll(formula, input) 
    // ... 

    val formula: Parser[Formula] = 
    comparison | comparable | concatenable | term | factor 
} 

Ich brauche eine andere Sprache zu analysieren, die Formeln enthalten. Lassen Sie uns sagen, dass ich etwas wie X < formula analysieren muss. Leider kann ich nicht FormulaParser.formula in meinem neuen Parser wiederverwenden:

object ConditionParser extends JavaTokenParsers { 
    def apply(input: String) = parseAll(condition, input) 
    // ... 

    val condition: Parser[Condition] = 
    "X" ~ ("<=" | "<") ~ FormulaParser.formula ^^ { ... } // doesn't work 
} 

weil der Parser auf der linke Seite von ~ eine Instanz von ConditionParser.Parser ist, so dass ihre ~ Methode erwartet etwas mit dem gleichen Typ, nicht etwas vom Typ FormulaParser.Parser .

Der ganze Sinn der Verwendung von Parser-Kombinatoren ist, gut, kombinieren Parser! Es erscheint mir albern, dass mein erster Versuch nicht funktioniert hat, obwohl ich verstehe, warum es passiert (wir verwenden Basis-Parser erneut, indem wir ein Basismerkmal erweitern).

Gibt es eine einfache Möglichkeit Parser in verschiedenen Typen zu kombinieren?

Antwort

3

Um Parser wiederzuverwenden, müssen Sie Vererbung verwenden. Wenn Sie also FormulaParsers eine Klasse oder ein Merkmal machen, kann ConditionParser davon erben und seine Parser wiederverwenden.

Dies ist auch, wie Sie bereits die in JavaTokenParsers definierten Parser wiederverwenden.

+0

Danke! Ich habe schließlich ein 'BaseParsers'-Merkmal erstellt und beide Parser davon geerbt. –