ANTLR报告错误,我认为它应该能够通过回溯解决输入问题

ANTLR报告错误,我认为它应该能够通过回溯解决输入问题,antlr,grammar,backtracking,Antlr,Grammar,Backtracking,我有一个简单的语法,它在大多数情况下都有效,但有一个地方它报告了错误,我认为它不应该,因为它可以通过回溯来解决 这里是有问题的部分 command: object message_chain; object: ID; message_chain: unary_message_chain keyword_message? | binary_message_chain keyword_message? | keyword_message; unar

我有一个简单的语法,它在大多数情况下都有效,但有一个地方它报告了错误,我认为它不应该,因为它可以通过回溯来解决

这里是有问题的部分

command: object message_chain;
object: ID;
message_chain: unary_message_chain keyword_message?
             | binary_message_chain keyword_message?
             | keyword_message;
unary_message_chain: unary_message+;
binary_message_chain: binary_message+;
unary_message: ID;
binary_message: BINARY_OPERATOR object;
keyword_message: (ID ':' object)+;
这是简化版,对象更复杂(它可能是其他命令、原始值等的结果,但该部分工作正常)。问题出现在第一个备选方案的
消息链中。对于像
obj-unary1-unary2
这样的输入,它可以正常工作,但是对于像
obj-unary1-unary2关键字1:obj2
这样的输入,它试图将
keyword1
作为一元消息进行匹配,当到达
时失败。我认为,在这种情况下,解析器会回溯并指出存在
,并识别出这就是关键字消息

如果我把关键字消息设置为非可选的,它可以正常工作,但我需要关键字消息设置为可选的

若关键字消息位于第二个备选方案(二进制消息)和第三个备选方案(仅为关键字消息),解析器将查找关键字消息。所以类似这样的东西会给出很好的结果:
1+2+3关键字1:Value

我错过了什么?在选项中,回溯设置为true,在相同语法的其他情况下,回溯效果良好


谢谢。

这实际上不是PEG式回溯的情况,因为一旦失败,它只会返回到未完成的派生中的决策点。对于输入
obj-unary1-unary2关键字1:obj2
,使用单个令牌前瞻,
关键字1
可被
一元消息链
使用。故障可能不会发生在
关键字\u message
之前,下一个要尝试的是消息链的第二个备选方案,即
二进制消息链
,因此缺少正确的解析


但是,由于该语法是LL(2),因此应该可以扩展前瞻性,以避免从
一元消息链中使用
关键字1
。您是否尝试过在没有回溯的情况下显式设置
k=2
。我的其余语法需要回溯,所以我无法关闭它(antlr不会编译语法),但你的回答启发我重做语法,我做到了。现在,它不需要回溯,问题的问题也就不存在了(我没有明确地在代码中的任何地方设置
k
)。所以,这个答案确实解决了我的问题。谢谢:)