文章目录

  • 回顾子集构造(NFA→\rightarrow→DFA)
  • 正则语言的闭包结果
    • 正则语言的 Union 依然是正则语言
    • 正则语言的 concatenate ○○○ 操作依然是正则的
    • 正则语言的 kleenestarkleene~ starkleene star 依然是正则语言
    • 正则语言的其他闭包性质
    • 如何构造 DFA 的运算算法(构造 DFA 的交、并、补集)
  • 如何构造最小的 DFA(指包括最少状态数的 DFA)
    • 构造最小化 DFA 举例
  • 正则表达式
    • 正则表达式语法和语义
    • 正则表达式举例
    • 正则表达式和自动机(Regular Expression VS. Automata)
      • 构造单个起始状态的 NFA
        • 正则语言 →\rightarrow→ NFA 举例(单个起始状态):(a∪b)∗bc(a ∪ b)^∗bc(a∪b)∗bc
      • 构造单个 accept 状态的 NFA
      • (兴趣读物:国内课本的方法)通过正则语言构造 NFA
        • 正则语言 →\rightarrow→ NFA 举例
      • 化简 “单个” 起始和 accept 状态的 NFA
        • 扩展
      • 正则表达式的定理
      • 正则语言的局限性
      • 通过泵引理(Pumping Lemma)来验证正则语言
      • 泵引理反证法实例

回顾子集构造(NFA→\rightarrow→DFA)

正则语言的闭包结果

正则语言的 Union 依然是正则语言

  • A,BA,BA,B 是两个正则语言,他们通过 ϵ\epsilonϵ 组成了一个 NFA ,他可以表示为 A∪BA\cup BA∪B;我们要在状态开始的时候使用 ϵ\epsilonϵ 来连接两个 DFA

正则语言的 concatenate ○○○ 操作依然是正则的

  • 图中下半部分表示第一个语言的某两种状态通过 ϵ\epsilonϵ 进行 concate 组成了第二种语言的某种状态;这样组成的新语言依然是正则语言

正则语言的 kleenestarkleene~ starkleene star 依然是正则语言

正则语言的其他闭包性质

  • 两个正则语言的 intersection(交集)依然是正则语言
  • 正则语言的补集(complement)依然是正则语言 A,ACA, A^CA,AC
  • 正则语言的差集(difference)依然是正则语言 A∖BA \setminus BA∖B
  • 正则语言的取反(reversal)依然是正则语言

如何构造 DFA 的运算算法(构造 DFA 的交、并、补集)


如何构造最小的 DFA(指包括最少状态数的 DFA)

  • 因为我们无法保证通过某种算法可以得到最小的 DFA,如下图所示,我们不知道他是否为最简 DFA
  • 但是由于 DFA 拥有唯一的起始状态,并且转移函数是固定的,因此我们可以测试两个 DFA 的等价性从而找出最小的 DFA
  • 要构造最小的 DFA 要不断重复以下步骤
    • 翻转 NFA
    • 确定化结果
    • 再翻转
    • 再次确定化结果
  • 翻转 NFA 的方式也很简单:
    1. 那就是将所有的状态上的线调转方向
    2. 将接受(accept)状态节点和初始节点(start)互换

构造最小化 DFA 举例

  • 这是我们要最小化的 NFA, 我们在下面的步骤中通过它得到一个最小的 DFA

  • 第一步: 翻转(1节点和 2 节点的功能互换,原本 1 是初始节点,2是accept 节点,现在调转一下 1 变成了 accept 节点,2 变成了初始节点)

  • 第二步: 通过调转的 NFA 进行确定化得到当前状态下的 determinism 的结果

  • 因为最终状态中 5,65,65,6 包含原来的 111 状态(即 accept 状态),因此,5,65,65,6 应该被标定为出口

  • 第三步 再次调转已经得到的 NFA ;5,65,65,6 变成了起始状态;444 变成了 accept 状态

  • 第四步: 重复第二步的 determinism 得到最后的状态

正则表达式

  • 各种编程语言中几乎都涉及正则表达式
  • (0∪1)(0∪1)(0∪1)((0∪1)(0∪1)(0∪1))∗(0 ∪ 1)(0 ∪ 1)(0 ∪ 1)((0 ∪ 1)(0 ∪ 1)(0 ∪ 1))^∗(0∪1)(0∪1)(0∪1)((0∪1)(0∪1)(0∪1))∗ 代表一个长度为 3 的倍数的非空字符串
  • ∗*∗ 运算的优先级高于 concatenate;concatenate 高于 union

正则表达式语法和语义


正则表达式举例

正则表达式和自动机(Regular Expression VS. Automata)

构造单个起始状态的 NFA

  • 正则表达式和有限状态的自动机是等价的,而且有限状态机的起始状态只能有一个
  • 在下面的例子中,我们假设每个 NFA 的起始状态只有一个,那么对于一个多起始状态的 NFA NNN 我们可以表示成若干个 N′N^{'}N′ 的通过 ϵ\epsilonϵ 的并联
  • 这个式子δ′(q,v)\delta^{'}(q,v)δ′(q,v) 中,qiq_iqi​ 代表的就是原本的 多个起始状态 qqq 统一用 qiq_iqi​ + ϵ\epsilonϵ 代替;而其他不是起始状态开始的节点则遵循原本的 δ\deltaδ 转换状态。

正则语言 →\rightarrow→ NFA 举例(单个起始状态):(a∪b)∗bc(a ∪ b)^∗bc(a∪b)∗bc

  • 国外的书籍和课件 是按照这种方式进行构造和转换的

构造单个 accept 状态的 NFA

  • 可以看到下图的 NNN 中有 3 个终止状态
  • 汇总起始状态和将初始状态分开都同样使用 ϵ\epsilonϵ
  • 例如下图的例子:
  • 图中的 δ′(q,v)\delta^{'}(q,v)δ′(q,v) 代表的就是将状态转换函数分成了两类:
    • 如果是原来 accept 状态,那么就添加一个新的状态 qfq_fqf​ 并且把原来所有的 accept 状态都通过 ϵ\epsilonϵ 连接过去
    • 原来的其他状态则不需要进行调整,维持原本的样子
  • 所以我们看到下图中的三个原本的 accept 状态都通过 ϵ\epsilonϵ 连到了新的 “唯一的 accpet” 状态 qfq_fqf​

(兴趣读物:国内课本的方法)通过正则语言构造 NFA

  • 当我们获得一个正则语言,我们如果要构造 NFA(单起始状态的),我们只需要不断重复下面 三个步骤 即可:(国内书籍版本)

    • 将 concatenate 操作分成两个串联的部分
    • 将 union (|)操作分成两个并联的部分
    • 将闭包运算 * 分成第三种情况

正则语言 →\rightarrow→ NFA 举例

化简 “单个” 起始和 accept 状态的 NFA

  • 上文已经分别介绍了如何构造单个起始状态的 NFA 和 单个 accept 状态的 NFA
  • 现在对于中间的状态进行重复地替换(使用正则表达式)以简化 NFA;方法就是把线上的 字符 用正则表达式来替换;并不断重复这个过程
  • 如下图所示,我们的 NFA 现在已经是 单个起始状态和单个 accpet 状态;弧线上表示的 R1,R2,...R_1,R_2,...R1​,R2​,... 都是 正则表达式,假设我们通过化简可以得到下面的两个 NFA 的表示 :
    • (R1∪R2R3∗R4)∗R2R3∗(R_1 ∪ R_2R_3^∗R_4)^∗R_2R_3^∗(R1​∪R2​R3∗​R4​)∗R2​R3∗​
    • R∗R^*R∗

      通过下面例子来进行演示:假设化简的是下面的例子
  • 首先先把上面的两个 accept 状态的图转换成一个 accept 状态,根据上面的知识
  • 通过正则表达式来替换线上的字符从而实现状态的化简:
  • 再次通过正则表达式来合并中间的步骤
  • 最终把中间状态逐渐换成正则表达式;得到了最简的 NFA
  • 而上述的式子就相当于我们最开始引入的 (R1∪R2R3∗R4)∗R2R3∗(R_1 ∪ R_2R_3^∗R_4)^∗R_2R_3^∗(R1​∪R2​R3∗​R4​)∗R2​R3∗​
  • 因此我们容易得到以下替换:

扩展

  • 下图中表示的:一个进,一个出,一个循环的这种状态可以被固定的写成 R1R2∗R3R_1R_2^∗R_3R1​R2∗​R3​

  • 如果有 mmm 个进入的弧线,nnn 个出去的弧线,那么这些弧线可以被 m×nm×nm×n 个循环弧线所代替。

正则表达式的定理


正则语言的局限性

{0n1n∣n≥0}={ϵ,01,0011,000111,...}\{0^n1^n | n ≥ 0\} = \{\epsilon, 01, 0011, 000111, . . .\}{0n1n∣n≥0}={ϵ,01,0011,000111,...}

  • 对于上面的语言我们无法使用 DFA 来识别,即:他不是一个正则语言。

通过泵引理(Pumping Lemma)来验证正则语言




  • pumping lemma 只能证明一个语言不是正则语言,不能证明一个语言是正则语言;即:满足 pumping lemma 不一定是正则语言,但是不满足 pumping lemma 一定不是正则语言

泵引理反证法实例




编译原理学习之:正则表达式(regular expression)和非正则语言(non-regular languages)相关推荐

  1. 计算机编译原理有必要学吗,计算机程序编译原理学习心得

    计算机程序编译原理学习心得 <编译原理>是计算机专业的一门重要课程,正如教材:第一章的引论所述,"编译程序是现代计算机系统的基本组成部分之一"."一个编译程序 ...

  2. [编译原理随记]正则表达式转为NFA状态图(Thompsion构造法)

    上级文章 [编译原理随记]正则表达式记号和状态图:https://blog.csdn.net/qq_28033719/article/details/107067798 [编译原理随记]NFA转DFA ...

  3. [编译原理学习笔记2-2] 程序语言的语法描述

    [编译原理学习笔记2-2] 程序语言的语法描述 文章目录 [编译原理学习笔记2-2] 程序语言的语法描述 [2.3.1] 上下文无关文法 [2.3.2] 语法分析树与二义性 [2.3.3] 形式语言鸟 ...

  4. 编译原理学习笔记20——符号表

    编译原理学习笔记20--符号表 20.1 符号表的组织与操作 20.2 符号表的内容 20.3 利用符号表分析名字的作用域 20.1 符号表的组织与操作 符号表 符号表的作用与组织 符号表的整理和查找 ...

  5. 编译原理-学习指导与典型题解析

    <编译原理-学习指导与典型题解析>这本书的pdf版本 是刘春林版本,应该是和陈火旺的是配套的,出版社一样 点击下载

  6. 编译原理学习笔记2——高级程序设计语言概述

    编译原理学习笔记2--高级程序设计语言概述 2.1常用的高级程序设计语言 2.2程序设计语言的定义 2.2.1语法 2.2.1语法 2.2.3程序语言的基本功能和层次机构 2.2.4程序语言成分的逻辑 ...

  7. 编译原理 - 学习/实践

    1.应用背景 编译技术,与我们的工作[很多编程语言的工作原理]息息相关, 同时, 除了丰富的应用场景,学习编译技术对于提升程序员的竞争力也很重要. 2.学习/实践 文档阅读 JointJS - Jav ...

  8. 编译原理学习(到LL1文法部分)

    今天终于开始着手把一年前学的编译原理整理一下啦!打败拖延症 #*# 机器语言:计算机只认识由0和1构成的机器语言,每台机器自己独特的指令系统即机器语言. 机器语言->汇编语言->高级语言 ...

  9. 编译原理学习笔记一(待续)

    这几天忙着学英语,同时在学习编译原理,对这门课很感兴趣,已经制作了词法分析器,同时还在补充这个分析器的功能,也准备着手开始写语法分析器,看到最后能不能连在一起,我想如果能够将整套编译器的流程跑下来真的 ...

最新文章

  1. 存在就不插入_DOM 插入节点和三个Child方法
  2. 4.Python基础语法(数字运算/字符串/列表/元组/字典/集合)
  3. SecureCRT如何进入和退出全屏及调出菜单栏
  4. linux常用指令_Linux常用指令
  5. signature=de15a75f36f4ab4d3249c21fbaa05791,1-out-of-n Signatures from a Variety of Keys
  6. MongoDB快速入门(五)- Where子句
  7. ftp ---- 本地用户登录(实例配置1:)
  8. 把项目部署在腾讯云服务器上详细内容教程
  9. 主流区块链浏览器导航
  10. 电子技术应用课程设计
  11. 关于Google您的连接不是私密连接问题的解决方法 (Chrome 地址栏 Google 搜索错误处理 隐私设置错误)
  12. Linux学习笔记_2021-01-21
  13. 荧光染料Alexa Fluor 647 alkyne/炔基炔烃
  14. MAVROS的plugin到底是什么意思?plugin中文意思是插件
  15. mysql nb3 备份_通过Navicat进行Mysql数据库自动备份与还原
  16. QrCode类生成二维码海报
  17. DVD管理系统修改版
  18. C#iText7对PDF进行签章
  19. Python之Socket自动重连
  20. TwinCAT3网卡驱动无法安装解决办法

热门文章

  1. 中国农村商业银行产业投资战略及未来发展决策锦衣报告2021-2027年
  2. Android menu按键的监听
  3. mybatis源码分析系列(开胃菜)-mybatis中的执行器架构体系
  4. mac 定时任务:每隔30分钟就进入睡眠锁屏状态
  5. CSS(4)表格样式
  6. 影响我学习过程的两个小机遇
  7. (转)Tensorflow 实战Google深度学习框架 读书笔记
  8. 消费市场扩容:从用户安全到多样化视频联网应用
  9. 有温度的文字,暖人心~
  10. python编写hello world_python编写helloworld