上下文无关语法:当 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
的唯一用途是 S
和 B
本身,因此我们继续添加产生式:
- S → λ
- B → B(通过删除 B → B B 中的第一个 B);
- B → B(去掉B中的第二个B → B B);
- B → λ(通过从我们刚刚添加的产生式 B → B 中删除 B。)
但是,none 的 B 新作品实际上已添加到剧集中。递归单元产生式 (B → B) 被简单地丢弃,并且 B → λ 已经存在。
如果我们为起始符号以外的符号添加新的 λ 产生式,我们需要将该符号标记为需要 λ 消除(或递归调用消除过程)。但这不会发生在这里,因为增加的产量已经存在。
一旦我们完成了 λ 消除,我们就消除了所有
λ 产生式,除了开始符号。
在实践中,可以进行一些优化,但这样算法可能更清晰。
我有这个上下文无关语法,我正在尝试删除非终端 B 中的 lambda。如果不在 B 中递归地使用 lambda,我该如何解决这个问题?
S -> B
A -> λ | aAb
B -> BB | λ | C
C -> A | aCc
在 λ 消元过程中,相同的产生式可能会被添加到产生式的集合中两次或更多次。因为它是一个集合,它最多只能有一个元素,所以添加一个已经存在的元素没有任何作用。右侧为空的事实没有任何改变。
因此,为了 λ-消除 B
,我们需要找到 B
的所有实例,并添加删除该用途的新产品。 B
的唯一用途是 S
和 B
本身,因此我们继续添加产生式:
- S → λ
- B → B(通过删除 B → B B 中的第一个 B);
- B → B(去掉B中的第二个B → B B);
- B → λ(通过从我们刚刚添加的产生式 B → B 中删除 B。)
但是,none 的 B 新作品实际上已添加到剧集中。递归单元产生式 (B → B) 被简单地丢弃,并且 B → λ 已经存在。
如果我们为起始符号以外的符号添加新的 λ 产生式,我们需要将该符号标记为需要 λ 消除(或递归调用消除过程)。但这不会发生在这里,因为增加的产量已经存在。
一旦我们完成了 λ 消除,我们就消除了所有 λ 产生式,除了开始符号。
在实践中,可以进行一些优化,但这样算法可能更清晰。