2017-04-12 88 views
0

我一直在剽竊我的ANTLR4語法,試圖消除所有歧義,一次解決詞法分析規則錯誤。我似乎沒有做任何事情來解決問題。特別爲這些詞法規則,給我同樣的錯誤如下:ANTLR4缺少規則定義

Identifier: Letter (Letter | Digit | Und)+; 
Keyword : Letter+; 
Param: Number | Identifier; 
Statement: Keyword Lpr Param+ Rpr; 
Block: Lbc Statement+ Rbc; 

正如你可能已經注意到,一個令牌他們的共同點是都信。這和其他標記被定義爲:

fragment Digit: '0'..'9'; 
fragment Letter: ('A'..'Z'); 
Und: '_'; 
Lpr: '('; 
Rpr: ')'; 

我怎麼也找不到這可能引起歧義,除非ANTLR不允許有可能的結果相同多個定義。

回答

0

ANTLR只有(真的)與明確的語法一起工作。某些左遞歸是允許的,並且謂詞和詞法分析器模式可用於處理/避免歧義。

ANTLR將會,但是,allow for multiple definition with potentially identical outcomes

它通過選擇第一個這樣的衝突規則來做到這一點。其餘的衝突規則是陰影的,這意味着對於所有實際目的而言,它們都不存在。幾乎可以肯定的是,一個非常不理想的結果。

+0

謝謝你爲我清理。不幸的是,這意味着我最初的問題仍然存在什麼可能導致所有這些規則拋出同樣的錯誤? –

+0

最終依賴於'Keyword'的所有規則都會被完全隱藏,並且會失敗並顯示相同的錯誤('Number'似乎沒有被定義)。只是切換「標識符」和「關鍵字」的順序將不起作用(所有隻包含字母的標識符將作爲關鍵字使用)。通常情況下,關鍵字將被顯式指定,然後是catchall規則,例如「標識符」規則;這意味着任何沒有明確指定爲關鍵字的「Letter +」都是標識符。 – GRosenberg

+0

我現在明白了。問題是我試圖定義一個允許定義其他關鍵字的語法(關鍵字基本上就是函數名),所以我試圖只在詞法分析器中定義語法並在解析器中定義語義。 –