2015-04-01 95 views
0

我在學習ANTLR4,我很困惑。對於類似Java語言,我想添加規則狀的部件鏈接,類似的東西構造:爲什麼這是左遞歸的,我該如何解決它?

expr1.MethodCall(expr2).MethodCall(expr3); 

我得到一個錯誤,說我的兩個規則是相互左遞歸:

expression 
    : literal 
    | variableReference 
    | LPAREN expression RPAREN 
    | statementExpression 
    | memberAccess 
    ; 

memberAccess: expression DOT (methodCall | fieldReference); 

我想我明白了爲什麼上述規則的組合被認爲是左遞歸:因爲memberAccessexpressionmemberAccess開始與expression候選人。

但是,我的理解打破了,當我看到(通過看the Java example),如果我只是移動的memberAccess的內容expression,我沒有從ANTLR4錯誤(即使它仍然不解析我想要什麼,似乎陷入一個循環):

expression 
    : literal 
    | variableReference 
    | LPAREN expression RPAREN 
    | statementExpression 
    | expression DOT (methodCall | fieldReference) 
    ; 
  1. 爲什麼是左遞歸的第一個例子,但第二個是不是?
  2. 我需要做些什麼才能真正解析初始行?

回答

1

第二種是左遞歸但不相互左遞歸。 ANTLR4可以用內置算法消除左遞歸規則。它不能消除相互左的遞歸規則。可能存在算法,但這很難保留動作和語義謂詞。

+0

我明白了。但是,解析我給出的例子的方式是什麼?我所嘗試的一切似乎都是相互左遞歸的,掛起(無限循環,也許?)或解析不正確。 – 2015-04-01 16:23:09

+0

您是否嘗試使用第二種解決方案重新排列備選方案? statementExpression的規則代碼是什麼。它是否與最後一行顯然不一致?然而,我無法想象哪種語法讓語法分析器掛起......(ANTLR每步至少消耗一個字符,所以除非發生錯誤,否則應該達到最終並停止)。 – CoronA 2015-04-01 16:29:34

+0

我嘗試過重新編碼並儘可能擴展。我不能肯定地說我已經嘗試了所有的排列組合,但是當我包含一個直接的左遞歸規則時,我的測試平臺的樹根本不會出現。因此,在'expression'中有'DOT IDENTIFIER'作爲替代的東西不會產生任何東西。如果我刪除它,我會得到一個輸出(當然,但不是我想要的)。 – 2015-04-03 14:46:16

0

由於某種原因,當我的語法有左遞歸時,ANTLRWorks 2沒有響應,導致我(錯誤地)認爲我的語法錯誤。

從命令行編譯和測試發現,具有直接左遞歸的版本實際上編譯和正確解析。

(我在這裏留下以防其他人被IDE的行爲困惑)

相關問題