本節知識點是《編譯原理》第三章-詞法分析,學習參考教材為清華大學出版社《編譯原理》第三版:
前情提要:
字母表∑1和∑2的乘積( product):
∑1∑2 ={ab|a ∈∑1, b ∈ ∑2}
例: {0, 1} {a, b} ={0a, 0b, 1a, 1b}
字母表∑的n次冪( power):長度為n的符號串構成的集合
∑0 ={ ε }
∑n =∑n-1 ∑ , n ≥
例: {0, 1}3 ={0, 1} {0, 1} {0, 1}={000, 001, 010, 011, 100, 101, 110, 111}
字母表的正閉包(positive closure):長度正數的符號串構成的集合:
∑+ = ∑ ∪∑2 ∪∑3 ∪…
例:{a, b, c, d }+ = {a, b, c, d,aa, ab, ac, ad, ba, bb, bc, bd, …, aaa, aab, aac, aad, aba, abb, abc, …}
字母表的克林閉包(Kleene closure):任意符號串(長度可以為零)構成的集合:
∑* = ∑0 ∪∑+ = ∑0 ∪∑ ∪∑2 ∪∑3 ∪…
例:{a, b, c, d }* = {ε, a, b, c, d,aa, ab, ac, ad, ba, bb, bc, bd, …, aaa, aab, aac, aad, aba, abb, abc, …}
一、【 有窮自動機 】:
1、定義
有窮自動機 ( Finite Automata,FA )由兩位神經物理學家MeCuloch和Pitts於1948年首先提出,是對一類處理系統建立的數學模型
這類系統具有一系列離散的輸入輸出信息和有窮數目的內部狀態(狀態:概括了對過去輸入信息處理的狀況)
系統只需要根據當前所處的狀態和當前面臨的輸入信息就可以決定系統的后繼行為。每當系統處理了當前的輸入后,系統的內部狀態也將發生改變
2、Finite Automata的典型例子:
電梯控制裝置
輸入:顧客的乘梯需求(所要到達的層號)
狀態:電梯所處的層數+運動方向
電梯控制裝置並不需要記住先前全部的服務要求,只需要知道電梯當前所處的狀態以及還沒有滿足的所有服務請求
3、Finite Automata模型示意:
輸入帶(input tape):用來存放輸入符號串
讀頭(head ):從左向右逐個讀取輸入符號,不能修改(只讀)、不能往返移動
有窮控制器( finite control ):具有有窮個狀態數,根據當前的狀態和當前輸入符號控制轉入下一狀態
4、FiniteAutomata的表示:
轉換圖 (Transition Graph)
結點:FA的狀態
初始狀態(開始狀態):只有一個,由start箭頭指向
終止狀態(接收狀態):可以有多個,用雙圈表示
帶標記的有向邊:如果對於輸入a,存在一個從狀態p到狀態q的轉換,就在p、q之間畫一條有向邊,並標記上a
5、Finite Automata定義(接收)的語言
給定輸入串x,如果存在一個對應於串x的從初始狀態到某個終止狀態的轉換序列,則稱串x被該FA接收
由一個有窮自動機M接收的所有串構成的集合稱為是該FA定義(或接收)的語言,記為L(M (machine))
6、最長子串匹配原則(Longest String Matching Principle )
·當輸入串的多個前綴與一個或多個模式匹配時,總是選擇最長的前綴進行匹配
·在到達某個終態之后,只要輸入帶上還有符號, DFA就繼續前進,以便尋找盡可能長的匹配
二、【 有窮自動機的分類 】:
確定的FA (Deterministic finite automata, DFA)
非確定的FA (Nondeterministic finite automata, NFA)
1、確定的有窮自動機DFA(Deterministic Finite Automata)
M = ( S,Σ ,δ,s0,F )
S:有窮狀態集
Σ:輸入字母表,即輸入符號集合。假設ε不是 Σ中的元素
δ:將S×Σ映射到S的轉換函數。s∈S, a∈Σ, δ(s,a)表示從狀態s出發,沿着標記為a的邊所能到達的狀態。
s0:開始狀態 (或初始狀態),s0∈S
F:接收狀態(或終止狀態)集合,F⊆ S
例如下圖所展示的一個DFA
2、非確定的有窮自動機NFA(NonDeterministic Finite Automata)
M = ( S,Σ ,δ,s0,F )
S:有窮狀態集
Σ:輸入符號集合,即輸入字母表。假設ε 不是Σ中的元素
δ:將S×Σ映射到2S的轉換函數。s∈S, a∈Σ, δ(s,a)表示從狀態s出發,沿着標記為a的邊所能到達的狀態集合
s0:開始狀態 (或初始狀態),s0∈S
F:接收狀態(或終止狀態)集合,F⊆ S
例如下圖所展示的一個NFA
(DFA與NFA的區別在於:如上圖用紅色方框標出的位置,DFA的每一次輸入只對應一個結果,而NFA的依次輸入可能對應多個結果,形成一個結果集,后面將使用子集法將NFA構造為DFA)。
3、DFA和NFA的等價性
①
對任何非確定的有窮自動機N ,存在定義同一語言的確定的有窮自動機D
對任何確定的有窮自動機D ,存在定義同一語言的非確定的有窮自動機N
②
DFA和NFA可以識別相同的語言(如下圖舉例所示)
4、帶有“ε-邊”的NFA
M = ( S,Σ ,δ,s0,F )
S:有窮狀態集
Σ:輸入符號集合,即輸入字母表。假設ε不是Σ中的元素
δ:將S×(Σ∪{ε})映射到2S的轉換函數。s∈S, a∈Σ∪{ε}, δ(s,a)表示從狀態s出發,沿着標記為a的邊所能到達的狀態集合
s0:開始狀態 (或初始狀態),s0∈S
F:接收狀態(或終止狀態)集合,F⊆ S
5、帶有和不帶有“ε-邊”的NFA 的等價性
6、DFA的算法實現
輸入:以文件結束符eof結尾的字符串x。DFA D 的開始狀態s0,接收狀態集 F,轉換函數move。
輸出:如果 D接收 x,則回答“yes”,否則回答“no”。
方法:將下述算法應用於輸入串 x。
s = s0 ; c = nextChar(); while(c! = eof ){ s = move ( s , c ) ; c = nextChar ( ) ; } if (s在F中) return“yes”; else return “no”;
函數nextChar( )返回輸入串x的下一個符號
函數move(s, c)表示從狀態s出發,沿着標記為c的邊所能到達的狀態
三、【 從正則表達式到有窮自動機 】
根據RE 構造NFA
□ ε對應的NFA
□ 字母表Σ中符號a對應的NFA
□ r = r1r2對應的NFA
□ r = r1|r2對應的NFA
□ r = (r1)*對應的NFA
例:r=(a|b)*abb 對應的NFA