Compiler construction 有人能告诉我如何使用规则从这个语法中消除左递归吗?

Compiler construction 有人能告诉我如何使用规则从这个语法中消除左递归吗?,compiler-construction,context-free-grammar,Compiler Construction,Context Free Grammar,我正在尝试从语法中删除左递归,我有时可以这样做。我显然不知道规则,因为我只知道如何通过反复试验来做到这一点。我看到的规则如下: 在这个特殊的例子中,我知道我可以先从S规则中删除立即左递归,然后得到: S --> XSS' | aS' S' --> XS' | SbS' | epsilon X --> Xb | Sa | b 然后,从这里我可以将S产品合并到X产品中,以获得: X --> Xb | XSS' | aS'a | b 然后我可以从那里移除立即左递归,得到

我正在尝试从语法中删除左递归,我有时可以这样做。我显然不知道规则,因为我只知道如何通过反复试验来做到这一点。我看到的规则如下:

在这个特殊的例子中,我知道我可以先从S规则中删除立即左递归,然后得到:

S --> XSS' | aS'
S' --> XS' | SbS' | epsilon
X --> Xb | Sa | b 
然后,从这里我可以将S产品合并到X产品中,以获得:

 X --> Xb | XSS' | aS'a | b
然后我可以从那里移除立即左递归,得到最终的答案。但是,有人能给我解释一下规则吗,因为我没有遵循规则来得出最终答案。我有点幸运。我需要知道如何从任何给定的语法中删除左递归。任何帮助都将不胜感激。多谢各位

  • 使用左递归查找所有非终结符A产品的主体并删除它们
  • 将它们添加到新的非端子a'
  • 对于每个非终端A'产品:
    • 删除第一个递归调用A
    • 在末尾添加一个“A”呼叫
  • 将ε乘积添加到非终端A'
  • 对于所有剩余的非终端生产A,在末尾添加一个'
  • 例如: A->Ab | Bb | A

  • A->Bb | A
  • A'->Ab
  • A'->bA'
  • A'->bA'| e
  • A->BbA'| aA'
  • 结果: A->BbA'| aA' A'->bA'| e

     X --> Xb | XSS' | aS'a | b