我正在尝试改进 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
;
问题是,例如,如果您有标记“AB D”。您收到的错误消息来自“b”规则。我希望错误消息来自“a”规则。意思是如果“A B”匹配,那么如果“c”不匹配,我想要一个错误。
我想也许你可以这样做
a
: (A B) => A B c | {EmitErrorMessage("error");}
;