我在學習ANTLR4,我很困惑。對於類似Java語言,我想添加規則狀的部件鏈接,類似的東西構造:爲什麼這是左遞歸的,我該如何解決它?
expr1.MethodCall(expr2).MethodCall(expr3);
我得到一個錯誤,說我的兩個規則是相互左遞歸:
expression
: literal
| variableReference
| LPAREN expression RPAREN
| statementExpression
| memberAccess
;
memberAccess: expression DOT (methodCall | fieldReference);
我想我明白了爲什麼上述規則的組合被認爲是左遞歸:因爲memberAccess
是expression
和memberAccess
開始與expression
候選人。
但是,我的理解打破了,當我看到(通過看the Java example),如果我只是移動的memberAccess
的內容expression
,我沒有從ANTLR4錯誤(即使它仍然不解析我想要什麼,似乎陷入一個循環):
expression
: literal
| variableReference
| LPAREN expression RPAREN
| statementExpression
| expression DOT (methodCall | fieldReference)
;
- 爲什麼是左遞歸的第一個例子,但第二個是不是?
- 我需要做些什麼才能真正解析初始行?
我明白了。但是,解析我給出的例子的方式是什麼?我所嘗試的一切似乎都是相互左遞歸的,掛起(無限循環,也許?)或解析不正確。 – 2015-04-01 16:23:09
您是否嘗試使用第二種解決方案重新排列備選方案? statementExpression的規則代碼是什麼。它是否與最後一行顯然不一致?然而,我無法想象哪種語法讓語法分析器掛起......(ANTLR每步至少消耗一個字符,所以除非發生錯誤,否則應該達到最終並停止)。 – CoronA 2015-04-01 16:29:34
我嘗試過重新編碼並儘可能擴展。我不能肯定地說我已經嘗試了所有的排列組合,但是當我包含一個直接的左遞歸規則時,我的測試平臺的樹根本不會出現。因此,在'expression'中有'DOT IDENTIFIER'作爲替代的東西不會產生任何東西。如果我刪除它,我會得到一個輸出(當然,但不是我想要的)。 – 2015-04-03 14:46:16