chapter 3:Lexical Analysis 詞法分析

3.1 詞法分析的作用

從源程序的字符串中找到logic unit邏輯單元(又稱__token 語法單元__)
lexical analysis

  • token: 語法單元,以一個語法單元名和一個可選屬性組成
    • <id, 2> : 標識符,其詳細信息在符號表地址爲2的地方
    • <number, 100>
    • <add_op>
  • pattern: 模式,一個token的詞素可能有的形式,可以匹配一個或多個字符串,如“所有整數”的模式
  • lexeme :詞素,源程序的一個字符序列,與某個模式匹配
    lexeme

tokens

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

狀態轉換表

NFA狀態轉換表,最後一行要寫epsilon轉換

狀態 a b ε
1 {2,3} Φ {4}
2 Φ {4} Φ
3 Φ Φ {4}
4 Φ Φ {2}

DFA(不存在ε轉換)

當前狀態接收一個字符,下一個狀態唯一確定!
換句話來說,DFA 的狀態轉換表中,要不是空集Φ,要不是一個狀態

3.6 從正規式到DFA

STEP 1
STEP 2
STEP 3
正規式
NFA
DFA
最小狀態DFA

STEP 1

Thompson 構造
1) 只有一個開始狀態和一個結束狀態
2)每個狀態出邊只有

這三種情況
一條 條件爲ε的出邊
一條 條件爲單個輸入字符ε的出邊
兩條 條件都爲ε的出邊

模板

RE NFA
基礎正規式 basic RE
連接 rs
閉包 r*

STEP 2(構造狀態集的狀態轉換表 Dtran)

  • 有關定義
    T爲一個狀態集
    ε-closure(T):經任意條ε邊可達到的狀態集
    move [T, a]: 從ε-closure(T)再經過一條a邊到達的狀態集
    Dtran [T, a]: ε-closure(move [T, a])
    Dtran
  • 做題步驟
  1. 從開始狀態集,開始狀態轉換
  2. 遇到生成集合未出現過,就將該集合放入待轉換集合的隊列中
  3. 當沒有新生成的狀態集合,即待轉換集合隊列爲空
  4. 將每個集合用數字標識,畫出DFA
    小技巧: 轉換集中,最重要的是move[T, a]中的元素,可以用_標出

STEP 3

  • 等價狀態:從DFA圖中,兩個狀態出發能讀出同樣的字符串,則稱該兩個狀態等價。(可以循環執行,先找到對所有可能輸入字符,轉換出狀態相同的兩個狀態,結合該兩個狀態,再繼續找)
  1. DFA的所有狀態放入 含有結束狀態的狀態集 和 不含有結束狀態的狀態集,並組成一個狀態集的集合Π
  2. 對Π中每個狀態集進行劃分
    若存在a,使屬於Π的T,move[T, a]分佈在Π的k個不同元素中,則將T分成I1,I2,……,Ik
    劃分原則:move【Ij, a】在Π的同一元素中
  3. 返回2,直到不能再分

狀態轉換圖程序實現方式:
都以識別 以字母開頭的由數字和字母組成的字符串 爲目的,只要求得到目標字符串,其他字符(other)不放入

  1. 用分支語句實現
    if-else
    或者使用switch-case
    switch-case
  2. 表驅動
    transition-table
    storag
    code
    優點:代碼量少,同樣代碼可以解決多種問題
    缺點:表可能會很大;稀疏矩陣會大大降低速率
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章