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



我有以下语法:

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 是 2 个量词)。知道我如何实现这一目标吗?

formulaMatches的每个元素都将是一个ParseTreeMatch对象,可用于获取与模式中的<formula>占位符对应的ParseTree。该解析树将是一个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...
}

相关内容

  • 没有找到相关文章

最新更新