参考书: 编译原理(第3版) 西北工业大学出版社 第2.4节内容
试图理解书上内容,完全意识流,捏造名词,不保证叙述正确
ε-产生式:右部为空符号串的产生式,例如A→ε
题意:将ε-产生式消除,而不改变文法所定义的语言。已知如果语言中不含ε,那么可以把ε-产生式全部消除,反之不可以。
算法2.3
目的:找出所有满足 A=>ε 的非终结符号A。
终极目的:判断语言是否含有ε
定义此处推导的格式A→aB|cD|eF
*追踪*:令推导式左侧为父节点,该父节点有三种子节点的可能,三种可能同时只能出现一种。每种可能中不同的字符为不同子节点。当一个结点任意一种可能的所有子节点被选择时,其父节点也被选择,则称追踪至父节点。
算法流程:选出所有ε作为子节点,一路追踪,所形成的一棵或多棵子树为所求结果。
书上的新定义:当整颗树被选择,即S(根节点)被选中时,称ε属于这种语言,反之不属于。于是算法2.3可以用来判断一个文法是否产生空符号串ε。
算法2.4
条件和目的:空串不属于语言时消除空串。
算法流程:先定义一下这里用到推导的样子:A→X1X2X3...
开始构造新文法,新文法叫P‘;把旧语法树的结点们分为两类,算法2.3追踪出的结点,分成一类,这一类就叫W;剩下的一类叫不属于W。
对于每一条推导,细分右式的X1X2X3...,也就是那些结点们,依次看新推导式Y每一位取什么:
如果 Xi 不属于W,很好啊,Yi = Xi.
如果 Xi 属于W,那这个位置可以取Xi或空,产生两种可能,都放进P';假设W里有 j 个元素,那这个式子就会产生 2j 个生成式放到P'里。特别地,如果每个 Xi 都属于W,那不要把空串放进去了,只能生成 2j - 1 个式子。
算法2.5
条件和目的:空串属于语言时,除了根节点直接推导出空串,其他都不会变成空串。
算法流程:先把原来的文法复制一个出来,执行算法2.4,然后再加一条S→ε,结束了。