whdAlive 's blog
一、概論。
- 將某一種 程式設計語言 寫的 程式 翻譯成等價的 另一種語言 的 程式 的程式, 稱之為編譯程式(compiler) 。
- 遍:對源程式或源程式的中間形式從頭到尾掃描一遍,並做有關的分析加工,生成新的源程式的中間形式或生成目標程式。
二、形式語言與自動機基礎
BNF : 用來表示語法 eg. <句子> -> <主語><謂語>
字母表(符號集):字母表是元素的非空有窮集合。字母表中的元素
稱為符號或字元,因此字母表也稱為符號集,用大寫字母A或希臘字母∑表示符號串:由字母表中的符號組成的任何有窮序列稱為符號串,也稱為串或字串。用小寫希臘字母表示符號串,如如 ω =STR
- 字首: ω 是一個符號串,從 ω 的尾部刪去0個或若
幹個符號之後剩餘的部分稱為 ω 的字首。 (真字首不是原符號串) - 字尾:從 ω 的首部刪去0個或若干個符號之後剩餘的部 分稱為ω 的字尾。(真字尾不是原符號串)
- 子符號串:從一個符號串中刪去它的一個字首 和一個字尾之 後剩餘的部分稱為該符號串的子符號串或子串。
- 字首: ω 是一個符號串,從 ω 的尾部刪去0個或若
符號串的連線:設 ω 和 υ是兩個符號串,如果將符號串 υ 直接拼接在符號串 ω 之後,則稱此操作為符號串 ω 和 υ的連線,記作 ω υ。
eg. ω=abc,υ =xyz則 ω υ=abcxyz
符號串的方冪:設 ω 是某字母表上符號串,把 ω 自身連線 n 次得 到符號串 υ ,即 υ = ω ω … ω (n個 ω ) ,稱 υ 是符號 串 ω 的n次冪,記作 υ = ω ^n。
符號串集合的乘積:設A、B 是兩個符號串集合,AB表示A與B的乘積,則有定義 AB={ ω υ| ( ω ∈A)∧( υ∈B) }
如:設A={ab,c}, B={d,ef}, 則 AB={abd, abef, cd, cef}
符號串集合的方冪:設A是符號串集合,A自身的乘積可以用方冪表示。A0= { ε } A^1=A A^2=AA A^3= A^2A =AAA
符號串集合的並(並集)
符號串集合的閉包:
- 正閉包:設A為符號串集,A的正閉包記作A+,有 A+= A1∪ A2∪…∪ An∪…
- 自反閉包:A*定義為A的自反閉包,有 A*= A0∪ A+= { ε }∪ A+= A+∪{ ε }
文法:一部文法G是一個四元組 G =( VN, VT, S, P)
- VN:非空有限的非終結符號集(一般用大寫字母表示)。其中 的元素稱為非終結符,或語法變數,代表了一個語法範疇
- VT:非空有限的終結符號集(一般用小寫字母表示)。
- S:文法的開始符號或識別符號,亦稱公理,S ∈VN。S代表 語言最終要得到的語法範疇。
- P:有限產生式集。
產生式就是按一定格式書寫的定義語法範疇的文法規則,它是一部文法的實體。
語言的非形式化定義:給定一部文法G, 從G的開始符號S出發,反覆使 用產生式對非終結符進行替換,最後所得到的終結符 號串的全體,即為文法G所描述的語言L(G)。
如:設有文法G: S → P | aPb,P → ba | bQa,Q → ab ;
L(G)={ba, baba, abab, ababab}
直接推導=>:有 ν = α Aβ=> α γβ= ω ( α ,β,γ∈(VN∪VT)*),當且 僅當P中存在一條規則A ->γ,稱 ν 直接推匯出 ω (或 ω 直接歸約到 ν ),記作: ν => ω 。
直接推導序列: 則 ν 經過n步(n>0)可以推匯出ω ,記作:ν =(+)>ω 。當ν=>ω 或 ν=ω ,記作: ν(*)=>ω
句型:設有文法G[S],若 S =(*)> α ( α ∈(VT∪VN)*),則稱
α 為G[S]的句型句子:設有文法G[S] , 若S =(*)>α ( α∈VT*) ,則稱 α 為G[S]的句子。
最左(右)推導
規範推導/規範句型/規範歸納:最右推導也稱為規範推導 。僅用規範推導得到的句型稱為規範句型 。規範推導的逆序為規範歸約。
遞迴文法:設有文法G,A→ γ是G的產生式,若 γ 具有 α A β的形式,或 γ
=(+)>α A β ,則稱G是遞迴文法。- 若 α = ε ,則G為左遞迴文法。
- 若 β=ε ,則G為右遞迴文法
語言:文法 G所產生(描述)的語言L(G): L(G) = { α | α ∈VT*∧ S =(+)> α ,S是文法 G 的開始符號 }
文法等價:若 L(G1)= L(G2),則稱文法G1和G2是等價的
EBNF:擴充BNF,假如{} () []
語法圖:
- 由一組圖組成,每個圖定義了一個非終結符的產生式 。
- 每個圖都有一個起始結點和一個終止結點,其他的結點標記為 文法符號。
- 終結符結點用圓形表示。
- 非終結符結點用方形表示。
- 從起始結點到終止結點的所有路徑(標記為結點序列)定義候 選式。
語法分析樹
二義文法:對一部文法G,如果至少存在一個句子,有兩棵 ( 或兩棵以上 )不同的分析樹,則稱該句子是二義性的。包含有二義性句子的文法稱為二義文法。否則,該文法是無二義性的
- 文法二義與語義二義無關
文法二義性消除:構造G1′ ,使L( G1)=L( G1′)
文法分類:
- 0型(短語)文法:如果對文法G中的規則 α → β 不加任何限制,則稱G 為0型文法或短語文法。
- 1型文法(上下文有關文法):設文法G=(VN,VT,S,P),對P中的每個產生式(除 S → ε 外,但此時S不得出現在任何產生式的右部 ) 限制為形如:α A β → α γ β其中,A∈VN, α , β ∈(VT∪VN)﹡, γ ∈(VT∪VN)+, 則稱文法G為1型文法或上下文有關文法。
- 2型文法(上下文無關文法):設文法G =(VN,VT, S , P),對P中的每個產生 式限制形如: A→ α 其中,A∈VN, α ∈(VT∪VN)* 則稱文法G為2型文法。
- 3型文法(正則文法、線性文法):設文法G=(VN,VT, S, P),對P中的每個產生式 形如: A→ α B 或A→ α 或者(A→B α 或 A→ α) 其中,A,B∈ VN, α ∈VT*,則稱文法G為3型文法 (正則文法或線性文法)。
確定的有限狀態自動機DFA:一個確定的有限自動機M ( DFA M)是一個五 元組 M =(Q, ∑ , f, q0, Z)
Q:狀態的有限集合,每個元素qi(qi∈Q) 稱為一 個狀態。
∑ :輸入字元的有限集合(或有窮字母表)。
f:狀態轉換函式:從Q× ∑ →Q的對映。 例如, f(p,a)=q, q、p∈Q, a∈ ∑ 。表示了在狀 態p讀入字元a後轉入狀態q。q也稱為p的 後繼狀態
q0:M的唯一初態(也稱開始狀態),q0∈Q
Z: M的終態集(或接受狀態集) Z⊆Q。
形式定義<->狀態轉換圖 <-> 狀態轉換表
DFA識別機制:(識別方法)
L(M) 為全部接收的字串
非確定的有限狀態自動機NFA:一個非確定的有限自動機M ( NFA M)是一個五元組M =(Q,∑ , f, q0, Z)
- Q,∑ , Z, q0同DFA
- f:狀態轉換函式。 從Q×( ∑ ∪{ ε }) →2Q的對映。這裡的後繼狀態不 是唯一的,它是狀態集Q的子集。
識別機制:L(M) 為全部接收的字串
NFA確定化
- 對任何一個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)})。
DFA化簡
通過刪除無關狀態,合併等價狀態的規約過程,直至得到規約機( 最小的DFA)
無關狀態或多餘狀態或無用狀態
如果從DFA M的初態開始,任何輸入序列都不能到達的那些狀態稱為無關狀態
等價狀態、可區分狀態
設DFAM的兩個不同狀態 q1,q2,如果對任意 輸入字串ω,從q1,q2狀態出發,總是同時到達接收狀態或拒絕狀態之中,稱q1,q2是等價的。
正則文法與有限自動機
設文法G=(VN, VT, S, P)為一右線性文法(左線性文法結論相同),則存在一有限自動機M=( Q, ∑ , f, q0, Z),使得:L(M)=L(G)
構造
- ∑ = VT
- q0= S
- Q= VN∪{qz}, qz為一附加狀態且qz∉ VN
- Z= {qz}
- f:若P中有產生式B →a, 則qz∈f(B,a) 若P中有產生式B →aC,則C∈f(B,a) a∈VT∪{ε}
正規式與正規集
- ε和Ф是∑上的正規式,它們表示的正規集分別 為{ε}和Ф;
- 對任何a∈∑,a是∑上的正規式,它表示的正規集為{a};
- 若r,s都是正規式 , 對應的正規集分別為R和S , 則 (r|s)、(r·s)、(r)*也是正規式,它們表示的正規集分別是:R∪S,RS,R*。
- 有限次使用上述三條規則構成的表示式,稱為∑上 的正規式,僅由這些正規式表示的集合為正規集
正規式與有限自動機的等價
- 字母表∑上的有限自動機M所接受的語言 L(M) 是∑上的一個正規集;
- 對於∑上的每一個正規式 r,存在一個∑上的有 限自動機M,使得:L(M)=L(r)。
三、詞法分析
屬性字:對所識別的單詞的資料結構表示。
L1= ( T(Token),C(Code))
掃描器設計與實現
作為掃描器的狀態轉換圖(FA)的構造
- 對語言的各類單詞分別構造狀態圖
- 將各類狀態圖合併,構成一個能識別該語言所有單詞的狀態圖。
- 將各類單詞的狀態圖的初態合併為一個惟一初態;
- 調整衝突編號。
狀態轉換圖實現之一:資料中心法
將狀態轉換圖看成一種資料結構(狀態表),用總控程式控制輸入的源程式串在其上執行。
- 主表: 資料項= 狀態 + 分表地址或子程式入口
- 分表: 資料項= 當前輸入字元 + 轉換狀態
狀態轉換圖實現之二:程式中心法
將狀態轉換圖看成一個流程圖,從初態開始對 它的每個節點(狀態)編寫一函式或直接跟蹤狀態 圖從初態開始的轉換完成所有分支的跟蹤來編寫程 序。
四、語法分析–自上而下分析法
不確定性
消除直接左遞迴:對P→P α|β, α 、 β ∈(VT∪VN)* 修改為P→ β P′, P′→ α P′|ε
消除間接左遞迴:
把間接左遞迴文法改寫為直接左遞迴文法;
依次按照C,B,A的順序向前帶入,注意只替換A->Ba這種形式,A->aB無需替換
用消除直接左遞迴的方法改寫文法
消除回溯:利用First和Follow
First集
設G是二型文法,則G中的任意 α∈V*的終結首符集FIRST( α )為 FIRST ( α ) = { a |α=> a ……,a∈VT } 若α =>ε, 則ε∈FIRST( α ) 。
演算法:
計算FIRST(X)(X∈V)
- 若X是終結符,則FIRST(X)={X};
- 若X是非終結符,X的FIRST為其所有候選式的 FIRST集合的並集。
計算FIRST( α )( α ∈V*)
設 α =X1X2… Xk (Xi∈V)
- FIRST(X1)中的所有終結符號加到FIRST( α )中;
- 若對於某個i,a∈ FIRST(Xi)且X1X2… Xi-1⇒ ε, 則將a加到FIRST( α )中;
- 若對於所有的j=1,2,…,k, ε ∈ FIRST(Xj), 則將 ε 加到FIRST( α )中
對非終結符A的多個候選式的FIRST( αi)的相互兩個彼此交集≠Φ,一般是因為 αi中有公共左因子,可 以通過提取左公因子來改造文法。(由BNF正規化改 EBNF正規化)
狀態圖構造(為文法G的每個VN )
- 建立1個初態和1個終態(函式返回態);
- 為每個產生式 A→ x1x2 … xn 建立從初態到終 態的路徑,弧標記為x1,x2, …,xn ;
化簡遞迴下降分析器(化簡狀態圖)
LL(1)分析法
- 顯式地維護一個狀態棧,而不是通過隱式的遞迴呼叫來做自上而下的語法分析
- 邏輯結構:總控程式,LL(1)分析表,分析棧
Follow集
- 設上下文無關文法G,S是文法的開始符 號,對於文法G的任何非終結符A FOLLOW(A)={a|S=>…Aa…,a∈VT} 若S=>…A,則令#∈FOLLOW(A)。
- FOLLOW(A)的含義是指,在文法G的句型中,能夠緊跟著A之後的一切終結符或“#”
- 演算法:
- 對文法的開始符號S,令#∈FOLLOW(S) ;
- 若文法G中有形如A→ α Bβ的規則,且β≠ε, 則將FIRST(β)中的一切非ε符號加入 FOLLOW(B);
- 若G中有形如 A→α B 或 A→α Bβ的規則,且ε∈FIRST(β),則FOLLOW(A)中的全部元素 屬於FOLLOW(B)
LL(1)分析表的構造
- 對文法G,若G中對非終結符A的產生式形如 A→ α | β 且 α 和 β 均不推出ε,則可產生LL(1)分析表的A行為:
- 對∀ a∈FIRST( α ) ,a列即 M (A,a) = { A→ α }
- 對∀ b∈FIRST( β ) ,b列即 M (A,b) = { A→ β }
- 對A→ α | β 且α 或 β 推出ε的情況,產生LL(1)分 析表的A行為,
- 若 α =>ε 對∀ a∈FIRST( α )∪FOLLOW(A), a列即 M (A,a) = { A→ α }
- 若 α 不推出空串, 對∀ a∈FIRST( α ) ,a列即 M (A,a) = { A→ α}
- 若 β=>ε 對∀ b∈FIRST( β )∪FOLLOW(A), b列即 M (A,b) = { A→ β }
- 若 β 不推出空串, 對∀ b∈FIRST( α ) ,b列即 M (A,b) = { A→β }
- 對文法G,若G中對非終結符A的產生式形如 A→ α | β 且 α 和 β 均不推出ε,則可產生LL(1)分析表的A行為:
LL(1)重要性質
- 任何LL(1)文法是無二義性的。
- 若一文法為左遞迴文法,則它必然是非 LL(1)文法。
- 非LL(1)語言是存在的。
- 存在一種演算法,它能判定任一文法是否為 LL(1)文法。
- 不存在這樣的演算法,它能判定上下文無關 語言能否由LL(1)文法產生。
非左遞迴文法G為LL(1)文法⇔G的任何一個非 終結符 A,設關於A的產生式為 A→ α 1 | α 2 |…| α n 滿足下面的條件:
- 每個候選式 α i,FIRST( α i)兩兩彼此互不相 交。
- 若有 α i =>0,則FIRST(α) ∩ FOLLOW(A) = ∅。
五、語法分析–自下而上分析法
短語:S是文法G的開始符號,α β δ 是G的一個句型,若 S =>α A δ 且A =(+)>β,則 β 是句型 α β δ 相對於A的短語
直接短語:S是文法G的開始符號,α β δ 是G的一個句型,若 S =>α A δ 且A→ β ,則 β 是句型 α β δ 相對於A的直接短語
控制代碼:一個句型的最左直接短語稱為控制代碼
(所有短語根據子樹的葉子節點判斷即可)
算符優先分析法
- 基本思想:對給定的G按照一定原則求出G的文法符號間的優先關係,按照優先關係確定可歸約子串實施歸約。
算符文法(OG):設有一文法G,如果G中沒有 U→…VW… 的規則,其中V,W,U∈ VN,則稱文法G 是算符文法(OG)
算符文法的任何句型都不會含有兩個相鄰的非終結符
算符優先文法(OPG)
設G是一不含P→ε形式規則的算符文法,則對於任何a,b有:
- a≐b,當且僅當文法G中有形如 A→… ab… 或 A→… aBb…的規則:
- a⋖b,當且僅當文法G中有形如A→… aB…的規 則,其中B=>b… 或 B=> Cb… ;
- a⋗b,當且僅當文法G中有形如A→… Bb…的規 則,其中B => … a或 B=> … aC
算符優先關係表構造(貌似不考。)
素短語:設G是一個算符文法, β 是句型 α β δ 關於A 的短語且 β 含有至少一個終結符號,並且除自身外不再含有任何更小的帶終結符號的短語,則 β 是句型 α β δ 關於A的素短語。
最左素短語:文法G的句型 α 的最左邊的素短語為最左 素短語。
優先函式表的構造(貌似也不考。)
算符優先分析器
- 組成:總控程式+分析棧+優先函式表
LR分析技術是編譯系統中語法分析器實現最常用、最有效的一種分析方法。
- LR->自左向右,最右推導的逆序(規範規約)
- LR分析器結構:
- 組成:總控程式+分析棧+LR分析表
- 例項
活字首:規範句型的不含控制代碼之後任何符號的字首,稱為該句型的活字首
LR(0)專案:在文法G的每個產生式的右部(候選式)的任何位置上新增一個圓點,這樣構成的每個產生式稱為LR(0)專案。
圓點的位置標記相應的候選式已被匹配(放入棧中)了多少
專案分類:
- 規約專案
- 接受專案
- 移進專案
- 待約專案
構造識別文法G的所有活字首的非確定有限自動機NFA+識別文法G的所有活字首的DFA
文法G的LR(0)專案集規範族:識別文法G的活字首的DFA,其狀態中包含的LR(0)專案集的全體
- 構造方法一:
- 構造文法G的LR(0)專案;
- 基於LR(0)專案,構造識別文法 G所有活字首的NFA
- NFA確定化為DFA,該DFA的各個狀態所包含的專案集的集合,即構成了G的LR(0)專案集規範族。
- 構造方法二:(closure(專案集閉包)函式+GO(專案集轉移)函式)
- 拓廣文法。設G是一文法,S是它的開始符 號,則將產生式S′→S加入到G中構成新的文 法G′,S′為 G′的開始符號,G′稱為G的拓廣文 法(使文法開始符號的侯選式惟一)
- 構造文法G的LR(0)專案集規範族。
- 構造方法一:
專案集閉包
構造方法:
- I中的每一個專案皆屬於closure(I);
- 若形如A→ α ·Bβ(B∈VN) 的專案屬於I, 則對G中的任何產生式 B → γ 的第一個 LR(0)專案(B→· γ )也屬於closure(I);
- 重複上述步驟,直至不再有新的專案加入 closure(I)為止;
專案集轉換函式GO( I , X)
若 I 是文法G的一個專案集,X為G 的 符號,則GO(I , X)=closure(J)。 其中 J={形如A→αX·β的專案|∃A→ α ·Xβ∈I}。(注意 · 的位置)
LR(0)文法:若一個文法G的識別活字首的DFA的每一個 狀態(專案集規範族中的的每一個LR(0)專案集) 中不存在 ① 即含移進專案又含歸約專案; 和 ② 含有多個歸約專案; 則每個專案集的專案相容,稱G是一個 LR(0)文法。
構造LR(0)分析表
演算法一(根據DFA)
- 若f (K,a)=j(a∈ V T),則置 action(K , a)=Sj;
- 若f (k ,A)=j (A∈ V N),則置 GOTO(K,A)=j ;
- 若A→ α ·∈k,則對所有終結符a和結束符“#”, 置action(K , a)=rj和 action(K , #)=rj。 (其中假設產生式A→ α ·是文法第 j 個產生式)
- 若S ′→ S · ∈k,則置action(K , #)=acc
- 表中空白置出錯標誌
演算法二(根據GO函式以及專案集規範族)
- 若GO (Ik ,a)=Ij(a∈ V T),則置 action(K , a)=Sj
- 若GO (Ik ,A)=Ij(A∈ V N),則置 GOTO(K,A)=j ;
- 若A→ α ·∈Ik,則對所有終結符a和結束符 “#”,置action(K , a)=rj和 action(K , #)=rj。 (其中假設產生式A→ α ·是文法第 j 個產生式)
- 若S ′→S · ∈Ik,則置action(K , #)=acc;
- 表中空白置出錯標誌
專案集存在歸約-歸約衝突
在識別活字首的DFA某一狀態(專案集規 範族的某一專案集)中,若既含有圓點不在 最後的移進專案,又含有圓點在最後的歸約項 目,則稱該專案集存在移進-歸約衝突。若含 有兩個或兩個以上圓點在最後的歸約專案,則 稱該專案集存在歸約-歸約衝突
構造SLR(1)分析表 (上面第3步時先判斷輸入符號是否屬於某個follow集)
演算法:
- 若GO (Ik ,a)=Ij(a∈ V T),則置 action(K , a)=Sj
- 若GO (Ik ,A)=Ij(A∈ V N),則置 GOTO(K,A)=j ;
- 若A→ α ·∈Ik,則對所有a∈FOLLOW(A), 置action(K , a)=rj。 (其中假設產生式A→ α ·是文法第 j 個產生式)
- 若S ′→S · ∈Ik,則置action(K , #)=acc;
- 表中空白置出錯標誌
按照SLR(1)方法構造的文法G的LR分析 表,如果每個入口不含多重定義,則稱它為G 的SLR(1)分析表。具有SLR(1)分析表的文法G 稱為SLR(1)文法。使用SLR(1)分析表的語法分 析器稱作SLR(1)分析器
SLR(1)分析表構造= SLR(1)方法+ LR(0)分析表構造
SLR(1)方法 =有歸約專案的狀態中歸約動作的設定。
LR(k)專案:文法G的一個LR(k)專案是 [A→ α ·β,a1a2 … ak ]其中: A→α ·β是一個LR( 0 )專案; ai∈ VT∪{#} ; a1 a2 … ak:搜尋符串
LR(1)有效專案
若文法G的一個LR(1)專案[A→α ·β,a]對活字首 γ 是有效的,當且僅當存在規範推導 S=(*)> δ Aω=(*)> δ α β ω 其中:ω∈VT*, γ = δ α ,a∈FIRST( ω )或 a為’#’(當 ω = ε ),稱a為搜尋符
六、語義分析與中間程式碼生成
- 語法制導翻譯:為文法的每一個產生式配一個相應的語義子程式(或語義規則描述的語義動作),並在語法分析的同時呼叫它。
- 屬性翻譯文法:把語義引入文法,給產生式中的文法符號附加“屬性”,構成涉及語義的翻譯文法
- 綜合屬性 :分析樹中,如果一個結點的屬性值是通過 子結點的屬性值計算得到則稱為綜合屬性。
- 繼承屬性 :分析樹中,如果一個結點的屬性值是由該 結點的父結點和(或)兄弟結點的屬性定義的 稱為繼承屬性
- 中間語言:
- 逆波蘭式
- N元式
- 三元式(三元式表)
- 間接三元式(間接碼錶+三元式表)
- 四元式 NO. ( OP, ARG1 , ARG2 ,Result)
- 圖(樹)
- 一個三元式 <–> 一棵子樹
- OP <–> 子樹根
- ARG1 <–> 子樹左葉節點
- ARG2 <–> 子樹右葉節點
- 符號表->整個編譯過程中動態地採集、記錄、變更、引用
- 定義:存放源程式中有關識別符號的屬性資訊的 資料結構。
- 結構:名稱域+屬性資訊域
- 作用:收集識別符號屬性資訊;語義檢查依據; 程式碼生成時地址分配依據
- 識別符號類的主要屬性和作用
- 識別符號名。作用:查重(考慮作用域和可視性前提)
- 型別。作用:儲存空間分配;可施加運算的檢查等
- 儲存類別。作用:提供語義處理、檢查、儲存 分配的依據。
- 作用域、可視性。作用:動態活動環境支援,提 供量所在層次;
- 語句標號表LT
- 構成:標號名 + 定義否(flag) + addr(1表示定義性出現,0表示使用性出現)
- 拉鍊反填技術:處理標號先引用後定義的情況,適用於一邊掃描的編譯器
八、程式碼優化
- 基本塊
- 特點1:唯一入口和唯一出口
- 特點2:沒有轉進轉出,分叉會合
- 基本塊劃分
- 確定每個基本塊的入口語句。
- 根據確定的基本塊的入口語句,構造 其所屬的基本塊
- 凡是未包含在基本塊中的語句,都是程式 的控制流不可到達的語句,直接從程式中刪除。
- 程式的控制流圖
- DAG 無環路的有向圖 ->確認的式基本塊內各四元式間的關係
- 迴圈
- 強連通性
- 入口唯一
- 必經節點:ni DOM nj -> 到達nj的任意通路都經過ni
- 必經節點集:D(n)
- 回邊:a→b是流圖G中一條有向邊,如果b DOM a, 則稱a→b是流圖G中的一條回邊。記< a, b >。