我有以下语法:
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
量词)。知道如何实现这个目标吗?
答案 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...
}