編譯原理複習(二)

零碎知識點

  1. 正規式等價是指兩個正規式所識別的語言集相等
  2. 中間代碼生成時所依據的是:語義規則
  3. 編譯程序絕大多數時間花在管理表格
  4. 詞法分析器的輸出結果是單詞的種別編碼和自身值
  5. 堆式動態分配申請和釋放存儲空間遵循任意原則
  6. 並不是每個文法都能改寫成LL(1)文法
  7. LR分析器由三部分構成:總控程序分析表分析棧
  8. 自底而上語法分析方法的主要問題是什麼?
  9. 什麼是簡單優先文法
  10. 什麼是算符優先文法
  11. 文法G所描述的語言是由文法的開始符號推出的所有終結符號串的集合
  12. 非LL(1)文法變爲LL(1)文法可以使用消除左遞歸提取左公因子兩種方法
  13. 三種級別的優化:局部優化循環優化全局優化

求文法的FIRST集、FOLLOW集、SELECT集並判斷文法是否爲LL(1)文法:

例題:

文法G[E]:

E->TE'
E'->+E|ε
T->FT'
T'->T|ε
F->PF'
F'->*F'|ε
P->(E)|a|b|^ 

一、求出能推算出ε的非終結符

創建表:

非終結符 E E’ T T’ F F’ P
多遍掃描後

二、求FIRST集

定義

在這裏插入圖片描述

設G=(VT,VN,S,P)是上下文無關文法 ,FIRST(α)={a|α能推導出aβ,a∈VT,α,β∈V*}   
特別的,若α能推導出ε,則規定ε∈FIRST(α).

結果

FIRST(E)=FIRST(T)=FIRST(F)=FIRST(P)={(,a,b,^};
FIRST(E')={+,ε};
FIRST(T)=FIRST(F)=FIRST(P)={(,a,b,^};
FIRST(T')=FIRST(T)∪{ε}={(,a,b,^,ε};
FIRST(F)=FIRST(P)={(,a,b,^};
FIRST(F')=FIRST(P)={*,ε};
FIRST(P)={(,a,b,^};

三、求FOLLOW集

定義

在這裏插入圖片描述

結果

FOLLOW(E)={),#};  
FOLLOW(E')=FOLLOW(E)={),#};  
FOLLOW(T)=FIRST(E')∪FOLLOW(E)={+,),#};不包含ε
FOLLOW(T')=FOLLOW(T)=FIRST(E')∪FOLLOW(E)={+,),#};
FOLLOW(F)=FIRST(T')∪FOLLOW(T)={(,a,b,^,+,),#};//不包含ε
FOLLOW(F')=FOLLOW(F)=FIRST(T')∪FOLLOW(T)={(,a,b,^,+,),#};
FOLLOW(P)=FIRST(F')∪FOLLOW(F)={*,(,a,b,^,+,),#};//不包含ε

四、求SELECT集

定義

在這裏插入圖片描述

結果

SELECT(E->TE')=FIRST(T)={(,a,b,^};
SELECT(E'->+E)={+ }; 
SELECT(E'->ε)=FOLLOW(E/)={),#};
SELECT(T->FT')=FIRST(F)={(,a,b,^}
SELECT(T'->T)=FIRST(T)={(,a,b,^};
SELECT(T'->ε)=FOLLOW(T/)={+,),#};
SELECT(F->PF')=FIRST(P)={(,a,b,^};
SELECT(F'->*F')={*};
SELECT(F'->ε)=FOLLOW(F')={(,a,b,^,+,),#};
SELECT(P->(E))={(}
SELECT(P->a)={a}
SELECT(P->b)={b}
SELECT(P->^)={^}

五、判斷是否爲LL(1)文法

在這裏插入圖片描述

由四中的SELECT集可知,相同左部產生式的SELECT集交集爲空,所以該文法爲LL(1)文法。

六、構造預測分析表

方法

在這裏插入圖片描述

結果

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章