消除左遞迴及提取左公因子

2021-09-19 07:09:18 字數 990 閱讀 4886

如果乙個文法中有乙個非終結符號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...