正規表示式與 Kleene 定理

Thompson 構造法(Thompson construction)

/ TOMP-suhn /

假設你有一個正規表示式,想要一台識別相同語言的機器。與其一口氣猜出整台機器,Thompson 構造法用堆樂高的方式來建造:對表示式的每個零件造一個微小的標準積木,再依表示式的結構把積木扣在一起。成果是一台你以組合方式拼裝起來的 ε-NFA。

每個基本情形都得到一台極小的機器:對符號 a,一個起始狀態用單一條 a 箭頭通往一個接受狀態;對 ε,一個起始狀態用一條 ε 箭頭(ε-轉移)通往接受狀態;對 ∅,一個起始與一個接受狀態,之間沒有箭頭。接著每個運算子都有一條黏接規則。對聯集 R+S,加一個新起始狀態,用 ε 箭頭通往 R 與 S 機器的起始,再用 ε 箭頭從它們的接受通往一個新的共同接受。對串接 RS,用一條 ε 箭頭把 R 的接受連到 S 的起始。對星號 R*,加一對新的起始/接受,配上 ε 箭頭,讓你能完全跳過 R(零個複本)或繞回穿過它(更多複本)。因為每個零件都恰好保有一個起始與一個接受狀態,這些積木總能接合。

Thompson 構造法證明了 Kleene 定理的正向方向,也是許多真實 regex 工具內部的引擎:它簡單、總能成功,且執行的時間與空間與表示式長度成線性。代價是它產生大量 ε-轉移與非確定性,所以為了快速匹配,你通常接著移除 ε,再做子集構造法得到一台 DFA,或直接模擬這台 NFA。本構造法以 Ken Thompson 命名,他在一個早期的文字搜尋工具中使用了它。

要建 ab,先做出 a 的單字元機器與 b 的單字元機器,再用一條 ε-轉移把 a 的接受連到 b 的起始。對 a*,用一對新的起始/接受把單一台 a 機器包起來,再加上「跳過它」與「再繞一圈」的 ε 箭頭。

為每個運算子建一台小機器,再把它們扣在一起。

輸出是一台 ε-NFA,不是 DFA:它小巧、易建,卻是非確定的且充滿 ε-轉移,所以你通常會先轉換它(移除 ε、做子集構造)再進行高效匹配。

又稱
Thompson's constructionMcNaughton-Yamada-Thompson constructionregex-to-NFA construction