0

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

我已经尝试使用许多解决方法,但我一直无法找到适合的解决方法。

4

1 回答 1

2

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

更多细节在这里那里

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

condition = symbol { "AND" symbol }* ;
于 2016-12-28T10:15:25.083 回答