正规式与有限自动机的等价性

一个正规式r与一个有限自动机M等价, L(r)=L(M)

FA ->正规式,对任何FA M,都存在一个正规式r,使得L(r)=L(M)。

正规式 -> FA, 对任何正规式r,都存在一个FA M,使得L(M)=L(r)

为NFA构造正规式

对转换图概念拓广,令每条弧可用一个正规式作标记,对Σ上任一NFA M,都存在一个Σ上的正规式r,使得L(r)=L(M)

假定NFA M=<S, Σ, δ, S 0 , F>,我们对M的状态转换图进行以下改造:

在M的转换图上加进两个状态X和Y,从X用ε弧连接到M的所有初态结点,从M的所有终态结点用ε弧连接到Y,从而形成一个新的NFA,记为M’,它只有一个初态X和一个终态Y,显然L(M)=L(M’)。

然后,反复使用下面的三条规则,逐步消去结点,直到只剩下X和Y为止。

最后,X到Y的弧上标记的正规式即为所构造的正规式r

显然L(r)=L(M’)=L(M),得证: 对Σ上任一NFA M,都存在一个Σ上的正规式r,使得L(r)=L(M)

为正规式构造NFA

定理:对任何正规式r,都存在一个FA M,使得L(M)=L(r)

定理: 对于Σ上的正规式r,都存在一个NFA M,使L(M)=L(r),并且M只有一个初态和一个终态,而且没有从终态出发的箭弧

对给定正规式r中的运算符数目进行归纳:

  • 验证r中的运算符数目为0时,结论成立
  • 假设结论对于运算符数目少于k(k≥1)的正规式成立
  • 基于该假设,证明结论对于运算符数目为k的正规式成立

若r具有零个运算符,则r=ε或r=φ或r=a,其中a∈Σ

针对上述3类正规式r,分别按照下图构造NFAM,M只有一个初态和一个终态,而且没有从终态出发的箭弧,而且使L(M)和对应的L(r)相等。

假设对于运算符数目少于k(k≥1)的正规式成立

当r中含有k个运算符时,r有三种情形:



上述过程实质上是一个将正规表达式转换为有限自动机的算法

构造Σ上的NFA M’ 使得 L(r)=L(M’),首先,把r表示成

按下面的三条规则对r进行分裂

逐步把这个图转变为每条弧只标记为Σ上的一个字符或ε,最后得到一个NFA M’,显然L(M’)=L(r)


词法分析器的自动产生--LEX



LEX的工作过程

  • 对每条识别规则P i 构造一个相应的非确定有限自动机M i ;
  • 引进一个新初态X,通过ε弧,将这些自动机连接成一个新的NFA;
  • 把M确定化、最小化,生成该DFA的状态转换表和控制执行程序


正规表达式与有限自动机和LEX的更多相关文章

  1. 学JS的心路历程-正规表达式Regular Expression

    今天我们来看正规表达式,在谈到为什么需要多学这个之前,先来看个示例. 假设需要判断输入字串是否含有“apple”: var text=“A apple a day keeps the doctor a ...

  2. 正规表达式 转 NFA C++

    今天来为大家分享一个编译原理中用正规表达式转NFA的小程序 正规表达式就是类似正则一样的式子,例如:(a|b)*abb,最后应该转化为: 大致的处理流程为: 例子中的表达式:(a|b)*abb,|和* ...

  3. 1.java实现——正规表达式判断

    目标:这个代码仅局限于所展示的正规表达式判断,也就是这是一个较单一的正规表达式判断(简易版). 既然是简易版的,所以若要修改这个正规表达式也是非常容易的,只要将二维数组中的数组修改即可.数组数据依据, ...

  4. UVA 1672不相交的正规表达式

    题意 输入两个正规表达式,判断两者是否相交(即存在一个串同时满足两个正规表达式).本题的正规表达式包含如下几种情况: 单个小写字符 $c$ 或:($P | Q$). 如果字符串 $s$ 满足 $P$ ...

  5. Linux学习十七、正规表达式练习题

    情境模拟题一:透过 grep 搜寻特殊字串,并配合数据流重导向来处理大量的文件搜寻问题. 目标:正确的使用正规表示法: 前提:需要了解数据流重导向,以及透过子命令 $(command) 来处理档名的搜 ...

  6. 正规式α向有限自动机M的转换

    [注:这一节是在学习东南大学廖力老师的公开课时,所记录的一些知识点截屏,谢谢廖力老师的辛劳付出] 引入3条正规式分裂规则来分裂α,所得到的是NFA  M(因为包含ε弧,之后进行确定化就是所需要求得DF ...

  7. 轻松学Shell之认识正规表达式

    离线下载观看:http://down.51cto.com/data/148117   650) this.width=650;" onclick='window.open("htt ...

  8. vs 2017 正规表达式替换整行多行数据

    ((<OutputFile>..*</OutputFile>)[\S\s])[\S\s] 从 <OutputFile> 开始 到 </OutputFile&g ...

  9. Swift中用正规表达式判断String是否是手机号码

    func isTelNumber(num:NSString)->Bool { var mobile = "^1(3[0-9]|5[0-35-9]|8[025-9])\\d{8}$&qu ...

随机推荐

  1. 团队项目—Beta版本冲刺(2/3)

    团队信息 何全江(队长) 201731024218 胡志伟 201731024240 李元港 201731024232 孟诚成 201731024242 罗俊杰 201731024226 雷安勇 20 ...

  2. 异想家Eclipse的偏好配置

    1.汉化 http://www.eclipse.org/babel/downloads.php 找到Babel Language Pack Zips,下面选自己版本点进去,找到如下类似的中文包: Ba ...

  3. 机器学习-TensorFlow应用之classification和ROC curve

    概述 前面几节讲的是linear regression的内容,这里咱们再讲一个非常常用的一种模型那就是classification,classification顾名思义就是分类的意思,在实际的情况是非 ...

  4. Kafka源码工程examples项目配置log4j

    examples项目启动想知道有哪些错误,通过日志了解代码执行逻辑,但是启动SimpleConsumerDemo了报错如下: log4j.proproties也配置了 log4j.proproties ...

  5. CVE-2020-3110、CVE-2020-3111、CVE-2020 -3118、CVE-2020-3119、CVE-2020-3120 cdpwn 解析

    CVE-2020-3110.CVE-2020-3111.CVE-2020 -3118.CVE-2020-3119.CVE-2020-3120 cdpwn 解析 攻击条件 在同一广播域,黑客即可通过cd ...

  6. Dubbo Cluster集群那点你不知道的事。

    这是why技术的第33篇原创文章 本周是在家办公的一周,上面的图就是我在家的工位. 工欲善其事,必先利其器.在家办公,我是认真的. 在家里开发的时候有需求是这样的:一个如果接口调用失败,需要自动进行重 ...

  7. java13人机猜拳

    public class Demo01 { public static void main(String[] args) { /* * 你同桌和你要玩游戏. * 1 剪刀,2 石头,3 布 */ // ...

  8. lua学习之复习汇总篇

    第六日笔记 1. 基础概念 程序块 定义 在 lua 中任何一个源代码文件或在交互模式中输入的一行代码 程序块可以是任意大小的 程序块可以是一连串语句或一条命令 也可由函数定义构成,一般将函数定义写在 ...

  9. Window10和Ubuntu 18.04双系统安装的引导问题解决

    作为码农 首先,建议了解下grub2的启动顺序和逻辑.可以参考这篇文章,grub.cfg详解. 从执行顺序倒推,如下如果全部执行成功,则会进入grub的启动菜单:如果最后一步,没有找到grub.cfg ...

  10. GO语言slice详解(结合源码)

    一.GO语言中slice的定义 slice 是一种结构体类型,在源码中的定义为: src/runtime/slice.go type slice struct { array unsafe.Point ...