我有一个在大多数情况下都有效的简单语法,但在一个地方它会报告错误,我认为它不应该,因为它可以使用回溯来解决。
这是有问题的部分。
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)+;
这是简化版本,对象更复杂(它可以是其他命令、原始值等的结果,但那部分工作正常)。问题在于message_chain
,在第一个替代方案中。对于像这样的输入,obj unary1 unary2
它工作正常,但对于像这样的输入,它obj unary1 unary2 keyword1:obj2
会尝试匹配keyword1
为一元消息并在到达时失败:
。我认为这种情况解析器会回溯并确定存在:
并识别出这是关键字消息。
如果我将关键字消息设为非可选,它可以正常工作,但我需要关键字消息是可选的。
如果关键字消息在第二个备选方案(binary_message)和第三个备选方案(只是关键字消息)中,解析器会找到它。所以这样的事情会产生很好的结果:1 + 2 + 3 Keyword1:Value
我错过了什么?回溯在选项中设置为 true,并且在相同语法的其他情况下可以正常工作。
谢谢。