2014-02-27 74 views
0

我有以下的語法使用GETALL(...):如何在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,第二個是Foreach node in GraphA Exists node1 in GraphB,它是2個量詞)。任何想法如何我可以實現這一目標?

回答

1

formulaMatches每個元素將是一個ParseTreeMatch對象,你可以用它來獲得的ParseTree對應於你的模式<formula>佔位符。該解析樹將是一個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... 
} 
+0

嗯,當我試圖區分一個'ParseTreeMatch'要麼'FormulaContext'或'ParseRuleContext'我結束了'不兼容的類型:ParseTreeMatch不能轉換到ParserRuleContex'和'不兼容的類型:ParseTreeMatch不能轉換爲FormulaContext' – Wosh

+0

還有一個問題:我怎麼知道我是否用'ParseInterpreter'解析? – Wosh

+0

我更新了我的帖子以糾正「ParseTreeMatch」的使用。對於這樣一個微不足道的表達式,你應該使用XPath表達式'// formula'而不是模式,但是無論哪種方式都可以。如果您在代碼中使用「ParserInterpreter」,則使用「ParserInterpreter」。 –