2013-08-25 103 views
0

我想解析ANTLR4(來自Java)的C#代碼。到目前爲止,我無法找到合適的語法,所以我決定寫我自己的語法。我使用了這個附錄here,但是我遇到了一個問題。問題是我有很多左遞歸規則。我試圖通過使用ANTLRWorks(antlrworks-1.5)來解決這些問題,但我只是不斷收到異常。我能手動修復其中的一部分,而不是那些像這樣的:ANTLR4 C#語法和左遞歸

multiplicative_expression: 
| unary_expression 
| multiplicative_expression '*' unary_expression 
| multiplicative_expression '/' unary_expression 
| multiplicative_expression '%' unary_expression; 

那麼,有沒有任何人能指導我爲ANTLR4一個正確的語法或幫我處理左遞歸問題。謝謝。

回答

0

左遞歸規則的形式是A - > Aa | b 的預估方法來解決這個問題是通過引入新的非終結A '和重寫規則作爲

A - > BA'

A」 - >小量| aA'(其中Epsilon是「空字符串」)

由於ANTLR是LL解析器生成器,因此無法忍受左遞歸。 然而,分辯遞歸規則都還好到ANTLR,所以我們可以編寫規則:

multiplicative_expression: 
| unary_expression 
| unary_expression '*' multiplicative_expression 
| unary_expression '/' multiplicative_expression 
| unary_expression '%' multiplicative_expression ; 
+0

ANTLR 4支持直接左遞歸。 'multiplicative_expression'規則的工作方式就是它最初的寫法。 –

1

ANTLR 4內部處理直接左遞歸。您上面發佈的規則將在ANTLR 4中無需更改即可使用。

+0

好的,謝謝@ 280Z28,但是當我嘗試從我在網上找到的這個語法[here](http://pastebin.com/7EaMPAAh)生成解析器和詞法分析器時,我得到這個錯誤[here](http:// pastebin.com/rLvLCpgq)。 – Alen