如何处理Treetop左递归

时间:2011-05-25 02:59:01

标签: ruby abstract-syntax-tree treetop left-recursion

我有一个grammar file用于我正在尝试构建的新通用编程语言。我正在尝试使语言健壮且自然地使用(它受到Ruby等人的很大启发),并且在这样做时我引入了一些左递归规则。

我看过一些似乎表明以下左递归规则的例子:

rule l_recurse
  l_recurse / 'something else'
end

可以通过将其更改为:

来进行非左递归
rule r_recurse
  'something else' / r_recurse
end

对我来说,这看起来会有一个不同的问题,但仍会失败。我是对的,还是这个“只是工作”?

我正在尝试(查找和)消除的特定左递归在此grammar file中找到。我不确定哪些规则受到影响,但至少some were pointed out有左递归。 (顺便说一句,我试图通过收紧范围规则来消除他提到的具体范围问题。)

1 个答案:

答案 0 :(得分:4)

具体案例

rule l_recurse
  l_recurse / 'something else'
end

简化为

rule l_recurse
   'something_else'
end

(右递归规则也是如此)所以我需要查看您的具体示例以找出您想知道的内容。 this question的答案给出了左递归消除的一般规则。

一个典型的易于删除的左递归案例是列表:

rule l_list
    item | l_list ',' item
end

可以改为右递归

rule r_list
    item r_tail?
end

rule r_tail
    ',' r_list
end

(这是一般递归消除的特例)。