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 ?

Était-ce utile?

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...
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top