一个文法G,若存在P经过一次或多次推导得到Pa(即能推导出以P开头的式子), 则称G是左递归的。
左递归分为直接左递归和间接左递归。
直接左递归经过一次推导就可以看出文法存在左递归,如P→Pa|b。
间接左递归侧需多次推导才可以看出文法存在左递归,如文法:S→Qc|c,Q→Rb|b,R→Sa|a有S =>Qc =>Rbc =>Sabc
消除直接左递归的方法:
1、把所有产生式写成候选式形式。如A→Aa1|Aa2……|Aan|b1|b2……|bm。其中每个a都不等于ε,而第个b都不以A开头。
2、变换候选式成如下形式:
A→b1A’|b2A’……|bmA’
A’ →a1A’|a2A’……|anA’|ε
例1:文法E→E+T|T,T→T*F|F,F →(E)|id消除直接左递归后有:
E→TE’,E’ →+TE’|ε,T→FT’,T’ →*FT’|ε,F→(E)|id
消除间接左递归的方法:
要求文法不存在A 经过一次或多次能推导出A和不存在ε产生式(形如A→ε)。
1、以某种顺序排列非终结符
消除左递归文法
最新推荐文章于 2023-05-12 20:33:48 发布
本文介绍了如何消除文法中的直接和间接左递归,包括直接左递归的消除方法,通过改写产生式为右递归,以及间接左递归的消除策略,涉及编译原理中的核心概念。
摘要由CSDN通过智能技术生成