赞
踩
空产生式可能会出现移进-规约冲突和规约-规约冲突,消除方法如下:
从以下去除空产生式:
- S → ASA | aB | b
- A → B
- B → b | ∈
我们首先消除 B -> ε
- S -> ASA | aB | b | a
- A -> B| b | ε
- B -> b
现在消除 A -> ε
- S→ASA | aB | b | a | SA | AS | S
- A → B| b
- B → b
基本思想就是将空产生式不断上移,那么下面的空产生式就没有了,然后到最后(或者规约-规约冲突的地方)进行空产生式的排列组合即可。
每日小常识:
能够在编写的过程中发现两种冲突吗?
起始两种问题的本质都是往下走的时候你不知道走哪一个。
对于bison来说,它用的是二义性的文法,它会将你的文法拆开,实际上,一条文法不等同于一个状态机的集合对吧,状态机的切割是自动的,无法预知的,它可能会将一部分拆开,将另一部分合并,大致的推断可以按照各种文法的相同部分合并,相同文法集的不同部分拆开来算,大致就是这样的。如果在不同地方出现选择不清的问题,就是规约-规约冲突和移进-规约冲突。
而空产生式,是非常容易产生冲突的地方,而且还不容易察觉,察觉到还不容易改,所以就是空产生式必须死的原因。
一般来说,规约-规约冲突不是致命冲突,往往可以运行,但是移进-规约冲突往往是致命冲突,是文法上的致命缺点。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。