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
;

问题是,例如,如果您有标记“AB D”。您收到的错误消息来自“b”规则。我希望错误消息来自“a”规则。意思是如果“A B”匹配,那么如果“c”不匹配,我想要一个错误。

我想也许你可以这样做

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

1 回答 1

1

您应该放宽句法谓词 indefs而不是在a.

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

这将导致解析器选择第一个备选方案并a仅根据两个符号输入规则A B

于 2013-04-22T22:38:42.200 回答