形式语言与编译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^*)^*\)

答案有点错误,但是过程是相当完美,值得记忆的!!!

posted @ 2020-06-17 16:21  _Sandman  阅读(1352)  评论(0编辑  收藏  举报