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
.
は2つのformulaMatches
を返します。
現在、数式の数量相の数になるようにformulaMatches
を使用したい(あなたが1つ以上のことを許可しています)。私が必要な方法はformulaMatches.get(i).getAll("quantifier")
であると考えましたが、これにより0の一致(最初の式の量子部分がExists node in GraphA
と2つの数量相)であると思います。私がこれを達成できる方法はどれかの考えですか?
解決
formulaMatches
の各要素は、Pantermsの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...
}
. 所属していません StackOverflow