Grako 左递归

Grako left recursion

我正在尝试使用 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 想使用它。但是我的开始规则强制所有角色都被消耗了。

我已经尝试过许多变通方法,但一直找不到合适的方法。

Grako 实际上是一个 PEG 解析器。这些解析器具有无法轻松处理左递归的隐式 属性。

更多详情here and there

根据我的需要,我已经能够用这种表达方式解决我的问题了:

condition = symbol { "AND" symbol }* ;