【第三章】詞法分析

第三章.詞法分析

詞法分析器做用

將源程序的字符串流,組成詞素,生成一個詞法單元序列(詞法單元包含詞法單元名和屬性值構成)。正則表達式

對於詞法分析器發現的標識符詞素時,會將詞素添加到符號表中。算法

詞法分析器→語法分析器遞歸

常見的詞法單元和詞素字符串

詞法單元 描述 詞素
if 字符i,f if
else 字符e,l,s,e else
comparison 大於小於 > <
id 字母開頭的變量 po,D2
number 數字 3.14 2

詞法單元的規約

正則表達式:用來描述詞素的重要表示方法。it

串相關table

  • 前綴,後綴,子串,子序列(字符能夠不連續)

正則表達式能夠由嬌小的正則表達式按照規則遞歸構建。class

r={a,b,c,d...x,y,z} s={0,1,2,3...9}變量

  • (r)|(s) 等價於 L(r)交L(s) 共36個
  • (r)(s) 等價於 L(r)xL(s) 共26*10個
  • (r)* 全部r字母構成的集合,包括空串
  • s+表示一個或多個數位構成的串的集合

正則的擴展擴展

  • 一個或多個實例。用單目運算符+
  • 零個或一個實力。用單目運算符? ,r?等價 r|空

詞法單元識別

狀態轉換圖:構造詞法分析器的一箇中間步驟,構造狀態轉換圖。語法

  • 雙圈表示接受狀態,能夠是返回詞法單元的相關屬性值
  • *星號表示回退上一個狀態。

能夠用while,switch實現狀態轉換圖

有窮自動機(finite automata)

將出入程序變成一個詞法分析器,自動機的本質是與狀態轉換圖相似的圖。

  • 有窮自動機是識別器,只能對每一個可能的輸入串回答Y/N
  • 不肯定有窮自動機(Nondeterministic Finite Automata,NFA)對邊上的標號沒有任何限制。
  • 肯定的有窮自動機(Deterministic Finite Automata,DFA)對於每一個狀態及自動機輸入的字母表符號,有且只有一條離開狀態。

不肯定的有窮自動機(NFA)

對邊上的標號沒有任何限制,一個符號標記離開同一狀態的多條邊,空串也能夠做爲標號。

  • 可用轉換表表示,行爲狀態,列爲輸入符號,記錄各個可能的全部狀態
狀態 a b c
0 {0,1} {0}
1 {2}
2 {3}
3

肯定的有窮自動機(DFA)

屬於NFA的一個特例,說NFA是一個抽象表示的識別串的算法,DFA就是一個具體的識別串的算法。

  • 沒有輸入 空 之上的轉換動做
  • 對於每一個狀態s每一個輸入符號a,有且只有一條標號爲a的邊離開s

從正則表達式到自動機

利用子集構造法將NFA轉成DFA
基本思想讓構造獲得的DFA每一個狀態對應於NFA的一個狀態集合

輸入:一個NFA N

輸出:一個轉換後的DFA D

方法:爲D構造一個轉化表Dtran,D的每一個狀態都是一個NFA狀態集合,利用Dtran,使D能夠"並行"的模擬N遇到一個給定輸入串時能夠執行的全部動做。需要解決的問題包括,正確處理N的 空串 的轉換。

最小化一個DFA的狀態數

例中A和C等價,都不接受狀態,對於任意輸入總能轉到同一個狀態。

結論:對於任何正則語言都有一個惟一的 狀態數目最少的DFA,經過分組合並並等價的狀態,能夠構造狀態數最少的DFA。

死狀態:全部輸入符號上都轉向本身的非接受狀態。在一個DFA中,每一個狀態出發每一個輸入符號上都會有一個轉換,發現正確詞素的時候DFA結束。

從正則表達式構造NFA

能夠將任何正則表達式變爲接受相同語言的NFA。這個算法是語法制導的,就是沿着正則表達式的語法分析樹自底向上遞歸進行處理。

對於每一個子表達式,構造一個只有一個接受狀態的NFA。

不一樣方法的開銷

自動機 初始開銷 每一個串的開銷
NFA O(r) O(rxs)
DFA typical case O(r^3) O(s)
DFA worst case O(r^2*2^r) O(s)

若是處理字符串所花時間不少,更傾向DFA。然而像grep這樣的命令,只會對一個符號串運行自動機,一般使用NFA方式。

相關文章
相關標籤/搜索