2013-04-22 62 views
0

我正在嘗試改進antlr給出的錯誤消息,並注意到句法謂詞似乎是錯誤消息的根源。改進句法謂詞錯誤消息?

這是我目前正在研究的那個。這是一個語法結構的例子。對不起,我無法提供實際的語法。但希望這可以說明這一點。

defs 
: (a) => a | b 
; 


a 
: A B c 
; 

//b is actually much further down the chain and due to ordering can't be moved up. 
b 
: A c 
; 

問題是,例如,如果您有令牌「A B D」。您收到的錯誤消息來自'b'規則。我希望錯誤消息來自'a'規則。如果「A B」匹配,意味着如果'C'不匹配,我想要一個錯誤。

我想你也許可以做到這一點

a 
: (A B) => A B c | {EmitErrorMessage("error");} 
; 

回答

1

你應該放鬆語法謂詞中defs而不是增加一個a

defs 
    : (A B) => a 
    | b 
    ; 

這將導致解析器選擇第一種選擇並進入僅基於兩個符號A Ba規則。

+0

嗯,我可以發誓我早些時候試過,它沒有奏效。雖然我現在只是嘗試過,並且它可以工作。謝謝! – Will 2013-04-22 23:13:50