语法分析-消除左递归
一:什么是左递归?
在二型文法(上下文无关文法中),若一个非终极符A有任何直接文法规则或者通过多个文法规则,推导出的句型最左边符号又会出现A,我们说这个非终极符A是左递归的。
二:左递归的类型
• 直接左递归:经过一次推导就能看出文法存在左递归
例如:A->Aa|b ,A∈VN ,a,b∈(VN∪VT)*
• 间接左递归:经过多次推导才能看出文法存在左递归
例如:A->Ba|β,B->Ar|β,A,B∈VN,a,β,r∈(VN∪VT)*
三:左递归的消除方法
• 直接左递归的消除:
步骤:
1) 把所有产生式写成下列形式:
A→Aa1|Aa2……|Aan|b1|b2……|bm,其中每个a都不等于
ε,每个b都不以A开头。
2)变换候选式成如下形式:
A→b1A’|b2A’……|bmA’
A’ →a1A’|a2A’……|anA’|ε
例如:
s->sb,|a可以替换为 s->as' ,s'->b,s'|ε
• 间接左递归的消除:
步骤:
1)把间接左递归化成直接左递归
2)按照直接左递归的消除方法进行消除
例如:
A->Bc∣d
B->aA∣Ab
1)转换成直接左递归
A->aAc∣Abc∣d
2)消除直接左递归
A->aAcA′∣dA′
A′->bcA′∣ε