c) 消除文法中一切左递归的算法。 对文法中一切左递归的消除要求文法中不含回路即无A ![]() ![]() 算法步骤: 1) 把文法的所有非终结符按某一顺序排序; 如A1,A2,…,An 2) 从A1开始消除左部为A1的产生式的直接左递归,然后把左部为A1的所有规则的右部逐个替换左部为A2右部以A1开始的产生式中的A1,并消除左部为A2的产生式中的直接左递归。继而以同样方式把A1,A2的右部代入左部为A3右部以A1或A2开始的产生式中,消除左部为A3的产生式之直接左递归,直到把左部为A1,A2,…, An-1的右部代入左部为An的产生式中,从An中消除直接左递归。 3) 去掉无用产生式。 把上述算法归结为: 若非终结符的排序为A1,A2,…,An。 FOR i∶=1 TO N DO BEGIN FOR j∶=1 TO i-1 DO BEGIN 若Aj的所有产生式为: Aj→δ1|δ2|…|δk 替换形如Aj→Ajr的产生式变为: Ai→δ1r|δ2r|…|δkr END 消除Ai中的一切直接左递归。 END 最后删除无用产生式。 |