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