如何在ParseTreeMatch ANTLR4上使用getAll(...)

时间:2014-02-27 18:40:42

标签: java parsing antlr4

我有以下语法:

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 
;
.....

解析简单的一阶逻辑公式。所以使用以下代码:

String formulaPatternString = "<formula>";
ParseTreePattern formulaPattern = parser.compileParseTreePattern(formulaPatternString, GraphParser.RULE_formula);
List<ParseTreeMatch> formulaMatches = formulaPattern.findAll(tree, "//formula");

我找到了输入中找到的公式数。例如

Exists node in GraphA -> node.color='red' 

返回一个formulaMatch

Exists node in GraphA -> node.color='red' AND Foreach node in GraphA Exists node1 in GraphB -> node.color=node1.color

返回两个formulaMatches。 现在我想使用formulaMatches来结束公式中的量词数量(你可以看到我允许一个或多个)。我认为我需要的方法是formulaMatches.get(i).getAll("quantifier"),但这会产生0个匹配(在我的例子中,第一个公式中的量词部分是Exists node in GraphA,而第二个公式中的量词部分是Foreach node in GraphA Exists node1 in GraphB量词)。知道如何实现这个目标吗?

1 个答案:

答案 0 :(得分:1)

formulaMatches的每个元素都是ParseTreeMatch对象,您可以使用它来获取与您的模式中ParseTree占位符相对应的<formula>。该解析树将是FormulaContext。您可以使用quantifier() FormulaContext方法获取QuantifierContext个孩子的数量:

for (ParseTreeMatch match : formulaMatches) {
  int quantifierCount = ((FormulaContext)match.get("formula")).quantifier().size();
}

注意:如果您使用ParserInterpreter进行解析,则您的上下文对象将是InterpreterRuleContext而不是FormulaContext。在这种情况下,您需要调用以下内容:

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...
}