Comment utiliser getAll(…) sur ParseTreeMatch ANTLR4
Question
J'ai la grammaire suivante :
input
:
formula EOF
;
formula
:
TRUE
| FALSE
| formula AND formula
| formula OR formula
| (quantifier)+ ST condition
;
condition
:
atom EQUALS QUOTE? (assignment | atom) QUOTE?
;
quantifier
:
(FOREACH | EXISTS) variable IN domain
;
.....
qui analyse des formules logiques simples du premier ordre.Donc avec le code suivant :
String formulaPatternString = "<formula>";
ParseTreePattern formulaPattern = parser.compileParseTreePattern(formulaPatternString, GraphParser.RULE_formula);
List<ParseTreeMatch> formulaMatches = formulaPattern.findAll(tree, "//formula");
Je trouve le nombre de formules trouvées dans ma saisie.Par exemple
Exists node in GraphA -> node.color='red'
en renvoie un formulaMatch
et
Exists node in GraphA -> node.color='red' AND Foreach node in GraphA Exists node1 in GraphB -> node.color=node1.color
renvoie deux formulaMatches
.En ce moment, je veux utiliser le formulaMatches
afin d'obtenir le nombre de quantificateurs dans la formule (comme vous pouvez le voir, j'en autorise un ou plusieurs).Je pensais que la méthode dont j'avais besoin était formulaMatches.get(i).getAll("quantifier")
mais cela donne 0 correspondance (dans mon cas, la partie quantificateur dans la première formule est Exists node in GraphA
et dans le second c'est Foreach node in GraphA Exists node1 in GraphB
ce qui fait 2 quantificateurs).Avez-vous une idée de la façon dont je peux y parvenir ?
La solution
Chaque élément de formulaMatches
va etre un ParseTreeMatch
objet que vous pouvez utiliser pour obtenir le ParseTree
correspondant à la <formula>
espace réservé dans votre modèle.Cet arbre d'analyse sera un FormulaContext
.Vous pouvez utiliser le quantifier()
méthode de FormulaContext
pour obtenir le numéro de QuantifierContext
il a des enfants :
for (ParseTreeMatch match : formulaMatches) {
int quantifierCount = ((FormulaContext)match.get("formula")).quantifier().size();
}
Note:si vous analysez en utilisant ParserInterpreter
, vos objets contextuels seront InterpreterRuleContext
au lieu de FormulaContext
.Dans ce cas, vous souhaiterez appeler ce qui suit :
for (ParseTreeMatch match : formulaMatches) {
ParserRuleContext formulaContext = (FormulaContext)match.get("formula");
int quantifierCount = 0;
for (int i = 0; i < formulaContext.getChildCount(); i++) {
if (formulaContext.getChild(i) instanceof RuleNode
&& ((RuleNode)formulaContext.getChild(i)).getRuleContext().getRuleIndex()
== RULE_quantifier)
{
quantifierCount++;
}
}
// quantifierCount is accurate here...
}