例5.5所对应数组X[ ]的内容如表5.1。
① 将数组X[ ]中对应每一非终结符的标记置初值为"未定"。 ② 扫描文法中的产生式。 (a) 删除所有右部含有终结符的产生式,若这使得以某一非终结符为左部的所有产生式都被删除,则将数组中对应该非终结符的标记值改为"否",说明该非终结符不能推出ε。 (b) 若某一非终结符的某一产生式右部为ε,则将数组中对应该非终结符的标志置为"是",并从文法中删除该非终结符的所有产生式。例中对应非终结符A、B的标志改为"是"。 ③ 扫描产生式右部的每一符号。 (a) 若所扫描到的非终结符号在数组中对应的标志是"是",则删去该非终结符,若这使产生式右部为空,则对产生式左部的非终结符在数组中对应的标志改"是",并删除该非终结符为左部的所有产生式。 (b) 若所扫描到的非终结符号在数组中对应的标志是"否",则删去该产生式,若这使产生式左部非终结符的有关产生式都被删去,则把在数组中该非终结符对应的标志改成"否"。 ④ 重复③,直到扫描完一遍文法的产生式,数组中非终结符对应的特征再没有改变为止。 由②中(a) 、(b)得知例中对应非终结符D的标志改为"否",对应非终结符A、B的标志改为"是"。 经过上述②中(a)、(b)两步后文法中的产生式只剩下:S→AB和C→AD ,也就是只剩下右部全是非终结符串的产生式。 再由③中的(a)步扫描到产生式S→AB时,在数组中A、B对应的标志都为"是",删去后S的右部变为空,所以S对应标志置为"是"。 最后由③中的(b)扫描到产生式C→AD时,其中,A对应的标志为"是",D对应的标志是"否",删去该产生式后,再无左部为C的产生式,所以C的对应标志改为"否"。 请学员自己写一个含有两个以上ε产生式的文法为例,用1中的算法计算能推出ε的非终结符。 |