2016-12-22 23 views
1

我試圖解析以下語法,其中Value可以是任何字符到分號,但我不能讓它正常工作:解析任何字符,直到分號ANTLR4

grammar Test; 

pragmaDirective : 'pragma' Identifier Value ';' ; 

Identifier : [a-z]+ ; 

Value : ~';'* ; 

WS : [ \t\r\n\u000C]+ -> skip ; 

當我測試一下與pragma foo bar;,我得到以下錯誤:

line 1:6 extraneous input ' ' expecting Identifier 
line 1:11 extraneous input 'bar' expecting ';' 

回答

0

試試這個:

pragmaDirective : 'pragma' Identifier .*? ';' ; 

並刪除Value規則。這應該能夠完成這項工作。

建議:定義詞法分析器您的文字規則(如'pragma'),而不是直接在解析器規則中定義它們。

+0

我最終爲pragma值定義了一個新的解析器規則。這是我第一次嘗試用ANTLR編寫解析器,我應該做一些進一步的閱讀。感謝您的推薦! –

0

價值規則太貪婪。 Lexer規則儘可能匹配,因此對於像這樣的輸入:pragma mu foo;,Value規則將匹配pragma mu foo。畢竟,這是零個或更多的字符,而不是分號。

Value不適合用作詞法分析規則。我建議你重新考慮你的方法。也許創建一個解析器規則value匹配Identifier和其他詞法分析器規則。很難在沒有看到很多「真正的」語法的情況下提出建議(您可能已經發布了一個您正在使用的語法的簡化版本)。