直接左递归
形如A->Aβ,A∈非终结符,β∈终结符∪非终结符。
消除直接左递归
一般形式:
A->Aα1|Aα2|...|Aαm|β1|β2|...|βn
其中,αi(1≤i≤m)不等于ε,βj(1≤j≤n)不以A开头,消除直接左递归改写为:
A->β1A'|β2A'|...|βnA'
A'->α1A'|α2A'|...|αmA'|ε
例如:
文法:
S->Sa
S->b
消除直接左递归:
S->bS'
S'->aS'|ε
间接左递归
形如A->Bβ,B->Aα,A,B∈非终结符,α,β∈终结符∪非终结符。
消除间接左递归
先通过产生式非终结符置换,变为直接左递归,然后按直接左递归方法消除
例如:
文法:
(1)A->aB
(2)A->Bb
(3)B->Ac
(4)B->d
用(1)、(2)的右部置换(3)中的非终结符A,得到:
B->aBc
B->Bbc
B->d
消除直接左递归:
B->aBcB'|dB'
B'->bcB'|ε
把原来的A产生式加入,最终文法为:
A->aB
A->Bb
B->aBcB'|dB'
B'->bcB'|ε