「多項式」烷基計數、烯烴計數、烷烴計數
編譯原理
編譯階段
詞法分析—>語法分析—>語義分析—>中間程式碼生成—>程式碼優化—>目的碼生成
文法
G[s] =(Vn,Vt,P,S) /非終結符、終結符、產生式、開始符號
詞法分析
自頂向下(推導)從文法產生語言的角度
最左推導: 用產生式的右部替換產生式的左部
最右推導(規範推導)
自底向上(規約)從自動機識別語言的角度
最左規約(規範規約/規約)
最右規約 :推導的逆過程
右線性文法(正規文法/3型文法) :產生式右部VN在VT的右邊 例:A->aB A->a
NFA->DFA:
-
確定化:求ε-CLOSURE(S)
-
畫表
-
最小化 π={{其他集},{含終態集}}(合併成角標最小)
正規式:將文法的終結符號用 * . |連線組成的表示式
正規式構造DFA:
-
先構造NFA
-
NFA構造DFA
語法分析
語法分析樹
若無二義性則最左推導和最右推到對應的語法樹必定相同
二義性文法:L(G)的某個句子對應不止一個最左/最右推導
短語:每棵子樹的葉子 (從下往上看)
直接短語:每棵直接子樹(高度為1的樹)的葉子
控制代碼:某句型的最左直接短語(最先被規約的子串) (從下往上看/同一高度)
素短語:至少包含一個終結符且不包含更小素短語的短語
自頂向下
LL(1):第一個“L”表示從左向右掃描輸入,第二個“L”表示產生最左推導,而“1”表示在每一步中只需要向前看一個輸入符號來決定語法分析動作
判斷LL(1)文法
對於文法LL(1)文法G,當且僅當G的任意兩個不同產生式 A -> α | β
- 不存在左遞迴(不存在終結符號a使得α和β都能推匯出以a開頭的串)
- α和β中最多隻有一個可以推匯出空串
LL(1)分析表
遞歸向下
預測分析
自底向上
簡單優先
算符優先
LR分析(無二義性):(層次包含關係)LR(0)<SLR(1)<LALR(1)<LR(1)
LR(0)專案: 右部帶·的產生式
S’→S·(接受專案)
S→α·(規約專案)
A->α·xβ(移進專案:·後為VT)
A->α·Xβ(待約專案:·後為VN)
判斷LR(0)文法:
無衝突專案(移進-規約衝突、規約-規約衝突):
LR(0)分析表:
-
拓廣文法
-
識別全部活字首的DFA
-
構造分析表
判斷SLR(1)文法:
- DFA中有衝突專案(移進-規約衝突,規約-規約衝突)
- 移進專案∩該產生式左部FOLLOW集為∅
SLR(1)分析表對每個規約專案A->α,求FOLLOW(A)得到的輸入符號出填rn,其餘與LR(0)分析表一樣
判斷LR(1)文法:
構造帶向前搜尋符的DFA,無規約-規約衝突
判斷LALR(1)文法:
LR(1)文法合併同心集後無規約-規約衝突,核相同,向前搜尋符不同 (取並集)
消除左遞迴
FIRST集
若X是VT則FIRST(X)={X}
若X是VN且X->Y1...YK∈P(K>=1)則FIRST(X)={Y1}
若X是VN且X->Y1...YK∈P(K>=1)若Y1->*ε 則FIRST(X)=FIRST(Y1)∪FIRST(Y2)
若X是VN且X->Y1...YK∈P(K>=1)若Y1...YK->*ε 則將ε加入FIRST(X)
例:計算X的FIRST(X)
- E->TE' FIRST(E)=FIRST(T)=={ ( id }
- E'->+TE'|ε FIRST(E')={+ ε }
- T->FT' FIRST(T)=FIRST(F)={ ( id }
- T'->*FT'|ε FIRST(T')={ * ε }
- F->(E)|id FIRST(F)={ ( id }
FOLLOW集
找產生式右部的非終結符,若後面為VT則寫入FOLLOW集,若後面為空寫左部的follow集,若後面為VN則寫入VN的FIRST集中非空元素
例:計算A的FOLLOW(A)
- E->TE' FOLLOW(E)={ $(開始) ) }
- E'->+TE'|ε FOLLOW(E')=FOLLOW(E)={ $ ) }
- T->FT' FOLLOW(T)={ + $ )(當E‘取ε時) }
- T'->*FT'|ε FOLLOW(T')={ + $ ) }
- F->(E)|id FOLLOW(F)={ * + $ ) ((當T‘取ε時)}