我正在尝试改进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");}
;
答案 0 :(得分:1)
您应该放松defs
中的句法谓词,而不是将{1}添加到a
。
defs
: (A B) => a
| b
;
这将使解析器选择第一个替代方案,并仅基于两个符号a
输入A B
规则。