【问题标题】:How to deal with Treetop left-recursion如何处理 Treetop 左递归
【发布时间】: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


【解决方案1】:

特殊情况

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

(这是一般递归消除的一种特殊情况)。

【讨论】:

  • 请原谅我的无知,但是您的示例如何解决问题?是因为 r_tail 是可选的吗?如果左侧是可选的怎么办?还能用吗?
  • @Raving Genius:我需要比您提供的更具体的东西,因为您提供的东西根本不需要递归(如我的回答中所述)。另一个只是删除左递归的一个例子。你能包括它应该匹配的文本示例吗?
  • @Raving Genius:更具体地说,我的示例,r_tail 是可选的,使其成为左递归的有效变体(它相当于 r_tail 匹配空字符串的规则)。
  • 谢谢。这确实回答了我的问题。
猜你喜欢
  • 2013-08-03
  • 2014-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-26
  • 2012-05-02
  • 2017-03-26
  • 1970-01-01
相关资源
最近更新 更多