compiler-construction - 左递归消除

标签 compiler-construction grammar context-free-grammar

我试图通过消除间接递归然后直接递归来消除 CFG 中的左递归,如下所示 algorithm显示。

我将使用这个语法:

A = A a | A B C | B C | D D

i = 1j = 1时,我们正在考虑将A -> A r形式的所有产生式替换为:

A -> δ1 γ | δ2 γ | ..| δk γ

因此,当我查看匹配的 A -> A a 时,我应该将其替换为

A -> A a a | A B C a a | B C a | D D a  

我确信这是错误的

当您用产品本身替换产品时,有人可以为我指明如何替换产品的正确方向吗?

注意:另外,我只坚持第一条规则,因此为了简单起见,省略了其他规则

任何帮助将不胜感激

[更新]尽可能接近原始希腊符号。另外,我是否可能朝错误的方向接近这个问题?当i=1j=1时,Aj -> A a | ABC | BC | D D,但是我应该使用 Aj -> B C | DD 如果是这样的话我会得到:

A -> B C A | B C B C | D D A | D D B C | B C | D D

这样就可以消除该产生式中的递归。这是一个更好的方向吗?

最佳答案

这是食谱:

A → Aα1 | ... | Aαm | β1 | ... | βn

应转换为:

A → β1 A' | ... | βn A'
A' → α1 A' | ... | αm A' | ε

即:

  1. 将递归产生式替换为递归位于右侧的新产生式。为此使用新的非终结符。
  2. 将右侧为空的产生式添加到新的非终结符。
  3. 将新的非终结符号附加到非递归产生式的右侧。

对于你的语法:

A = A a | A B C | B C | D D

您将获得:

A  = B C A' | D D A'
A' = a A' | B C A' | ε

关于compiler-construction - 左递归消除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4994036/

相关文章:

c++ - gcc的转储文件.c.135r.jump中的静态方法在哪里

grammar - 正则语言和正则文法的区别

random - 有什么工具可以根据语言语法随机生成源代码吗?

iphone - 有没有办法在 Xcode 4.1 中使用 LLVM 3?

php - 用于创建 php 扩展的 VC 编译器版本

c++ - 为什么可变参数类模板最多只能有一个参数包?

grammar - 如何创建元语法?

parsing - 是否有可能有一个语法,其中 "keyword"也可以被视为 "non-keyword"?

parsing - 使用 Parsec 解析正则表达式

context-free-grammar - 构建上下文无关语法