2013-04-22 61 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