编译原理第05章自顶向下语法方法题稿.ppt
文本预览下载声明
提取左公共因子 若文法中含有形如:A→??|??的产生式,这导致了对相同左部的产生式其右部的FIRST集相交,也就是SELECT(A→??)∩SELECT(A→ ??) ≠?,不满足LL(1)文法的充分必要条件。 现将产生式A→??| ??进行等价变换为:A→ ?(?|?) 其中‘(’,‘)’为元符号,可进一步引进新非终结符A′,去掉‘(’,‘)’使产生式变换为: A→?A′ A′→?|? 写成一般形式为: A→ ?? 1| ?? 2|…| ?? n,提取左公共因子后变为: A→ ? (?1| ?2|…| ?n),再引进非终结符A′,变为: A→ ? A′ A′→?1| ?2|…| ?n 若在?i、 ?j、 ?k … (其中1≤i,j,k≤n)中仍含有左公共因子,这时可再次提取,这样反复进行提取直到引进新非终结符的有关产生式再无左公共因子为止。 例5.6 若文法G1的产生式为: (1) S→aSb (2) S→aS (3) S→ε 请提取文法中的左公因子。 解答: 对产生式(1)、(2)提取左公因子后得: S→ aS(b|ε) S→ε 进一步变换为文法G′1: S→aSA A→b A→ε S→ε 例5.7 若文法G2的产生式为: (1) A→ad (2) A→Bc (3) B→aA (4) B→bB 请提取文法中的隐式左公因子。 产生式(2)的右部以非终结符开始,因此左公共因子可能是隐式的,所以这种情况下对右部以非终结符开始的产生式,用其相同左部而右部以终结符开始的产生式进行相应替换,对文法G2分别用(3)、(4)的右部替换(2)中的B,可得: (1) A→ad (2) A→aAc (3) A→bBc (4) B→aA (5) B→bB 提取产生式(1)、(2)的左公共因子得: A→a(d|Ac) A→bBc B→aA B→bB 引进新非终结符A′,去掉‘(’,‘)’后得G′2为: (1) A→aA′ (2) A→bBc (3) A′→d (4) A′→Ac (5) B→aA (6) B→bB 例5.8 若有文法G3的产生式为: (1) S→aSd (2) S→Ac (3) A→aS (4) A→b 用产生式(3)、(4)中右部替换产生式(2)中右部的A,文法变为: (1) S→aSd (2) S→aSc (3) S→bc (4) A→aS (5) A→b 对(1)、(2)提取左公共因子得: S→aS(d|c) 引入新非终结符A′后变为: (1) S→aSA′ (2) S→bc (3) A′→d|c (4) A→aS (5) A→b 显然,原文法G3中非终结符A变成不可到达的符号,产生式(4)、(5)也就变为无用产生式,所以应删除。 例5.9 若有文法G4的产生式为: (1) S→Ap|Bq (2) A→aAp|d (3) B→aBq|e 用(2)、(3)产生式的右部替换(1)中产生式的A、B使文法变为: (1) S→aApp|aBqq (2) S→dp|eq (3) A→aAp|d (4) B→aBq|e 对(1)提取左公共因子则得: S→a(App|Bqq) 再引入新非终符S′结果得等价文法为: (1) S→aS′ (2) S→dp|eq (3) S′→App|Bqq (4) A→aAp|d (5) B→aBq|e 同样分别用(4)、(5)产生式的右部替换(3)中右部的A、B再提取左公共因子最后结果得: (1) S→aS′ (2) S→dp|eq (3) S′→aS″ (4) S′→dpp|eqq (5) S″→Appp|Bqqq (6) A→aAp|d (7) B→aBq|e 可以看出若对(5)中产生式A、B继续用(6)、(7)产生式的右部替换,只能使文法的产生式愈来愈多无限增加下去,但不能得到提取左公共因子的预期结果。 消除左递归 设一个文法含有下列形式的产生式。 1)A→Aβ A∈VN,β∈V* 2)A→Bβ B→Aα A,B∈VN, α,β∈V* 称含1)中产生式的文法为含有左递归的规则或称直接左递归的。 含2)中产生式的文法有A=+A … 则称文法中含有左递归或间接左递归. 文法中只要含有1)或含有2)的产生式或二者皆有均认为文法是左递归的。 消除左递归的步骤 消除左递归的算法 示例: 例5.10 例5.11 例5.12 消除左递归的步骤 1)把文法的所有非终结符按某一顺序排序; 如A1,A2,…,An 2)从A1开始消除左部为A1的产生式的直接左递归,然后把左部为A1的所有规则的右部逐个替换左部为A2右部以A1开始的产生式中的A1,并消除左部为A2的产生式中的直接左递归。继而以同样方式把A1,A2的右部代入左部为A3右部以A1
显示全部