如果乙個文法中有乙個非終結符號a使得對某個串α存在乙個推導a=》aα,那麼這個文法就是左遞迴的。遞迴分為立即左遞迴和非立即左遞迴。立即左遞迴單步即可看出來,非立即左遞迴
舉個例子:
立即左遞迴:
a ——> aα | β
非立即左遞迴:
1)a→ab
2)a→bb
3)b→ac
4)b→d
消除立即左遞迴只需要遵循以下規律進行轉換就ok。
立即左遞迴:
將a ——> aα | β 轉換為
a ——> β a'
a' ——> α a'
非立即左遞迴:
先將其變為立即左遞迴
1)b→abc
2)b→bbc
3)b→d
可化簡為:b→abc | bbc | d
然後按照上面的規則進行轉換即可
1)b→abcb' |db'
2)b'→bcb' |ε
最後進行整合
1)a→ab
2)a→bb
3)b→(abc|d)b'
4)b'→bcb'|ε
以某種順序排列非終結符a1,a2,……,an;
for(int i = 1; i<=n; i++)
消除關於ai產生式中的直接左遞迴性
}
和數學中的公因子含義相同,就是公共的因子,而左公因子就是最左邊的公因子。
例如:
s → ab1|ab2|ab3|ab4|...|abn|y
可以看出前n項擁有乙個共同的左公因子:a,所以可以把他提取出來。
so easy啦
s → as'|y
s'→ b1|b2|b3|...|bn
消除左遞迴
參考關健young的部落格,左遞迴形式為 1 a a a vn,v 2 a b b a a b vn,v 稱其為左遞迴。其中可以採取修改左遞迴為右遞迴 a a 其中 非空,不以a打頭 可寫為 a a a a 即 a a 1 a 2 a m 1 2 n 其中,i 1 i m 均不為空,j 1 j n ...
消除左遞迴
first集的求法 對於文法g的任一符號串 x1x2 xn可按下列步驟構造其first 集合 1 置first 2 將first x1 中的一切非 符號加進first 3 若 first x1 將first x2 中的一切非 符號加進first 若 first x1 和first x2 將first...
消除左遞迴
1.將以下文法消除左遞迴,並分析符號串 i i i e e t t t t f f f e i 消除左遞迴 e t e e te t ft t ft f e i first集 first e first e first t first t first f follow集 follow e follo...