[英]How to use getAll(…) on ParseTreeMatch 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
中的Exists node in GraphA
第二個是Foreach node in GraphA Exists node1 in GraphB
是2個數量詞。 知道我該如何實現嗎?
formulaMatches
每個元素都是一個ParseTreeMatch
對象,您可以使用該對象來獲取與ParseTree
中<formula>
占位符相對應的ParseTree
。 該解析樹將是FormulaContext
。 您可以使用FormulaContext
的quantifier()
方法來獲取其具有的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...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.