2016-10-20 4 views
2

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?

Répondre

3

Afin de réutiliser les analyseurs syntaxiques, vous devez utiliser l'héritage. Donc, si vous faites FormulaParsers une classe ou un trait, ConditionParser peut en hériter et réutiliser ses parseurs.

C'est également la manière dont vous réutilisez déjà les analyseurs syntaxiques définis dans JavaTokenParsers.

+0

Merci! J'ai fini par créer un trait 'BaseParsers' et avoir les deux parseurs en hériter. –