编译原理-消除间接左递归算法的细节补充
消除左递归的算法如下:
步骤1中,在消除间接左递归时,关于P1,P2.....Pn的排序,建议这样处理:
建议把文法的开始符号S作为Pn,这样最后得到的产生式就只有2个,很简便。
相反, S作为P1的话,最后文法G的产生式可能会很多个。
这是为何?
如下图所示,间接左递归的消除就是循环圈不断减少非终结符的过程,那么最后会只剩下一个非终结符A的循环(即直接左递归),再消去直接左递归,并删去多余的语句,即完成。
但开始符号是S,所以至少还会多一个S->A的产生式(甚至更多,如S->B,B->A之类);
那么我们人为的令Pn为S,最后就只有两个产生式,分别以S,S'开始。
