正规表达式与有限自动机和LEX
正规式与有限自动机的等价性
一个正规式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的更多相关文章
- 学JS的心路历程-正规表达式Regular Expression
今天我们来看正规表达式,在谈到为什么需要多学这个之前,先来看个示例. 假设需要判断输入字串是否含有“apple”: var text=“A apple a day keeps the doctor a ...
- 正规表达式 转 NFA C++
今天来为大家分享一个编译原理中用正规表达式转NFA的小程序 正规表达式就是类似正则一样的式子,例如:(a|b)*abb,最后应该转化为: 大致的处理流程为: 例子中的表达式:(a|b)*abb,|和* ...
- 1.java实现——正规表达式判断
目标:这个代码仅局限于所展示的正规表达式判断,也就是这是一个较单一的正规表达式判断(简易版). 既然是简易版的,所以若要修改这个正规表达式也是非常容易的,只要将二维数组中的数组修改即可.数组数据依据, ...
- UVA 1672不相交的正规表达式
题意 输入两个正规表达式,判断两者是否相交(即存在一个串同时满足两个正规表达式).本题的正规表达式包含如下几种情况: 单个小写字符 $c$ 或:($P | Q$). 如果字符串 $s$ 满足 $P$ ...
- Linux学习十七、正规表达式练习题
情境模拟题一:透过 grep 搜寻特殊字串,并配合数据流重导向来处理大量的文件搜寻问题. 目标:正确的使用正规表示法: 前提:需要了解数据流重导向,以及透过子命令 $(command) 来处理档名的搜 ...
- 正规式α向有限自动机M的转换
[注:这一节是在学习东南大学廖力老师的公开课时,所记录的一些知识点截屏,谢谢廖力老师的辛劳付出] 引入3条正规式分裂规则来分裂α,所得到的是NFA M(因为包含ε弧,之后进行确定化就是所需要求得DF ...
- 轻松学Shell之认识正规表达式
离线下载观看:http://down.51cto.com/data/148117 650) this.width=650;" onclick='window.open("htt ...
- vs 2017 正规表达式替换整行多行数据
((<OutputFile>..*</OutputFile>)[\S\s])[\S\s] 从 <OutputFile> 开始 到 </OutputFile&g ...
- Swift中用正规表达式判断String是否是手机号码
func isTelNumber(num:NSString)->Bool { var mobile = "^1(3[0-9]|5[0-35-9]|8[025-9])\\d{8}$&qu ...
随机推荐
- Dynamics email的subject标题出现 CRM:0000xxxx
怎样移除email subject标题中出现的CRM:0000xxxx Settings->Administration->System Settings->Email->Un ...
- influxdb+Grafana+jmeter监控搭建
安装InfluxDB InfluxDB的简介 InfluxDB 是用Go语言编写的一个开源分布式时序.事件和指标数据库,无需外部依赖. 类似的数据库有Elasticsearch.Graphite等.. ...
- ThreadLocal梳理
ThreadLocal ThreadLocal提供了线程独有的局部变量,可以在整个线程存活的过程中随时取用,极大地方便了一些逻辑的实现. 当使用ThreadLocal维护变量时,ThreadLocal ...
- 求LCM(a,b)=n的(a,b)的总对数(a<=b)
\(a={p_1} ^ {a_1} *{p_1} ^ {a_1} *..........*{p_n} ^ {a_n}\) \(b={p_1} ^ {b_1} *{p_1} ^ {b_1} *..... ...
- SparkSQL 如何自定义函数
1. SparkSql如何自定义函数 2. 示例:Average 3. 类型安全的自定义函数 1. SparkSql如何自定义函数? spark中我们定义一个函数,需要继承 UserDefinedAg ...
- java web 项目中基础技术
1. 选择版本控制器(git, svn) 2. 用户登录的时候, 你需要进行认证, 权限受理 可以使用 spring shiro 框架,进行上面的工作 3. 过滤器(filter),监听器(liste ...
- 《ASP.NET Core 高性能系列》关于.NET Core的配置信息的若干事项
1.配置文件的相关闲话 Core自身对于配置文件不是必须品,但由上文分析可知ASP.NET Core默认采用appsettings.json作为配置文件,关于配置信息的优先等级 命令行>环境变量 ...
- 【Nginx入门系列】第三章 通过端口号区分虚拟主机
1.配置虚拟主机 (1)连接Nginx所在的服务器(我使用的是putty) (2)切换到nginx.conf 配置文件所在的目录,我目录是/usr/local/nginx/conf (3)增加一个虚拟 ...
- <背包>solution-CF118D_Caesar's Legions
Caesar's Legions Gaius Julius Caesar, a famous general, loved to line up his soldiers. Overall the a ...
- asp.net core 3.x 身份验证-1涉及到的概念
前言 从本篇开始将围绕asp.net core身份验证写个小系列,希望你看完本系列后,脑子里对asp.net core的身份验证原理有个大致印象.至于身份验证是啥?与授权有啥联系?就不介绍了,太啰嗦. ...