补充:消除epsilon产生式等

开学步入正轨,更新的速度肯定要变慢了ヾ|≧_≦|〃
有同学让我添加电路状态转换图的有前置条件和后置条件的情况,其实在上篇文章中已经表述了电路状态转换图的意义:电路状态转换图描述的是从某个起点进入,不管经过怎样的变换,如果要满足题目规定的条件则必定会从某个终点出去这样的情形,起点和终点并不重要,而前置条件和后置条件都是针对起点和终点的,并不会对电路状态转换图有什么影响。
补充:消除epsilon产生式等_第1张图片
上图表示的就是a,b,c都为偶数,前置条件为以a或b开头。

消除 ϵ 产生式

1. Find out all ϵ productions. 用迭代法找出所有的 ϵ 产生式

V0’为所有直接推出 ϵ 的集合
V0”为V0’与能推出V0’元素的交集…
当某一次迭代的集合和上次迭代的集合相等时迭代结束。

Example: S->ABC, A->aA| ϵ , B->bB| ϵ , C->cC| ϵ
V0’ = {A,B,C}
V0” = {S,A,B,C}
V0”’ = {S,A,B,C}
End

这一步上课讲的有点模糊,老师的意思是这样,如果A->other| ϵ ,那么在右边能推出A的表达式里就替换为两种情况:A和空。例如,如果S->A, A->aA| ϵ ,那么我们将S替换为两种情况,S->A或S-> ϵ ,在上面的S->ABC里,每一个ABC都能有空的情况出现,那么对应我们应该替换为2*2*2=8个式子:

S->ABC
S->BC
S->AC
S->AB
S->A
S->B
S->C
S-> ϵ

3. Eliminate all ϵ -productions except for S-> ϵ :删除 ϵ 产生式

删掉在替换后的所有 ϵ 产生式,S-> ϵ 的处理会在后面提及。

4. S-> ϵ 的处理

将S-> ϵ 替换为S’->S, S’-> ϵ

实际使用中的简化

在实际操作中,除了要注意S-> ϵ 的情况,其他情况都非常好处理。首先直接删除生.成 ϵ 的式子。比如A->aA| ϵ 变成A->aA,然后找到所有一次间接的 ϵ 产生式,比如B->bA,添加A为空的情况,如B->bA|b,如果没有S-> ϵ 就已经可以了。

你可能感兴趣的:(编译原理)