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

相關文章

消除左遞歸及提取左公因子
最左推導、最右推導及其語法樹構建
FIRST集合、FOLLOW集合以及LL(1)文法

消除左遞歸

什么是左遞歸?

如果一個文法中有一個非終結符號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 = n; i<=n; i++) {
    for(int j = n; j<=i-1; j++) {
        將每個形如 Ai → Ajγ 的產生式替換為產生式組 Ai → ξ1γ|ξ2γ|……|ξkγ ,
        其中,Aj→a1|a2|……|ak是所有的當前Aj產生式
    }
    消除關于Ai產生式中的直接左遞歸性
}

提取左公因子

什么是左公因子?

和數學中的公因子含義相同,就是公共的因子,而左公因子就是最左邊的公因子。

例如:

S → aB1|aB2|aB3|aB4|...|aBn|y

可以看出前n項擁有一個共同的左公因子:a,所以可以把他提取出來。

提取規則

so easy啦

S → aS'|y
S'→ B1|B2|B3|...|Bn
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容