1. 程式人生 > 其它 >「多項式」烷基計數、烯烴計數、烷烴計數

「多項式」烷基計數、烯烴計數、烷烴計數

編譯原理


編譯階段

詞法分析—>語法分析—>語義分析—>中間程式碼生成—>程式碼優化—>目的碼生成


文法

G[s] =(Vn,Vt,P,S) /非終結符、終結符、產生式、開始符號


詞法分析


自頂向下(推導)從文法產生語言的角度

最左推導: 用產生式的右部替換產生式的左部

最右推導(規範推導


自底向上(規約)從自動機識別語言的角度

最左規約(規範規約/規約

最右規約 :推導的逆過程

右線性文法(正規文法/3型文法) :產生式右部VN在VT的右邊 例:A->aB A->a


NFA->DFA:

  1. 確定化:求ε-CLOSURE(S)

  2. 畫表

  3. 最小化 π={{其他集},{含終態集}}(合併成角標最小)


正規式:將文法的終結符號用 * . |連線組成的表示式

正規式構造DFA:

  1. 先構造NFA

  2. 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)分析表:

  1. 拓廣文法

  2. 識別全部活字首的DFA

  3. 構造分析表


判斷SLR(1)文法:

  1. DFA中有衝突專案(移進-規約衝突,規約-規約衝突)
  2. 移進專案∩該產生式左部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)

  1. E->TE' FIRST(E)=FIRST(T)=={ ( id }
  2. E'->+TE'|ε FIRST(E')={+ ε }
  3. T->FT' FIRST(T)=FIRST(F)={ ( id }
  4. T'->*FT'|ε FIRST(T')={ * ε }
  5. F->(E)|id FIRST(F)={ ( id }

FOLLOW集

找產生式右部的非終結符,若後面為VT則寫入FOLLOW集,若後面為空寫左部的follow集,若後面為VN則寫入VN的FIRST集中非空元素

例:計算A的FOLLOW(A)

  1. E->TE' FOLLOW(E)={ $(開始) ) }
  2. E'->+TE'|ε FOLLOW(E')=FOLLOW(E)={ $ ) }
  3. T->FT' FOLLOW(T)={ + $ )(當E‘取ε時) }
  4. T'->*FT'|ε FOLLOW(T')={ + $ ) }
  5. F->(E)|id FOLLOW(F)={ * + $ ) ((當T‘取ε時)}