1. 程式人生 > >whdAlive 's blog

whdAlive 's blog

一、概論。

  1. 將某一種 程式設計語言 寫的 程式 翻譯成等價的 另一種語言程式 的程式, 稱之為編譯程式(compiler) 。
  2. 遍:對源程式或源程式的中間形式從頭到尾掃描一遍,並做有關的分析加工,生成新的源程式的中間形式或生成目標程式。

二、形式語言與自動機基礎

  1. BNF : 用來表示語法 eg. <句子> -> <主語><謂語>

  2. 字母表(符號集):字母表是元素的非空有窮集合。字母表中的元素
    稱為符號或字元,因此字母表也稱為符號集,用大寫字母A希臘字母∑表示

  3. 符號串:由字母表中的符號組成的任何有窮序列稱為符號串,也稱為串或字串。用小寫希臘字母表示符號串,如如 ω =STR

    1. 字首: ω 是一個符號串,從 ω 的尾部刪去0個或若
      幹個符號之後剩餘的部分稱為 ω 的字首。 (真字首不是原符號串)
    2. 字尾:從 ω 的首部刪去0個或若干個符號之後剩餘的部 分稱為ω 的字尾。(真字尾不是原符號串)
    3. 子符號串:從一個符號串中刪去它的一個字首 和一個字尾之 後剩餘的部分稱為該符號串的子符號串或子串。
  4. 符號串的連線:設 ω 和 υ是兩個符號串,如果將符號串 υ 直接拼接在符號串 ω 之後,則稱此操作為符號串 ω 和 υ的連線,記作 ω υ。

    eg. ω=abc,υ =xyz則 ω υ=abcxyz

  5. 符號串的方冪:設 ω 是某字母表上符號串,把 ω 自身連線 n 次得 到符號串 υ ,即 υ = ω ω … ω (n個 ω ) ,稱 υ 是符號 串 ω 的n次冪,記作 υ = ω ^n。

  6. 符號串集合的乘積:設A、B 是兩個符號串集合,AB表示A與B的乘積,則有定義 AB={ ω υ| ( ω ∈A)∧( υ∈B) }

    如:設A={ab,c}, B={d,ef}, 則 AB={abd, abef, cd, cef}

  7. 符號串集合的方冪:設A是符號串集合,A自身的乘積可以用方冪表示。A0= { ε } A^1=A A^2=AA A^3= A^2A =AAA

  8. 符號串集合的並(並集)

  9. 符號串集合的閉包:

    1. 正閉包:設A為符號串集,A的正閉包記作A+,有 A+= A1∪ A2∪…∪ An∪…
    2. 自反閉包:A*定義為A的自反閉包,有 A*= A0∪ A+= { ε }∪ A+= A+∪{ ε }
  10. 文法:一部文法G是一個四元組 G =( VN, VT, S, P)

    1. VN:非空有限的非終結符號集(一般用大寫字母表示)。其中 的元素稱為非終結符,或語法變數,代表了一個語法範疇
    2. VT:非空有限的終結符號集(一般用小寫字母表示)。
    3. S:文法的開始符號或識別符號,亦稱公理,S ∈VN。S代表 語言最終要得到的語法範疇。
    4. P:有限產生式集。
      產生式就是按一定格式書寫的定義語法範疇的文法規則,它是一部文法的實體。
  11. 語言的非形式化定義:給定一部文法G, 從G的開始符號S出發,反覆使 用產生式對非終結符進行替換,最後所得到的終結符 號串的全體,即為文法G所描述的語言L(G)。

    如:設有文法G: S → P | aPb,P → ba | bQa,Q → ab ;

    L(G)={ba, baba, abab, ababab}

  12. 直接推導=>:有 ν = α Aβ=> α γβ= ω ( α ,β,γ∈(VN∪VT)*),當且 僅當P中存在一條規則A ->γ,稱 ν 直接推匯出 ω (或 ω 直接歸約到 ν ),記作: ν => ω 。

  13. 直接推導序列: 則 ν 經過n步(n>0)可以推匯出ω ,記作:ν =(+)>ω 。當ν=>ω 或 ν=ω ,記作: ν(*)=>ω

  14. 句型:設有文法G[S],若 S =(*)> α ( α ∈(VT∪VN)*),則稱
    α 為G[S]的句型

  15. 句子:設有文法G[S] , 若S =(*)>α ( α∈VT*) ,則稱 α 為G[S]的句子。

  16. 最左(右)推導

  17. 規範推導/規範句型/規範歸納:最右推導也稱為規範推導 。僅用規範推導得到的句型稱為規範句型 。規範推導的逆序為規範歸約。

  18. 遞迴文法:設有文法G,A→ γ是G的產生式,若 γ 具有 α A β的形式,或 γ
    =(+)>α A β ,則稱G是遞迴文法。

    1. 若 α = ε ,則G為左遞迴文法。
    2. 若 β=ε ,則G為右遞迴文法
  19. 語言:文法 G所產生(描述)的語言L(G): L(G) = { α | α ∈VT*∧ S =(+)> α ,S是文法 G 的開始符號 }

  20. 文法等價:若 L(G1)= L(G2),則稱文法G1和G2是等價的

  21. EBNF:擴充BNF,假如{} () []

  22. 語法圖:

    1. 由一組圖組成,每個圖定義了一個非終結符的產生式 。
    2. 每個圖都有一個起始結點和一個終止結點,其他的結點標記為 文法符號。
    3. 終結符結點用圓形表示。
    4. 非終結符結點用方形表示。
    5. 從起始結點到終止結點的所有路徑(標記為結點序列)定義候 選式。
  23. 語法分析樹

  24. 二義文法:對一部文法G,如果至少存在一個句子,有兩棵 ( 或兩棵以上 )不同的分析樹,則稱該句子是二義性的。包含有二義性句子的文法稱為二義文法。否則,該文法是無二義性的

    1. 文法二義與語義二義無關
  25. 文法二義性消除:構造G1′ ,使L( G1)=L( G1′)

  26. 文法分類:

    1. 0型(短語)文法:如果對文法G中的規則 α → β 不加任何限制,則稱G 為0型文法或短語文法。
    2. 1型文法(上下文有關文法):設文法G=(VN,VT,S,P),對P中的每個產生式(除 S → ε 外,但此時S不得出現在任何產生式的右部 ) 限制為形如:α A β → α γ β其中,A∈VN, α , β ∈(VT∪VN)﹡, γ ∈(VT∪VN)+, 則稱文法G為1型文法或上下文有關文法。
    3. 2型文法(上下文無關文法):設文法G =(VN,VT, S , P),對P中的每個產生 式限制形如: A→ α 其中,A∈VN, α ∈(VT∪VN)* 則稱文法G為2型文法。
    4. 3型文法(正則文法、線性文法):設文法G=(VN,VT, S, P),對P中的每個產生式 形如: A→ α B 或A→ α 或者(A→B α 或 A→ α) 其中,A,B∈ VN, α ∈VT*,則稱文法G為3型文法 (正則文法或線性文法)。
  27. 確定的有限狀態自動機DFA:一個確定的有限自動機M ( DFA M)是一個五 元組 M =(Q, ∑ , f, q0, Z)

    1. Q:狀態的有限集合,每個元素qi(qi∈Q) 稱為一 個狀態。

    2. ∑ :輸入字元的有限集合(或有窮字母表)。

    3. f:狀態轉換函式:從Q× ∑ →Q的對映。 例如, f(p,a)=q, q、p∈Q, a∈ ∑ 。表示了在狀 態p讀入字元a後轉入狀態q。q也稱為p的 後繼狀態

    4. q0:M的唯一初態(也稱開始狀態),q0∈Q

    5. Z: M的終態集(或接受狀態集) Z⊆Q。

      形式定義<->狀態轉換圖 <-> 狀態轉換表

      DFA識別機制:(識別方法)

      L(M) 為全部接收的字串

  28. 非確定的有限狀態自動機NFA:一個非確定的有限自動機M ( NFA M)是一個五元組M =(Q,∑ , f, q0, Z)

    1. Q,∑ , Z, q0同DFA
    2. f:狀態轉換函式。 從Q×( ∑ ∪{ ε }) →2Q的對映。這裡的後繼狀態不 是唯一的,它是狀態集Q的子集。

    識別機制:L(M) 為全部接收的字串

  29. NFA確定化

    1. 對任何一個NFA M,都存在一個DFA M ’ , 使 L(M’ )=L(M)。

    確定化的演算法-子集法:I是NFA M’ 狀態集Q的一個子集。(即I⊆Q), 則ε-closure(I)為~~~

    狀態集合I的α弧轉換Ia : Ia=ε-closure({p|∃q∈ ε -close(I),p∈f(q,a)})。

  30. DFA化簡

    通過刪除無關狀態,合併等價狀態的規約過程,直至得到規約機( 最小的DFA)

    1. 無關狀態或多餘狀態或無用狀態

      如果從DFA M的初態開始,任何輸入序列都不能到達的那些狀態稱為無關狀態

    2. 等價狀態、可區分狀態

      設DFAM的兩個不同狀態 q1,q2,如果對任意 輸入字串ω,從q1,q2狀態出發,總是同時到達接收狀態或拒絕狀態之中,稱q1,q2是等價的。

  31. 正則文法與有限自動機

    設文法G=(VN, VT, S, P)為一右線性文法(左線性文法結論相同),則存在一有限自動機M=( Q, ∑ , f, q0, Z),使得:L(M)=L(G)

    構造

    1. ∑ = VT
    2. q0= S
    3. Q= VN∪{qz}, qz為一附加狀態且qz∉ VN
    4. Z= {qz}
    5. f:若P中有產生式B →a, 則qz∈f(B,a) 若P中有產生式B →aC,則C∈f(B,a) a∈VT∪{ε}
  32. 正規式與正規集

    1. ε和Ф是∑上的正規式,它們表示的正規集分別 為{ε}和Ф;
    2. 對任何a∈∑,a是∑上的正規式,它表示的正規集為{a};
    3. 若r,s都是正規式 , 對應的正規集分別為R和S , 則 (r|s)、(r·s)、(r)*也是正規式,它們表示的正規集分別是:R∪S,RS,R*。
    4. 有限次使用上述三條規則構成的表示式,稱為∑上 的正規式,僅由這些正規式表示的集合為正規集
  33. 正規式與有限自動機的等價

    1. 字母表∑上的有限自動機M所接受的語言 L(M) 是∑上的一個正規集;
    2. 對於∑上的每一個正規式 r,存在一個∑上的有 限自動機M,使得:L(M)=L(r)。

三、詞法分析

  1. 屬性字:對所識別的單詞的資料結構表示。

    L1= ( T(Token),C(Code))

  2. 掃描器設計與實現

    作為掃描器的狀態轉換圖(FA)的構造

    1. 對語言的各類單詞分別構造狀態圖
    2. 將各類狀態圖合併,構成一個能識別該語言所有單詞的狀態圖。
      1. 將各類單詞的狀態圖的初態合併為一個惟一初態;
      2. 調整衝突編號。

    狀態轉換圖實現之一:資料中心法

    將狀態轉換圖看成一種資料結構(狀態表),用總控程式控制輸入的源程式串在其上執行。

    1. 主表: 資料項= 狀態 + 分表地址或子程式入口
    2. 分表: 資料項= 當前輸入字元 + 轉換狀態

    狀態轉換圖實現之二:程式中心法

    將狀態轉換圖看成一個流程圖,從初態開始對 它的每個節點(狀態)編寫一函式或直接跟蹤狀態 圖從初態開始的轉換完成所有分支的跟蹤來編寫程 序。

四、語法分析–自上而下分析法

  1. 不確定性

    消除直接左遞迴:對P→P α|β, α 、 β ∈(VT∪VN)* 修改為P→ β P′, P′→ α P′|ε

    消除間接左遞迴:

    1. 把間接左遞迴文法改寫為直接左遞迴文法;

      依次按照C,B,A的順序向前帶入,注意只替換A->Ba這種形式,A->aB無需替換

    2. 用消除直接左遞迴的方法改寫文法

    消除回溯:利用First和Follow

  2. First集

    設G是二型文法,則G中的任意 α∈V*的終結首符集FIRST( α )為 FIRST ( α ) = { a |α=> a ……,a∈VT } 若α =>ε, 則ε∈FIRST( α ) 。

    演算法:

    1. 計算FIRST(X)(X∈V)

      1. 若X是終結符,則FIRST(X)={X};
      2. 若X是非終結符,X的FIRST為其所有候選式的 FIRST集合的並集。
    2. 計算FIRST( α )( α ∈V*)

      設 α =X1X2… Xk (Xi∈V)

      1. FIRST(X1)中的所有終結符號加到FIRST( α )中;
      2. 若對於某個i,a∈ FIRST(Xi)且X1X2… Xi-1⇒ ε, 則將a加到FIRST( α )中;
      3. 若對於所有的j=1,2,…,k, ε ∈ FIRST(Xj), 則將 ε 加到FIRST( α )中

    對非終結符A的多個候選式的FIRST( αi)的相互兩個彼此交集≠Φ,一般是因為 αi中有公共左因子,可 以通過提取左公因子來改造文法。(由BNF正規化改 EBNF正規化)

  3. 狀態圖構造(為文法G的每個VN )

    1. 建立1個初態和1個終態(函式返回態);
    2. 為每個產生式 A→ x1x2 … xn 建立從初態到終 態的路徑,弧標記為x1,x2, …,xn ;
  4. 化簡遞迴下降分析器(化簡狀態圖)

  5. LL(1)分析法

    1. 顯式地維護一個狀態棧,而不是通過隱式的遞迴呼叫來做自上而下的語法分析
    2. 邏輯結構:總控程式,LL(1)分析表,分析棧
  6. Follow集

    1. 設上下文無關文法G,S是文法的開始符 號,對於文法G的任何非終結符A FOLLOW(A)={a|S=>…Aa…,a∈VT} 若S=>…A,則令#∈FOLLOW(A)。
    2. FOLLOW(A)的含義是指,在文法G的句型中,能夠緊跟著A之後的一切終結符或“#”
    3. 演算法:
      1. 對文法的開始符號S,令#∈FOLLOW(S) ;
      2. 若文法G中有形如A→ α Bβ的規則,且β≠ε, 則將FIRST(β)中的一切非ε符號加入 FOLLOW(B);
      3. 若G中有形如 A→α B 或 A→α Bβ的規則,且ε∈FIRST(β),則FOLLOW(A)中的全部元素 屬於FOLLOW(B)
  7. LL(1)分析表的構造

    1. 對文法G,若G中對非終結符A的產生式形如 A→ α | β 且 α 和 β 均不推出ε,則可產生LL(1)分析表的A行為:
      1. 對∀ a∈FIRST( α ) ,a列即 M (A,a) = { A→ α }
      2. 對∀ b∈FIRST( β ) ,b列即 M (A,b) = { A→ β }
    2. 對A→ α | β 且α 或 β 推出ε的情況,產生LL(1)分 析表的A行為,
      1. 若 α =>ε 對∀ a∈FIRST( α )∪FOLLOW(A), a列即 M (A,a) = { A→ α }
      2. 若 α 不推出空串, 對∀ a∈FIRST( α ) ,a列即 M (A,a) = { A→ α}
      3. 若 β=>ε 對∀ b∈FIRST( β )∪FOLLOW(A), b列即 M (A,b) = { A→ β }
      4. 若 β 不推出空串, 對∀ b∈FIRST( α ) ,b列即 M (A,b) = { A→β }
  8. LL(1)重要性質

    1. 任何LL(1)文法是無二義性的。
    2. 若一文法為左遞迴文法,則它必然是非 LL(1)文法。
    3. 非LL(1)語言是存在的。
    4. 存在一種演算法,它能判定任一文法是否為 LL(1)文法。
    5. 不存在這樣的演算法,它能判定上下文無關 語言能否由LL(1)文法產生。
  9. 非左遞迴文法G為LL(1)文法⇔G的任何一個非 終結符 A,設關於A的產生式為 A→ α 1 | α 2 |…| α n 滿足下面的條件:

    1. 每個候選式 α i,FIRST( α i)兩兩彼此互不相 交。
    2. 若有 α i =>0,則FIRST(α) ∩ FOLLOW(A) = ∅。

五、語法分析–自下而上分析法

  1. 短語:S是文法G的開始符號,α β δ 是G的一個句型,若 S =>α A δ 且A =(+)>β,則 β 是句型 α β δ 相對於A的短語

  2. 直接短語:S是文法G的開始符號,α β δ 是G的一個句型,若 S =>α A δ 且A→ β ,則 β 是句型 α β δ 相對於A的直接短語

  3. 控制代碼:一個句型的最左直接短語稱為控制代碼

    (所有短語根據子樹的葉子節點判斷即可)

  4. 算符優先分析法

    1. 基本思想:對給定的G按照一定原則求出G的文法符號間的優先關係,按照優先關係確定可歸約子串實施歸約。
  5. 算符文法(OG):設有一文法G,如果G中沒有 U→…VW… 的規則,其中V,W,U∈ VN,則稱文法G 是算符文法(OG)

    算符文法的任何句型都不會含有兩個相鄰的非終結符

  6. 算符優先文法(OPG)

    設G是一不含P→ε形式規則的算符文法,則對於任何a,b有:

    1. a≐b,當且僅當文法G中有形如 A→… ab… 或 A→… aBb…的規則:
    2. a⋖b,當且僅當文法G中有形如A→… aB…的規 則,其中B=>b… 或 B=> Cb… ;
    3. a⋗b,當且僅當文法G中有形如A→… Bb…的規 則,其中B => … a或 B=> … aC
  7. 算符優先關係表構造(貌似不考。)

  8. 素短語:設G是一個算符文法, β 是句型 α β δ 關於A 的短語且 β 含有至少一個終結符號,並且除自身外不再含有任何更小的帶終結符號的短語,則 β 是句型 α β δ 關於A的素短語。

  9. 最左素短語:文法G的句型 α 的最左邊的素短語為最左 素短語。

  10. 優先函式表的構造(貌似也不考。)

  11. 算符優先分析器

    1. 組成:總控程式+分析棧+優先函式表
  12. LR分析技術是編譯系統中語法分析器實現最常用、最有效的一種分析方法。

    1. LR->自左向右,最右推導的逆序(規範規約)
    2. LR分析器結構:
      1. 組成:總控程式+分析棧+LR分析表
      2. 例項
  13. 活字首:規範句型的不含控制代碼之後任何符號的字首,稱為該句型的活字首

  14. LR(0)專案:在文法G的每個產生式的右部(候選式)的任何位置上新增一個圓點,這樣構成的每個產生式稱為LR(0)專案。

    圓點的位置標記相應的候選式已被匹配(放入棧中)了多少

    專案分類:

    1. 規約專案
    2. 接受專案
    3. 移進專案
    4. 待約專案
  15. 構造識別文法G的所有活字首的非確定有限自動機NFA+識別文法G的所有活字首的DFA

  16. 文法G的LR(0)專案集規範族:識別文法G的活字首的DFA,其狀態中包含的LR(0)專案集的全體

    1. 構造方法一:
      1. 構造文法G的LR(0)專案;
      2. 基於LR(0)專案,構造識別文法 G所有活字首的NFA
      3. NFA確定化為DFA,該DFA的各個狀態所包含的專案集的集合,即構成了G的LR(0)專案集規範族。
    2. 構造方法二:(closure(專案集閉包)函式+GO(專案集轉移)函式)
      1. 拓廣文法。設G是一文法,S是它的開始符 號,則將產生式S′→S加入到G中構成新的文 法G′,S′為 G′的開始符號,G′稱為G的拓廣文 法(使文法開始符號的侯選式惟一)
      2. 構造文法G的LR(0)專案集規範族。
  17. 專案集閉包

    構造方法:

    1. I中的每一個專案皆屬於closure(I);
    2. 若形如A→ α ·Bβ(B∈VN) 的專案屬於I, 則對G中的任何產生式 B → γ 的第一個 LR(0)專案(B→· γ )也屬於closure(I);
    3. 重複上述步驟,直至不再有新的專案加入 closure(I)為止;
  18. 專案集轉換函式GO( I , X)

    若 I 是文法G的一個專案集,X為G 的 符號,則GO(I , X)=closure(J)。 其中 J={形如A→αX·β的專案|∃A→ α ·Xβ∈I}。(注意 · 的位置)

  19. LR(0)文法:若一個文法G的識別活字首的DFA的每一個 狀態(專案集規範族中的的每一個LR(0)專案集) 中不存在 ① 即含移進專案又含歸約專案; 和 ② 含有多個歸約專案; 則每個專案集的專案相容,稱G是一個 LR(0)文法。

  20. 構造LR(0)分析表

    演算法一(根據DFA)

    1. 若f (K,a)=j(a∈ V T),則置 action(K , a)=Sj;
    2. 若f (k ,A)=j (A∈ V N),則置 GOTO(K,A)=j ;
    3. 若A→ α ·∈k,則對所有終結符a和結束符“#”, 置action(K , a)=rj和 action(K , #)=rj。 (其中假設產生式A→ α ·是文法第 j 個產生式)
    4. 若S ′→ S · ∈k,則置action(K , #)=acc
    5. 表中空白置出錯標誌

    演算法二(根據GO函式以及專案集規範族)

    1. 若GO (Ik ,a)=Ij(a∈ V T),則置 action(K , a)=Sj
    2. 若GO (Ik ,A)=Ij(A∈ V N),則置 GOTO(K,A)=j ;
    3. 若A→ α ·∈Ik,則對所有終結符a和結束符 “#”,置action(K , a)=rj和 action(K , #)=rj。 (其中假設產生式A→ α ·是文法第 j 個產生式)
    4. 若S ′→S · ∈Ik,則置action(K , #)=acc;
    5. 表中空白置出錯標誌
  21. 專案集存在歸約-歸約衝突

    在識別活字首的DFA某一狀態(專案集規 範族的某一專案集)中,若既含有圓點不在 最後的移進專案,又含有圓點在最後的歸約項 目,則稱該專案集存在移進-歸約衝突。若含 有兩個或兩個以上圓點在最後的歸約專案,則 稱該專案集存在歸約-歸約衝突

  22. 構造SLR(1)分析表 (上面第3步時先判斷輸入符號是否屬於某個follow集)

    演算法:

    1. 若GO (Ik ,a)=Ij(a∈ V T),則置 action(K , a)=Sj
    2. 若GO (Ik ,A)=Ij(A∈ V N),則置 GOTO(K,A)=j ;
    3. 若A→ α ·∈Ik,則對所有a∈FOLLOW(A), 置action(K , a)=rj。 (其中假設產生式A→ α ·是文法第 j 個產生式)
    4. 若S ′→S · ∈Ik,則置action(K , #)=acc;
    5. 表中空白置出錯標誌
  23. 按照SLR(1)方法構造的文法G的LR分析 表,如果每個入口不含多重定義,則稱它為G 的SLR(1)分析表。具有SLR(1)分析表的文法G 稱為SLR(1)文法。使用SLR(1)分析表的語法分 析器稱作SLR(1)分析器

    SLR(1)分析表構造= SLR(1)方法+ LR(0)分析表構造

    SLR(1)方法 =有歸約專案的狀態中歸約動作的設定。

  24. LR(k)專案:文法G的一個LR(k)專案是 [A→ α ·β,a1a2 … ak ]其中: A→α ·β是一個LR( 0 )專案; ai∈ VT∪{#} ; a1 a2 … ak:搜尋符串

  25. LR(1)有效專案

    若文法G的一個LR(1)專案[A→α ·β,a]對活字首 γ 是有效的,當且僅當存在規範推導 S=(*)> δ Aω=(*)> δ α β ω 其中:ω∈VT*, γ = δ α ,a∈FIRST( ω )或 a為’#’(當 ω = ε ),稱a為搜尋符

六、語義分析與中間程式碼生成

  1. 語法制導翻譯:為文法的每一個產生式配一個相應的語義子程式(或語義規則描述的語義動作),並在語法分析的同時呼叫它。
  2. 屬性翻譯文法:把語義引入文法,給產生式中的文法符號附加“屬性”,構成涉及語義的翻譯文法
  3. 綜合屬性 :分析樹中,如果一個結點的屬性值是通過 子結點的屬性值計算得到則稱為綜合屬性。
  4. 繼承屬性 :分析樹中,如果一個結點的屬性值是由該 結點的父結點和(或)兄弟結點的屬性定義的 稱為繼承屬性
  5. 中間語言:
    1. 逆波蘭式
    2. N元式
      1. 三元式(三元式表)
      2. 間接三元式(間接碼錶+三元式表)
      3. 四元式 NO. ( OP, ARG1 , ARG2 ,Result)
    3. 圖(樹)
      1. 一個三元式 <–> 一棵子樹
      2. OP <–> 子樹根
      3. ARG1 <–> 子樹左葉節點
      4. ARG2 <–> 子樹右葉節點
  6. 符號表->整個編譯過程中動態地採集、記錄、變更、引用
    1. 定義:存放源程式中有關識別符號的屬性資訊的 資料結構。
    2. 結構:名稱域+屬性資訊域
    3. 作用:收集識別符號屬性資訊;語義檢查依據; 程式碼生成時地址分配依據
    4. 識別符號類的主要屬性和作用
      1. 識別符號名。作用:查重(考慮作用域和可視性前提)
      2. 型別。作用:儲存空間分配;可施加運算的檢查等
      3. 儲存類別。作用:提供語義處理、檢查、儲存 分配的依據。
      4. 作用域、可視性。作用:動態活動環境支援,提 供量所在層次;
  7. 語句標號表LT
    1. 構成:標號名 + 定義否(flag) + addr(1表示定義性出現,0表示使用性出現)
  8. 拉鍊反填技術:處理標號先引用後定義的情況,適用於一邊掃描的編譯器

八、程式碼優化

  1. 基本塊
    1. 特點1:唯一入口和唯一出口
    2. 特點2:沒有轉進轉出,分叉會合
  2. 基本塊劃分
    1. 確定每個基本塊的入口語句。
    2. 根據確定的基本塊的入口語句,構造 其所屬的基本塊
    3. 凡是未包含在基本塊中的語句,都是程式 的控制流不可到達的語句,直接從程式中刪除。
  3. 程式的控制流圖
  4. DAG 無環路的有向圖 ->確認的式基本塊內各四元式間的關係
  5. 迴圈
    1. 強連通性
    2. 入口唯一
  6. 必經節點:ni DOM nj -> 到達nj的任意通路都經過ni
  7. 必經節點集:D(n)
  8. 回邊:a→b是流圖G中一條有向邊,如果b DOM a, 則稱a→b是流圖G中的一條回邊。記< a, b >。