質問

次の文法を持っています:

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...
}
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top