左递归消除

时间:2011-02-14 15:36:38

标签: compiler-construction grammar context-free-grammar

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

我将使用这个语法:

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

i = 1 j = 1 时,我们正在考虑替换 A - >形式的所有作品A

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

所以,当我看到 A - >匹配的,我应该用

替换它
A -> A a a | A B C a a | B C a | D D a  

我肯定是错的

当你用生产本身取代产品时,有没有人能指出我如何更换产品?

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

非常感谢任何帮助

[更新]尽可能接近原始的希腊符号。而且,我是否可能在错误的方向上接近这一点。当 i = 1 j = 1 时,A j - > A | A B C | B C | D D,但我应该使用A j - > B C | D D. 如果是这样,我会得到:

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

因为那将消除该生产中的递归。这是一个更好的方向吗?

1 个答案:

答案 0 :(得分:2)

这是食谱:

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

应转换为:

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

那是:

  1. 用递归在右侧的新作品替换递归作品。使用新的非终端符号。
  2. 将新右侧的作品添加到新的非终端。
  3. 将新的非终端符号附加到非递归作品的右侧。
  4. 对于你的语法:

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

    你会得到:

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