6

我有一个我正在尝试构建的新通用编程语言的语法文件。我试图使该语言健壮且易于使用(它深受 Ruby 等的启发),并且在此过程中我引入了一些左递归规则。

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

rule l_recurse
  l_recurse / 'something else'
end

可以通过将其更改为非左递归:

rule r_recurse
  'something else' / r_recurse
end

对我来说,这看起来会有不同的问题并且仍然会失败。我是对的,还是这“行得通”?

我试图(查找和)消除的特定左递归可在此语法文件中找到。我不确定哪些规则会受到影响,但至少有一些规则被指出具有左递归。(顺便说一句,我试图通过收紧范围规则来消除他提到的特定范围问题。)

4

1 回答 1

4

特殊情况

rule l_recurse
  l_recurse / 'something else'
end

简化为

rule l_recurse
   'something_else'
end

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

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

rule l_list
    item | l_list ',' item
end

并且可以改为右递归

rule r_list
    item r_tail?
end

rule r_tail
    ',' r_list
end

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

于 2011-05-25T03:19:33.943 回答