簡體   English   中英

如何在ParseTreeMatch ANTLR4上使用getAll(…)

[英]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 您可以使用FormulaContextquantifier()方法來獲取其具有的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM