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

0x00 前言

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


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

词法分析---从正则表达式到有穷自动机_第1张图片

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

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

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


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

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

ε对应的NFA:

词法分析---从正则表达式到有穷自动机_第2张图片

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

词法分析---从正则表达式到有穷自动机_第3张图片

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

词法分析---从正则表达式到有穷自动机_第4张图片

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

词法分析---从正则表达式到有穷自动机_第5张图片

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

词法分析---从正则表达式到有穷自动机_第6张图片


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

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

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

词法分析---从正则表达式到有穷自动机_第7张图片


0x04 如何从NFA转化成DFA?

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

下面以aa*bb*为例讲解

NFA:

词法分析---从正则表达式到有穷自动机_第8张图片

转换表:

词法分析---从正则表达式到有穷自动机_第9张图片
DFA:

词法分析---从正则表达式到有穷自动机_第10张图片


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

r=0*1*2*

NFA:

词法分析---从正则表达式到有穷自动机_第11张图片

转换表:

词法分析---从正则表达式到有穷自动机_第12张图片

DFA:

词法分析---从正则表达式到有穷自动机_第13张图片

你可能感兴趣的:(编译原理)