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: