編譯原理:深入理解正則表達式與NFA、DFA狀態機


正則表達式

1 基本概念

1.1 正則

正則表達式是語法,正則語言是語義

def(正則表達式):

給定字母表 Σ, Σ 上的正則表達式由且僅由以下規則定義:

  1. ϵ 是正則表達式;

  2. ∀a ∈ Σ, a 是正則表達式;

  3. 如果 r 是正則表達式, 則 (r) 是正則表達式;

  4. 如果 r 與 s 是正則表達式, 則 r|s, rs, r 也是正則表達式。

運算優先級: () ≻ ∗ ≻ 連接 ≻ |

def(正則表達式對應的語言):

L(ϵ) = {ϵ}

L(a) = {a}, ∀a ∈ Σ

L((r)) = L(r)

  • L(r|s) = L(r)∪L(s)
  • L(rs) = L(r)L(s)
  • L(r) = (L(r))

1.2 自動機

兩大要素:

  • 狀態集S
  • 狀態轉移函數δ

1.3 NFA

Nondeteministic Finite Automaton,非確定自動狀態機

A 是一個五元組 A = (Σ, S, s0, δ, F):

  1. 字母表 Σ (ϵ !∈ Σ)

  2. 有窮的狀態集合 S

  3. 唯一的初始狀態 s0 ∈ S

  4. 狀態轉移函數 δ

    δ : S × (Σ ∪ {ϵ}) → 2S

  5. 接受狀態集合 F ⊆ S

A 定義了一種語言 L(A): 它能接受的所有字符串構成的集合

image-20210115220934126

約定:所有沒有對應出邊的字符默認指向一個不存在的 “空狀態” ∅

關於自動機的兩個問題:

  • 給定字符串x,x是否屬於L(A)
  • L(A)究竟是什么
image-20210115221137589

1.4 DFA

Deterministic Finite Automaton,確定性有窮自動機

A 是一個五元組 A = (Σ, S, s0, δ, F):

  1. 字母表 Σ (ϵ !∈ Σ)

  2. 有窮的狀態集合 S

  3. 唯一的初始狀態 s0 ∈ S

  4. 狀態轉移函數 δ

    δ : S × Σ → S

  5. 接受狀態集合 F ⊆ S

image-20210115221807621

約定: 所有沒有對應出邊的字符默認指向一個不存在的 “死狀態”

NFA vs DFA

  1. 對於字母表中的每個符號,DFA中的每個狀態都有且只有一條關於這個符號的出邊(exiting transition)。NFA則未必,在同一個狀態上可能有零條、一條甚至多條關於某一個符號的出邊。
  2. DFA的轉換箭頭上的標簽必須是字母表中的,但NFA可以有標識為ϵ的邊,NFA的狀態可能有零條、一條甚至多條ϵ邊。

1.5 下文將介紹的

image-20210115225154585

2 RE到NFA:Tompson構造法

2.1 從正則表達式的定義出發

回顧一下正則表達式的遞歸定義:def(正則表達式):

給定字母表 Σ, Σ 上的正則表達式由且僅由以下規則定義:

  1. ϵ 是正則表達式;
  2. ∀a ∈ Σ, a 是正則表達式;
  3. 如果 r 是正則表達式, 則 (r) 是正則表達式;
  4. 如果 r 與 s 是正則表達式, 則 r|s, rs, r 也是正則表達式。

2.2 Tompson構造法

Tompson構造法就是從這四條規則出發,定義了四個基本狀態

  • ϵ 是正則表達式

    image-20210115222417100

  • a ∈ Σ 是正則表達式

    image-20210115222426287

  • 如果 s 是正則表達式, 則 (s) 是正則表達式

    沒什么好說的

  • 如果 s, t 是正則表達式, 則 s|t 是正則表達式

    image-20210115222437505

  • 如果 s, t 是正則表達式, 則 st 是正則表達式

    image-20210115222445249

  • 如果 r, s 是正則表達式, 則r 也是正則表達式

    image-20210115222455425

2.3 例題一則

image-20210115222940606

3 NFA到DFA:子集構造法

思想:用DFA模擬NFA

3.1 子集構造法

image-20210115224743531

構造出的DFA,只要包含的NFA狀態中有NFA接受狀態,則該DFA狀態為DFA接受狀態

3.2 例子一則

NFA如2.3

image-20210115224849181

4 DFA最小化

DFA最小化算法的基本思想:等價的狀態可以合並

4.1 如何定義等價狀態

最小化的直接想法就是,如果狀態等價,就將其合並

問題在於:如何定義等價狀態?

  • 嘗試1:

    image-20210115225629221

    這個定義是錯誤的,有時過於緊,有時過於松,反例如下:

    image-20210115225754831

    A ∼ C ∼ E 但是, 接受狀態與非接受狀態必定不等價

  • 嘗試2:

    image-20210115225830022

4.2 從何下手

image-20210115225830022

這個定義是遞歸的,該從何下手?

——反其道而行之,划分,而非合並

4.3 流程

image-20210115230450554

4.4 例子一則

紙上得來終覺淺,絕知此事要躬行,我們直接從一個例子入手:

注:這里的操作順序不唯一

image-20210115230210692

因為接受狀態和非接受狀態必定不等價,定義Π0 = {F, S \ F}

image-20210115230424429

因此,合並AC

image-20210115230529859

5 DFA到RE:Kleene構造法

  • 字符串 x 對應於有向圖中的路徑
  • 求有向圖中所有 (從初始狀態到接受狀態的) 路徑
  • 但是, 如果有向圖中含有環, 則存在無窮多條路徑
  • 不要怕, 我們有 Kleene 閉包

5.1 思想

思想上類似於floyed-warshell算法

image-20210115231127389

Q的初始化:

image-20210115231352685

∅ (注意: 它不是正則表達式) 的規定

  • ∅r = r∅ = ∅
  • ∅|r = r

5.2 算法

image-20210115231325445

5.3 例子一則

  • init

    image-20210115231534468
  • step0

    image-20210115231549483
  • step1

    image-20210115231558622
  • step2

    image-20210115231615645


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM