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?
Danke! Ich habe schließlich ein 'BaseParsers'-Merkmal erstellt und beide Parser davon geerbt. –