上下文无关语法:当 lambda 离开递归时,如何在我的非终端中终止它?

Context Free Grammars : How do I terminate the lambda in my non-terminal when it has left recursion?

我有这个上下文无关语法,我正在尝试删除非终端 B 中的 lambda。如果不在 B 中递归地使用 lambda,我该如何解决这个问题?

S -> B
A -> λ | aAb
B -> BB | λ | C
C -> A | aCc

在 λ 消元过程中,相同的产生式可能会被添加到产生式的集合中两次或更多次。因为它是一个集合,它最多只能有一个元素,所以添加一个已经存在的元素没有任何作用。右侧为空的事实没有任何改变。

因此,为了 λ-消除 B,我们需要找到 B 的所有实例,并添加删除该用途的新产品。 B 的唯一用途是 SB 本身,因此我们继续添加产生式:

  • S → λ
  • B → B(通过删除 B → B B 中的第一个 B);
  • B → B(去掉B中的第二个B → B B);
  • B → λ(通过从我们刚刚添加的产生式 B → B 中删除 B。)

但是,none 的 B 新作品实际上已添加到剧集中。递归单元产生式 (B → B) 被简单地丢弃,并且 B → λ 已经存在。

如果我们为起始符号以外的符号添加新的 λ 产生式,我们需要将该符号标记为需要 λ 消除(或递归调用消除过程)。但这不会发生在这里,因为增加的产量已经存在。

一旦我们完成了 λ 消除,我们就消除了所有 λ 产生式,除了开始符号。

在实践中,可以进行一些优化,但这样算法可能更清晰。