← 有限自动机 · DFA / NFA / regex 与它们之间的转换 / Thompson construction:把 regex 编译成 NFA 待审核 3 / 7
Thompson · regex → NFA

Thompson construction:把 regex 编译成 NFA

一个正则表达式描述一种语言,而 NFA 是一台能跑的机器。Thompson construction 把两者接上:给每种 regex 算子配一块标准「积木」——一小段带 ε 边、有唯一入口和唯一出口的 NFA 片段——再照 regex 的结构把积木拼起来。因为每块都只有一个入口一个出口,拼接始终只有一种操作:「把上一块的出口用 ε 边接到下一块的入口」。NFA 与 ε 边的概念见 NFA 一页。

四块积木(其余算子是它们的变体):

  • 字面 a:两个 state,一条读 a 的边。
  • 连接 AB:A 的出口 —ε→ B 的入口。
  • A|B:新入口 ε 分叉进 A、B;两者出口再 ε 汇到新出口。
  • 闭包 A*:新入口既能 ε 跳过整块、又能进 A;A 的出口能 ε 绕回重来,也能 ε 收尾。

本页支持 | * + ? 与括号;相邻即连接。先把 regex 转成 postfix(后缀式)消掉括号与优先级,再按 postfix 逐个 token 把片段拼起来。

这台 NFA 可以直接运行——用 NFA 一页的 subset simulation。拼完后在下面试几个输入,看它接受 / 拒绝是否符合 regex 语义。注意 Thompson NFA 满是 ε 边、state 数量约是 regex 长度的两倍:它不追求小,只追求「机械可拼、结构对应」。要获得更高效的机器,可用 subset construction 一页的算法把它转成 DFA。