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

一个正规式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. Charles的安装及使用过程

    一.charles的使用 1.1  charles的说明 Charles其实是一款代理服务器,通过过将自己设置成系统(电脑或者浏览器)的网络访问代理服务器,然后截取请求和请求结果达到分析抓包的目的.该 ...

  2. postman的简单介绍及运用

    postman下载地址 https://www.getpostman.com/downloads/ postman的工作原理:发送请求给服务器,服务器处理postman发送的数据然后返回给postma ...

  3. DataTable 相关

    1.对表的初始化 //创建表 DataTable table = new DataTable(); //添加列 table.Columns.Add("ID", typeof(Int ...

  4. (转)KL散度的理解

    KL散度(KL divergence) 全称:Kullback-Leibler Divergence. 用途:比较两个概率分布的接近程度.在统计应用中,我们经常需要用一个简单的,近似的概率分布 f * ...

  5. Java 设计模式之抽象工厂模式

    抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在抽 ...

  6. Kubernetes-Service资源详解

    service的三种工作模式:(userstats(效率低).iptables.ipvs) service可以自动实现负载均衡.service自动实现了负载均衡,service通过selector标签 ...

  7. 物流跟踪API-快递单订阅

    上一篇文章我们讲解了轨迹查询的接口,通过快递鸟接口可以实现实时查询物流轨迹,这次给大家推荐订阅服务功能. 为了更好的理解订阅服务,我们来做个对比, 即时查询是主动查询物流轨迹,需要我们主动调用接口才能 ...

  8. leetcode水题题解

    344. Reverse String Write a function that takes a string as input and returns the string reversed. E ...

  9. ARTS Week 3

    Nov 11,2019 ~ Nov 17,2019 Algorithm 本周来介绍快速求一个数字n次方的余数. 理论基础 我们先定义运算$ x \bmod p = r \(与\) x \equiv r ...

  10. <七>对于之前的一些遗漏的地方的补充

    1.线程的状态: 我们可以通过wait,start,notify等关键字来切换线程的状态,但是我们如何知道线程目前是处于哪一种状态呢?使用Thread.getState()来获取,有下面几种常见的状态 ...