消除左递归在编译原理中的应用

4星 · 超过85%的资源 需积分: 16 36 下载量 90 浏览量 更新于2024-09-16 1 收藏 142KB DOC 举报
"消除左递归的实现和算法" 消除左递归是编译原理中的一种重要技术,用于消除语法中的左递归,以便于语法分析和解析。左递归是指在语法规则中,某个非终结符的规则可以由该非终结符自身推导出来,这种情况下,语法分析器将陷入死循环无法 termination。 在消除左递归时,可以使用两种方法:直接左递归的消除和间接左递归的消除。 **直接左递归的消除** 直接左递归是指在语法规则中,某个非终结符的规则可以由该非终结符自身推导出来,但该非终结符不以自身开头。例如,假设非终结符P的规则为P→Pα/β,其中,β是不以P开头的符号串。那么,我们可以把P的规则改写为非直接左递归形式:P→βP’,P’→αP’/ε。这两条规则和原来的规则是等价的,即两种形式从P推出的符号串是相同的。 例如,考虑简单表达式文法G[E]: E→E+T/T T→T*F/F F→(E)/I 经消除直接左递归后得到如下文法: E→TE’ E’→+TE’/ε T→FT’ T’→*FT’/ε F→(E)/I **间接左递归的消除** 间接左递归是指在语法规则中,某个非终结符的规则可以由该非终结符自身推导出来,但该非终结符以自身开头。例如,设有文法G[S]: S→Qc/c Q→Rb/b R→Sa/a 虽不具有左递归,但S、Q、R都是左递归的,因为经过若干次推导可以显现出其左递归性。消除间接左递归的方法是,把间接左递归文法改写为直接左递归文法,然后用消除直接左递归的方法改写文法。 **消除左递归算法** 如果一个文法不含有回路,即形如P[pic]P的推导,也不含有以ε为右部的产生式,那么就可以采用下述算法消除文法的所有左递归。 1.把文法G的所有非终结符按任一顺序排列,例如,A1,A2,…,An。 2.for(i=1;i<=n;i++) for(j=1;j<=i-1;j++) {把形如Ai→Ajγ的产生式改写为Ai→Aj’,Aj’→γAj’/ε} 通过这种算法,可以消除文法中的所有左递归,从而提高语法分析的效率和可靠性。 消除左递归是编译原理中的一种重要技术,通过消除左递归,可以提高语法分析的效率和可靠性。同时,消除左递归也可以应用于其他领域,如自然语言处理、机器学习等。