J'ai un analyseur pour les expressions arithmétiques:analyseur de réutilisation dans une autre analyseur avec analyseur Scala Combinators
object FormulaParser extends JavaTokenParsers {
def apply(input: String) = parseAll(formula, input)
// ...
val formula: Parser[Formula] =
comparison | comparable | concatenable | term | factor
}
J'ai besoin d'analyser une autre langue qui peut contenir des formules. Disons que je dois analyser quelque chose comme X < formula
. Malheureusement, je ne peux pas réutiliser FormulaParser.formula
dans mon nouvel analyseur:
object ConditionParser extends JavaTokenParsers {
def apply(input: String) = parseAll(condition, input)
// ...
val condition: Parser[Condition] =
"X" ~ ("<=" | "<") ~ FormulaParser.formula ^^ { ... } // doesn't work
}
parce que l'analyseur sur le côté gauche de ~
est une instance de ConditionParser.Parser
, de sorte que sa méthode ~
attend quelque chose avec ce même type, pas quelque chose de type FormulaParser.Parser
.
L'intérêt d'utiliser des combinateurs d'analyseurs est de combiner des parseurs! Il me semble idiot que ma première tentative n'a pas fonctionné, bien que je comprenne pourquoi cela arrive (nous réutilisons des parseurs de base en prolongeant un trait de base).
Existe-t-il un moyen simple de combiner des analyseurs définis dans différents types?
Merci! J'ai fini par créer un trait 'BaseParsers' et avoir les deux parseurs en hériter. –