词法分析---从正则表达式到有穷自动机

本文介绍从正则表达式到有穷自动机(包括NFA和DFA)的转换过程。主要内容涵盖为什么进行这种转换、NFA的基本构成单元、如何实现RE到NFA再到DFA的转变,并通过实例说明具体的转换步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0x00 前言

最近在学习编译原理,顺便写一些东西帮助理解。


0x01 为什么要将正则表达式转化为有穷自动机?


用正则表达式来描述正则语言,然后将正则表达式转化为DFA,而DFA很容易能够转化成计算机能够执行的语言。

但是问题在于,DFA语言适合机器阅读,但是并不适合人阅读,直接从RE转化到DFA并不是一件简单的事情

所以采用了迂回的方法来达到目的,首先完成RE->NFA,然后再完成NFA->DFA


0x02 认识一下组成NFA的因子?

每一个NFA都是由一些最简的,不可拆分的因子组成的,首先我们来认识这些因子:

ε对应的NFA:

字母表Σ中的符号a对应的NFA:


r=r1r2(连接操作)对应的NFA:


r=r1|r2(选择)对应的NFA:

r=(r1)*(幂运算)对应的NFA:



0x03 通过一个实例看如何完成RE->NFA

将RE转化成NFA的过程,其实就是一步步将正则表达式分解的过程

求r=(a|b)*abb对应的NFA:



0x04 如何从NFA转化成DFA?

先利用NFA生成转换表,然后再通过转换表画出DFA

下面以aa*bb*为例讲解

NFA:


转换表:


DFA:


下面再看一个含空边的NFA转换成DFA的实例:

r=0*1*2*

NFA:


转换表:


DFA:


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值