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
)。所以,这个答案确实解决了我的问题。谢谢:)