將源程序的字符串流,組成詞素,生成一個詞法單元序列(詞法單元包含詞法單元名和屬性值構成)。正則表達式
對於詞法分析器發現的標識符詞素時,會將詞素添加到符號表中。算法
詞法分析器→語法分析器遞歸
常見的詞法單元和詞素字符串
詞法單元 | 描述 | 詞素 |
---|---|---|
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}變量
正則的擴展擴展
狀態轉換圖:構造詞法分析器的一箇中間步驟,構造狀態轉換圖。語法
能夠用while,switch實現狀態轉換圖
將出入程序變成一個詞法分析器,自動機的本質是與狀態轉換圖相似的圖。
對邊上的標號沒有任何限制,一個符號標記離開同一狀態的多條邊,空串也能夠做爲標號。
狀態 | a | b | c |
---|---|---|---|
0 | {0,1} | {0} | 空 |
1 | 空 | {2} | 空 |
2 | 空 | {3} | 空 |
3 | 空 | 空 | 空 |
屬於NFA的一個特例,說NFA是一個抽象表示的識別串的算法,DFA就是一個具體的識別串的算法。
利用子集構造法將NFA轉成DFA
基本思想讓構造獲得的DFA每一個狀態對應於NFA的一個狀態集合
輸入:一個NFA N
輸出:一個轉換後的DFA D
方法:爲D構造一個轉化表Dtran,D的每一個狀態都是一個NFA狀態集合,利用Dtran,使D能夠"並行"的模擬N遇到一個給定輸入串時能夠執行的全部動做。需要解決的問題包括,正確處理N的 空串 的轉換。
例中A和C等價,都不接受狀態,對於任意輸入總能轉到同一個狀態。
結論:對於任何正則語言都有一個惟一的 狀態數目最少的DFA,經過分組合並並等價的狀態,能夠構造狀態數最少的DFA。
死狀態:全部輸入符號上都轉向本身的非接受狀態。在一個DFA中,每一個狀態出發每一個輸入符號上都會有一個轉換,發現正確詞素的時候DFA結束。
能夠將任何正則表達式變爲接受相同語言的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方式。