我试图用grako来描述一个简单的左递归语法,但我很难这样做。
右递归确实工作,没有任何问题:
symbol = /[a-z]/ ;
condition = symbol "AND" condition | symbol ;
start = condition $ ;根据我发现的所有例子,左递归应该这样描述:
symbol = /[a-z]/ ;
condition = condition "AND" symbol | symbol ;
start = condition $ ;然而,它不适用于以下规则:
a AND b AND c我知道这个错误:
grako.exceptions.FailedParse: srecur(1:3) Expecting end of text. :
a AND b AND c
^
start我现在了解的是,规则的第一个字符匹配的是symbol,而不是condition "AND" symbol,所以grako想要使用它。但是我的开始规则强制所有的字符都被消耗掉了。
我已经尝试了许多解决办法,但我一直未能找到一个合适的。
发布于 2016-12-28 10:15:25
实际上,Grako是一个PEG解析器。这些解析器具有无法轻松处理左递归的隐式属性。
更多细节,这里和那里。
为了满足我的需要,我用这样的表达方式解决了我的问题:
condition = symbol { "AND" symbol }* ;https://stackoverflow.com/questions/41261511
复制相似问题