形式语言与编译4 NFA与正则表达式的相互转化
正则表达式和正则语言
DFA、NFA、\(\varepsilon\)-NFA隐含的处理的语言就是,正则语言。
有的人知道自动机,有的人不知道自动机。这些不知道自动机的科学家从算术运算或者数学的角度定义了语言。用的是表达式法。
还有一些人定义语言用的是文法 不同的流派
就是说定义语言有许多流派,有自动机派、文法派、表达式派
语言用类似四则运算(代数)的方法研究语言是我们接下来要讲的。
串连接运算
\(s=abb\) \(t=bab\) \(st=abbbab\)
\(s=s_1s_2…s_n\) \(t=t_1t_2…t_n\) \(st=s_1s_2…s_nt_1t_2…t_n\)
注意:\(L_1\cup L_2\)也用\(L_1+L_2\) 和\(L_1|L_2\)来表示。表示要么L1,要么L2。
不存在既属于L1有属于L2这种情况,这与我传统理解的并集有出入。此处的并非彼并!!!
\(0+1 = \{0,1\}\)
01串 \((0+1)^*\)
例题:\(L_1有限集合\)
\(L_2无限可列集合\)
现在我们是要用我们定义的运算方式将 我们想要定义的语言组合起来
用最基础的三种运算进行组合
由正则表达式定义的语言是正则的
正则语言:能用正则表达式表示出来
正则表达式题感觉有积累的意义,多看看吧,自己初次见感觉不好想
前面讲到的三种自动机能够定义正则语言;而这里我们使用正则表达式也能够定义正则语言;某种程度上来说,前面三种自动机与我们这里的正则表达式功能一样
\(DFA =NFA = \varepsilon-NFA =RE\)
这个题可以积累 这就是让写出串长度是2的倍数或者3的倍数的串
同样的我们可以写出串长度是4,5,6,7,8的串
有穷自动机与正则表达式可以互换
\(L(Auto) = L (RE)\)
三种自动机与现在所学的RE其实是研究同一种东西的不同角度罢了
RE与DFA相互转化证明思路
RE ——>\(\varepsilon-NFA\)——>\(NFA\) ——>DFA
现在问题就是从RE到\(\varepsilon-NFA\) 咋搞???后面的我们都说了
其实有如下套路:
看到连接 对应我们的\(\varepsilon\)顺序结构
看到并运算 对应我们的\(\varepsilon\)分支结构
看到*运算 对应我们的循环结构
引进\(\varepsilon\)的目的就是让我们可以把单个的DFA连接起来
这样就把RE与\(\varepsilon\)NFA联系起来了!!!!!(太妙了)
上面这题分成三部分,然后把三个自动机用\(\varepsilon\) 连接起来即可
核心就是:把正则表达式中的三种基础运算用相应的自动机代替(这三种基础的运算对应的自动机固定可以记忆),然后把题目要求的正则表达式通过
\(\varepsilon\) 连接起来,组合成一个比较大的自动机
从NFA到正则表达式
左下角是准备化简的NFA,不满足三个条件中的后两个条件。因此我们可以通过添加\(\varepsilon\)达到满足下面三个条件。添加后发现:确实,满足了简化后NFA的三个要求 其实就是通过增加状态数,简化NFA。简化到一个笔直的向量结构
拓展的NFA (G-NFA)
原来的NFA弧上只能有字符,即使是多个字符,每个字符也是单个的,并非串。现在我们要拓展的NFA是准备把弧上的字符变成串(这个串我们常常用正则表达式表示)
而我们通过把这个带有正则表达式的NFA,通过消除状态到:最终只有一个开始状态与一个接受状态;此时这个弧上的正则表达式就是我们的目的(结果)——从NFA得到RE。
消除状态
完美!!!
底下这张slides我认为有点错误,应该是\(0^*1(00^*1+1^*)^*\)
答案有点错误,但是过程是相当完美,值得记忆的!!!