【发布时间】:2011-05-25 02:59:00
【问题描述】:
我有一个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 有左递归。 (顺便说一句,我试图通过收紧范围规则来消除他提到的特定范围问题。)
【问题讨论】:
-
为什么要去掉左递归。对于 LALR(1) 解析器,我认为左递归是您想要尝试的。我打算将此作为答案,但如果您真的想知道如何将立即左递归(您的示例)转换为右递归,请查看左递归的维基百科页面。它将向您展示如何将语法转换为右递归以及对您的语言有什么影响。
-
我想删除左递归,因为我使用的语法库 (Treetop) 不允许左递归。我可以使用 Ruby 中的 LALR 解析器吗?
-
Treetop 不是 LALR(1) 解析器,而是递归下降解析器。
标签: ruby abstract-syntax-tree treetop left-recursion