【程序语言与编译】正规式与有限自动机的等价转换

适合读者:软考中级备考同学

阅读时间:4分钟

内容:正规式与FA等价性、正规式转NFA(Thompson构造法)、NFA转正规式(状态消去法)、例题


1. 为什么需要等价转换?

正规式(RE)和有限自动机(FA,包括NFA和DFA)都能描述正则语言,且二者等价

  • 每个正规式对应一个NFA(进而可转为DFA)
  • 每个NFA/DFA对应的语言都可以用一个正规式表示

软考中常考查两种方向:

  • 给定正规式,画出NFA状态图
  • 给定DFA(或NFA),写出等价的正规式

掌握转换方法,可以灵活地在两种表示之间切换,便于词法分析器的设计。


2. 正规式 → NFA(Thompson构造法)

Thompson构造法通过递归地为每个子正规式构造局部NFA,再组合成整体NFA。基本规则如下:

2.1 基本规则

  • 空串 ε\varepsilonε
    → (i) → (f) 一条 ε\varepsilonε 边。
  • 单个字符 aaa
    → (i) -a-> (f)

2.2 组合规则

设 rrr 和 sss 的子NFA分别为 N(r)N(r)N(r)、N(s)N(s)N(s),它们的初态和终态分别为 ir,fri_r, f_rir,fr 和 is,fsi_s, f_sis,fs。

  • 连接 rsrsrs :将 frf_rfr 与 isi_sis 用 ε\varepsilonε 边连接,整体初态为 iri_rir,终态为 fsf_sfs。
  • 选择 r∣sr|sr∣s :新增一个初态 iii 和终态 fff,从 iii 分别用 ε\varepsilonε 边连到 iri_rir 和 isi_sis,再从 frf_rfr 和 fsf_sfs 用 ε\varepsilonε 边连到 fff。
  • 闭包 r∗r^*r∗ :新增初态 iii 和终态 fff,添加四条 ε\varepsilonε 边:i→fi \to fi→f,i→iri \to i_ri→ir,fr→ff_r \to ffr→f,fr→irf_r \to i_rfr→ir(允许循环)。

2.3 示例

将正规式 (a∣b)∗a(a|b)^*a(a∣b)∗a 转换为NFA。

  1. 构造 a∣ba|ba∣b:
    • aaa 的NFA:i0→a→f0
    • bbb 的NFA:i1→b→f1
    • 选择构造:新初态I,新终态F,Iε→i0,Iε→i1,f0ε→F,f1ε→F。
  2. 对 (a∣b)(a|b)(a∣b) 做闭包 ∗*∗:新增初态I'和终态F',添加ε边:I'→F',I'→I,F→F',F→I。
  3. 连接 aaa:上一步的终态F'用ε连接到新a的NFA的初态,a的NFA的终态作为整体终态。

(图形省略,考试中通常只要求理解构造思路,不要求画出复杂图。)


3. NFA → 正规式(状态消去法)

思想:逐步消去NFA中的中间状态,同时用正规式标记转移边上的标签。最终只剩初态和终态,两者之间的边上的正规式即为所求。

3.1 步骤

  1. 添加一个新的初态 XXX(用 ε\varepsilonε 边连接原初态)和一个新的终态 YYY(用 ε\varepsilonε 边连接原终态),保证只有一个初态和一个终态。
  2. 反复选择一个内部状态(不是 XXX 也不是 YYY)消去:
    • 对于被消去状态 qqq,考虑所有进入 qqq 的边(标记为 RiR_iRi,来自状态 pip_ipi)和所有从 qqq 离开的边(标记为 SjS_jSj,去往状态 rjr_jrj),以及 qqq 的自环边(标记为 TTT)。
      消去 qqq 后,为每对 pi→rjp_i \to r_jpi→rj 添加一条新边,标记为 Ri⋅T∗⋅SjR_i \cdot T^* \cdot S_jRi⋅T∗⋅Sj。如果 pip_ipi 和 rjr_jrj 之间已有边,则用选择 | 合并。
    • 删除 qqq 及其所有关联边。
  3. 重复直到只剩 XXX 和 YYY。
  4. 如果存在从 XXX 到 YYY 的边,标记为 RRR,则正规式为 RRR;如果有多条平行边,用 | 合并。

3.2 简化规则

  • 若 XXX 有自环,可忽略(因为开始前不输入任何字符)。
  • 最终结果通常用 R=R1∣R2∣...R = R_1 | R_2 | ...R=R1∣R2∣... 表示。

4. 经典例题

题目1 :将正规式 (0∣1)∗1(0|1)^*1(0∣1)∗1 转换为NFA(描述思路即可)。

  • 先构造 0∣10|10∣1,再闭包,最后连接 111。最终得到一个具有 ε\varepsilonε 转移的NFA,能识别所有以1结尾的二进制串。

题目2:给定DFA如下(状态A初态,B终态,转移:A--0-->A,A--1-->B,B--0-->A,B--1-->B),求等价的正规式。

(使用状态消去法):

  • 添加新初态 XXX(ε→A)和新终态 YYY(B→ε→Y)。
  • 消去中间状态?直接观察:从A经过一个1到B,之后可以在B上任意多个1(循环),也可以从B通过0回到A,然后重复。
    用方程法(或消去法):
    设 RAAR_{AA}RAA 表示从A到A的正规式,RABR_{AB}RAB 从A到B,等等。
    • A→A: 读0可自环 → 000
    • A→B: 读1 → 111
    • B→A: 读0 → 000
    • B→B: 读1 → 111
      列方程:
      A=A⋅0∣B⋅0∣εA = A \cdot 0 \mid B \cdot 0 \mid \varepsilonA=A⋅0∣B⋅0∣ε
      B=A⋅1∣B⋅1B = A \cdot 1 \mid B \cdot 1B=A⋅1∣B⋅1
      先解 B=A1∣B1B = A1 \mid B1B=A1∣B1 → B=A1⋅1∗B = A1 \cdot 1^*B=A1⋅1∗(由 B=B1∣A1B = B1 \mid A1B=B1∣A1 得 B=A1⋅1∗B = A1 \cdot 1^*B=A1⋅1∗)。
      代入 AAA:A=A0∣(A1⋅1∗)0∣ε=A(0∣11∗0)∣εA = A0 \mid (A1 \cdot 1^*)0 \mid \varepsilon = A(0 \mid 11^*0) \mid \varepsilonA=A0∣(A1⋅1∗)0∣ε=A(0∣11∗0)∣ε。
      所以 A=(0∣11∗0)∗A = (0 \mid 11^*0)^*A=(0∣11∗0)∗。
      最终正规式(从A到终态B):A⋅(1⋅1∗)A \cdot (1 \cdot 1^*)A⋅(1⋅1∗)? 注意B是终态,原DFA的初态A,终态B,所以语言是 A→BA \to BA→B 的串。由 B=A1⋅1∗B = A1 \cdot 1^*B=A1⋅1∗,所以正规式为 A1⋅1∗=(0∣11∗0)∗1⋅1∗=(0∣11∗0)∗1+A1 \cdot 1^* = (0 \mid 11^*0)^* 1 \cdot 1^* = (0 \mid 11^*0)^* 1^+A1⋅1∗=(0∣11∗0)∗1⋅1∗=(0∣11∗0)∗1+。可以简化为 (0∣11∗0)∗1+(0|11^*0)^*1^+(0∣11∗0)∗1+。

答案 :(0∣11∗0)∗1+(0|11^*0)^*1^+(0∣11∗0)∗1+(或等价形式)


5. 记忆口诀

正规式与自动机,等价互转需记清。
RE转FA Thompson,递归添加ε边。
FA转RE消状态,自环闭包解方程。


6. 给备考同学的一句话

正规式与有限自动机的等价转换是词法分析理论的核心。软考中通常只考查简单实例(状态数2-3个)或概念性选择题。需要掌握:

  • Thompson构造法的基本思想(为每个运算符构造局部NFA)。
  • 状态消去法(或方程求解)求DFA的正规式。

如果考试遇到复杂转换,建议先用方程法列方程,再解正规式,避免手工消去出错。


🔔 本专栏日更2篇,点击头像 → 专栏《软考中级高频考点》订阅

#软考中级 #软件设计师 #正规式 #有限自动机 #等价转换 #词法分析

相关推荐
是上好佳佳佳呀2 小时前
【LangChain|Day03】LangChain 链式调用 Chains 笔记
笔记·langchain
闪闪发亮的小星星3 小时前
轨道六根数
笔记
aaaameliaaa3 小时前
C语言随机数函数使用全解析
c语言·笔记
Cloud_Shy6184 小时前
解读《Effective Python 3rd Edition》:从练气到老魔(第六章 Item 40 - 43)
android·开发语言·人工智能·笔记·python·学习方法
chase。4 小时前
【学习笔记】Dexora:面向高自由度双臂灵巧操作的开源 VLA 系统
笔记·学习
風清掦4 小时前
【STM32学习笔记-15】FLASH 闪存(Claude)
笔记·stm32·单片机·嵌入式硬件·学习
chase。5 小时前
【学习笔记】Unified World Models:基于视频-动作耦合扩散的机器人预训练新范式
笔记·学习·音视频
影寂ldy6 小时前
C# 事件完整学习笔记(发布订阅 + 自定义事件 + 内置 EventHandler)
笔记·学习·c#
海绵宝宝的月光宝盒6 小时前
6-机械设计基础物理知识
经验分享·笔记·其他·职场和发展·课程设计·学习方法