3.1 詞法分析的作用
從源程序的字符串中找到logic unit邏輯單元(又稱__token 語法單元__)
- token: 語法單元,以一個語法單元名和一個可選屬性組成
- <id, 2> : 標識符,其詳細信息在符號表地址爲2的地方
- <number, 100>
- <add_op>
- pattern: 模式,一個token的詞素可能有的形式,可以匹配一個或多個字符串,如“所有整數”的模式
- lexeme :詞素,源程序的一個字符序列,與某個模式匹配
3.2 正規式
正則表達式(正規式regular expression)表示一種特定的模式 pattern。正規式不是能表達所有字符串,如anban
符合正規式r的所有字符串集合稱爲r定義的語言,寫作L®。
其中包含所有的字符集合叫alphabet字母表,寫作Σ
ε表示空字符串
三種運算符
- 選擇 | ,L(r|s) = L®∪L(s)
- 連接,如ab,並列就表示連接, (a|b)c = (ac) | (bc)
- 重複/閉包 , a = ε,a,aa,……
優先級: * > 連接 > |
轉義字符(escape character) :\
定義正規式:
自定義:digit -> 0|1|2|3|4|5|6|7|8|9
digit digit*
延伸定義
【0-9】 = 0|1|2|3|4|5|6|7|8|9
【A-Za-z】
r+ = r r*
r? = r | ε
3.3 狀態轉換圖
狀態轉換圖:描述狀態間的轉換關係。
結點表示狀態,邊表示轉換條件,雙線圈表示結束狀態
延伸:程序實現(文末)
3.5 有限狀態自動機 finite state automata
- 有限自動機分類
- NFA non-deterministic finite automata 非確定有限自動機
- DFA deterministic finite automata 確定有限自動機
NFA
ε-轉換:不消耗任何字符的轉換
因爲存在ε-轉換,所以一個字串可能有多種接受路徑(如下圖abb被接收,可能在NFA中以abb,abεb接收)。正如NFA其名,沒有確定的狀態轉換路徑
狀態轉換表
NFA狀態轉換表,最後一行要寫epsilon轉換
狀態 | a | b | ε |
---|---|---|---|
1 | {2,3} | Φ | {4} |
2 | Φ | {4} | Φ |
3 | Φ | Φ | {4} |
4 | Φ | Φ | {2} |
DFA(不存在ε轉換)
當前狀態接收一個字符,下一個狀態唯一確定!
換句話來說,DFA 的狀態轉換表中,要不是空集Φ,要不是一個狀態
3.6 從正規式到DFA
STEP 1
Thompson 構造
1) 只有一個開始狀態和一個結束狀態
2)每個狀態出邊只有
- 這三種情況
- 一條 條件爲ε的出邊
- 一條 條件爲單個輸入字符ε的出邊
- 兩條 條件都爲ε的出邊
模板
RE | NFA |
---|---|
基礎正規式 | |
連接 | |
閉包 |
STEP 2(構造狀態集的狀態轉換表 Dtran)
- 有關定義
T爲一個狀態集
ε-closure(T):經任意條ε邊可達到的狀態集
move [T, a]: 從ε-closure(T)再經過一條a邊到達的狀態集
Dtran [T, a]: ε-closure(move [T, a])
- 做題步驟
- 從開始狀態集,開始狀態轉換
- 遇到生成集合未出現過,就將該集合放入待轉換集合的隊列中
- 當沒有新生成的狀態集合,即待轉換集合隊列爲空
- 將每個集合用數字標識,畫出DFA
小技巧: 轉換集中,最重要的是move[T, a]中的元素,可以用_標出
STEP 3
- 等價狀態:從DFA圖中,兩個狀態出發能讀出同樣的字符串,則稱該兩個狀態等價。(可以循環執行,先找到對所有可能輸入字符,轉換出狀態相同的兩個狀態,結合該兩個狀態,再繼續找)
- DFA的所有狀態放入 含有結束狀態的狀態集 和 不含有結束狀態的狀態集,並組成一個狀態集的集合Π
- 對Π中每個狀態集進行劃分
若存在a,使屬於Π的T,move[T, a]分佈在Π的k個不同元素中,則將T分成I1,I2,……,Ik。
劃分原則:move【Ij, a】在Π的同一元素中 - 返回2,直到不能再分
狀態轉換圖程序實現方式:
都以識別 以字母開頭的由數字和字母組成的字符串 爲目的,只要求得到目標字符串,其他字符(other)不放入
- 用分支語句實現
或者使用switch-case
- 表驅動
優點:代碼量少,同樣代碼可以解決多種問題
缺點:表可能會很大;稀疏矩陣會大大降低速率