我有以下语法:
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...
}