【编译原理核心知识点总结】第三章、正则文法、NFA、DFA

news2024/12/23 10:03:09

阅读规范:

  • 本文以重点为主,零碎知识点/相对不够重要的为辅助阅读内容,以脚注形式给出,点击脚注即可快速跳转。
  • 助解题目通常是为了帮助理解给出的题目,考试不考,若已理解可直接跳过。
  • 文中提到的课本是陈火旺的《编译原理第三版》。
  • 习题的答案也统一用脚注给出(脚注位于习题后),点击脚注即可快速跳转,建议先自己思考,再看答案。
  • 每章节后面会有综合题型,涵盖了本章节重点知识及算法,请完全掌握。

脚注使用:单击正文后的脚注标记即可跳转到详细,再次点击脚注详细内容后的返回箭头可以返回至正文阅读处

本文已开启Latex数学公式支持

正则文法:描述单词语法的文法

基本定义

  • 正则文法,3型文法,分为右线性文法左线性文法,重点掌握右线性文法。【快速跳转链接:3型文法1、左线性文法1

    右线性文法:产生式形式为 U → x V ∣ y U→xV|y UxVy U , V ∈ V N , x , y ∈ V T ∗ U,V ∈V_N,x,y∈V_T^* U,VVNx,yVT

  • 右线性文法G[S]的状态转换图(TG)表示

    • G[S]中的非终结符 V N V_N VN作为TG的节点(用⚪表示)
    • G[S]的开始符号S对应状态转换图的开始状态S;(每个TG用 → → 指向开始状态)
    • 增加一个新状态 Z Z Z,作为状态转换图的终止状态(用双圈表示);
    • G[S]中形如 U → x V U→xV UxV的每条产生式,画一条从状态U到状态V的方向弧,弧上的标记为x;
    • 对于G[S]中形如 U → y U→y Uy的每条产生式,画一条从状态U到终态Z的方向弧,弧上的标记为y

    【快速跳转链接:左线性文法的状态转换图表示2

  • 助解题目:给出与正则文法G(S)等价的状态转换图。【图】

正规式与正规集

  • 正规式(正则表达式),对于字符集 ∑ ∑ ,仅在 ∑ ∑ 上包含()、|、*、·四种运算的正规式所表示的集合是 ∑ ∑ 上的正规集

    【快速跳转链接:()、|、*、·四种运算运算规则 3

  • 助解题目: ∑ = a , b ∑={a, b} =a,b,其上的正规式与对应的正规集的例子:

正规式正规集
a ∣ b a|b ab { a , b } \{a, b\} {a,b}
( a ∣ b ) ∗ (a|b)^* (ab) { a , b } ∗ 即 a 和 b 所能构成的所有串的集合, { ϵ , a , b , a a , a b , b a , b b , a a a , . . . } \{a,b\}^*即a和b所能构成的所有串的集合,\{\epsilon, a, b, aa, ab, ba, bb, aaa, ...\} {a,b}ab所能构成的所有串的集合,{ϵ,a,b,aa,ab,ba,bb,aaa,...}
a ∗ a^* a { ϵ , a , a a , a a a , . . . } 即 0 或多个 a 的串组成的集合 \{\epsilon, a, aa, aaa, ...\}即0或多个a的串组成的集合 {ϵ,a,aa,aaa,...}0或多个a的串组成的集合
( a ∣ b ) ( a ∣ b ) (a|b)(a|b) (ab)(ab) { a a , a b , b a , b b } \{aa, ab, ba, bb\} {aa,ab,ba,bb}

【快速跳转链接:等价正规式 & 正规式等价变换 4

  • 例子1: a ∣ b ∗ c a|b^*c abc,它所表示的正规集为:串a或者是零个或多个b后跟随一个c,即 { a , c , b c , b b c , b b b c , . . . } \{a, c, bc, bbc, bbbc, ...\} {a,c,bc,bbc,bbbc,...}
  • 例子2:求“每个1都有0直接跟在右边”的正规式: ( 0 ∣ 10 ) ∗ (0|10)^* (0∣10)
    • 思考方式:上述描述的基本结构是 10 10 10 ( 10 ) ∗ (10)^* (10)表示的是 { ϵ , 10 , 1010 , . . . } \{\epsilon, 10, 1010,...\} {ϵ,10,1010,...},在这个基本结构之上,0的位置是任意的,因此也就变成了“ 10 10 10 0 0 0的所有组合”,即 ( 0 ∣ 10 ) ∗ (0|10)^* (0∣10)
  • 习题:(选择/填空),课本 p64 8(1-4)

根据描述给出正规式

(1)以01结尾的二进制数串 5

(2)能被5整除的十进制整数 6

(3)包含奇数个1或奇数个0的二进制数串 7

(4)英文字母组成的所有符号串,要求符号串中的字母按照字典序排列 8

有限自动机(DFA、NFA)

DFA(确定的有限自动机)
  • 五元组表示法

    • M = ( S , Σ , f , S 0 , Z ) M=(S, \Sigma, f, S_0, Z) M=(S,Σ,f,S0,Z)
    1. S S S是一个非空有限集,它的每个元素称为一个状态
    2. Σ Σ Σ是一个有限的输入字母表,它的每个元素称为一个输入字符
    3. f是转换函数集,形如 f ( k i , a ) = k j ( k i ∈ S , k j ∈ S , a ∈ Σ ) f(k_i,a)=k_j(k_i∈S, k_j∈S,a∈Σ) f(ki,a)=kj(kiS,kjSaΣ):当前状态为 k i k_i ki,输入字符为a时,将转换到下一个状态 k j k_j kj, f f f值唯一
    4. S 0 ∈ S S_0 ∈S S0S唯一的一个初始状态;
    5. Z ⊆ S Z\subseteq S ZS,是终止状态(终态)集合
    • 注意:初始状态只有一个、终态可以多个、f值唯一
  • 状态转换图表示法

  • 状态矩阵表示法

矩阵的行表示当前状态,列表示输入字符,矩阵元素表示相应状态行和输入字符列下的新状态。

  • 助解题目:五元组与状态转换图互换ppt 3.3 23页】
NFA(非确定的有限自动机)
  • 五元组表示法

    • M = ( S , Σ , f , S 0 , Z ) M=(S ,Σ,f,S_0,Z) M=(SΣfS0Z)
    1. S , Σ , Z S,\Sigma,Z S,Σ,Z的意义与DFA相同
    2. f f f与DFA中 f f f的区别在于,对某个当前状态,对于输入字符a,可能有多个次态
    3. S 0 S_0 S0表示的是初态集合 S ⊂ 0 S\subset 0 S0
    • 注意:初始状态可以有多个、终态可以多个,f值不唯一
  • 状态转换图表示法

  • 状态矩阵表示法

NFA与DFA联系与区别
  • 区别:

初态:DFA只有一个,NFA有多个

状态转换函数 f f f:DFA每个 f f f值唯一确定,NFA每个 f f f值可以有多个(次态集合)

有向弧:DFA中无 ϵ \epsilon ϵ弧,NFA中可能存在 ϵ \epsilon ϵ

  • 联系:DFA是NFA的特例
NFA转DFA(NFA确定化)——子集构造法
  • NFA确定化:通过某些操作消除NFA中 f f f的多值性

  • 必须掌握的三种运算,对于状态集 I I I

    ε − c l o s u r e ( I ) ε-closure(I) εclosure(I)——状态集的 ε ε ε闭包

    m o v e ( I , a ) move(I, a) move(I,a)——状态集的 a a a弧转换

    I a = ε − c l o s u r e ( m o v e ( I , a ) ) I_a = ε-closure( move(I, a) ) Ia=εclosure(move(I,a))——状态集的 a a a弧转换的闭包 I a I_a Ia

    • ε − c l o s u r e ( I ) ε-closure(I) εclosure(I)

      • 状态集 I I I中的每个元素经过 0 或 n 条 ϵ 弧 0或n条\epsilon弧 0nϵ 能到达的所有状态集合
      • 注:经过0条 ϵ \epsilon ϵ弧所能到达的状态即自己本身
    • m o v e ( I , a ) move(I, a) move(I,a)

      • 状态集 I I I中的每个元素经过 1 条 a 弧 1条a弧 1a 能到达的所有状态集合
      • 注意:仅经过1条a弧
    • I a = ε − c l o s u r e ( m o v e ( I , a ) ) I_a = ε-closure( move(I, a) ) Ia=εclosure(move(I,a))

      • 先求 m o v e ( I , a ) move(I, a) move(I,a) , 记所得集合为 M M M
      • 再求 ε − c l o s u r e ( M ) ε-closure(M) εclosure(M)
    • 习题:NFA的状态转换图如下,状态集 I = { 2 , 3 } I=\{2, 3\} I={2,3},求 ε − c l o s u r e ( I ) ε-closure(I) εclosure(I) I 2 I_2 I2 I 3 I_3 I3

      • 【图】
      • 答案9
  • 方法论

    • 核心:构造状态转换矩阵, 形如

      I I I I a I_a Ia I b I_b Ib
      T 0 T_0 T0 ε − c l o s u r e ( m o v e ( T 0 , a ) ) ε-closure( move(T_0, a) ) εclosure(move(T0,a)) ε − c l o s u r e ( m o v e ( T 0 , a ) ) ε-closure( move(T_0, a) ) εclosure(move(T0,a))
      T 1 T_1 T1 ε − c l o s u r e ( m o v e ( T 1 , a ) ) ε-closure( move(T_1, a) ) εclosure(move(T1,a)) ε − c l o s u r e ( m o v e ( T 1 , a ) ) ε-closure( move(T_1, a) ) εclosure(move(T1,a))
    • ( 1 ) (1) (1) T 0 = ε − c l o s u r e ( X ) T_0 = ε-closure( X ) T0=εclosure(X) X X X是NFA的唯一初态。NFA的初态可能有多个,因此分以下两种情况讨论:

      • NFA初态唯一,且为 S 0 S_0 S0 X = S 0 X = S_0 X=S0
      • NFA初态不唯一,则构造一个新状态 X X X作为NFA的唯一初态,并通过一条 ϵ \epsilon ϵ弧指向初态集合 S 0 S_0 S0中的任意初态
      • 若NFA终态不唯一,则构造一个新状态 Y Y Y作为NFA唯一终态,并将NFA中任意终态节点通过 ϵ \epsilon ϵ弧指向 Y Y Y
    • ( 2 ) (2) (2)对NFA的状态转换图做如下等价变化:【图】【书p50】

    • ( 3 ) (3) (3) C C C表示新状态集合,开始构造状态转换矩阵时, C = { T 0 } C = \{T_0\} C={T0}

    • ( 4 ) (4) (4)根据上表构造状态转换矩阵,对每个 T j = ε − c l o s u r e ( m o v e ( T i , a ) ) T_j = ε-closure( move(T_i, a) ) Tj=εclosure(move(Ti,a))

      • T j ∉ C T_j\notin C Tj/C,则 C = { T 0 , T j } C = \{T_0, T_j\} C={T0,Tj}, 且 T j T_j Tj作为新状态加入到状态转换矩阵的新行中
      • T j ∈ C T_j\in C TjC,跳过
      • T j = ϕ T_j = \phi Tj=ϕ T j T_j Tj不添加新行(原因: T j T_j Tj属于无关状态中的死状态,具体见DFA的化简
    • ( 5 ) (5) (5)记最后一个状态为 T n T_n Tn,对 T 0 ∼ T n T_0 \sim T_n T0Tn进行状态重命名,并根据新状态名称重写状态转换矩阵,重写规则如下

      • 原初态 X ∈ T i 原初态X \in T_i 原初态XTi T i T_i Ti对应的新状态名就是新DFA的初态 S 0 S_0 S0
      • 原终态 Y ∈ T i 原终态Y \in T_i 原终态YTi T i T_i Ti对应的新状态名加入新DFA的终态集合 Z Z Z
      • 对矩阵中的所有 T i T_i Ti都重命名后,所得的状态转换矩阵就是确定化后的DFA状态矩阵
      • I I I表示当前状态s, I a I_a Ia表示输入字母为 a a a,矩阵 M [ s , i ] M[s,i] M[s,i]的值就是状态s下输入a的次态o
    • ( 6 ) (6) (6)根据新状态转换矩阵画状态转换图,此时的状态转换图就是确定化之后的DFA图(未化简

  • 例题 ppt3.3-35(书p50 ex3.3 书图×,看ppt图)、 ppt3.3-37
    【gif动图–NFA的确定化】

NFA2DFA

DFA的化简

在这里插入图片描述

综合题型 & 课后习题

  • 给出文法求DFA(求NFA–>转DFA–>DFA化简)
  • NFA与正规式的互换

  1. 3型文法 ↩︎ ↩︎

  2. 左线性文法的状态转换图表示 ↩︎

  3. ()、|、*、·四种运算运算规则 ↩︎

  4. 正规式等价&正规式等价变换 ↩︎

  5. 以01结尾的二进制数串: ( 0 ∣ 1 ) ∗ 01 (0|1)^*01 (0∣1)01 ↩︎

  6. 能被5整除的十进制整数: ( 1 ∣ 2 ∣ 3 ∣ 4 ∣ 5 ∣ 6 ∣ 7 ∣ 8 ∣ 9 ) ( 0 ∣ 1 ∣ 2 ∣ 3 ∣ 4 ∣ 5 ∣ 6 ∣ 7 ∣ 8 ∣ 9 ) ∗ ( 0 ∣ 5 ) (1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)^*(0|5) (1∣2∣3∣4∣5∣6∣7∣8∣9)(0∣1∣2∣3∣4∣5∣6∣7∣8∣9)(0∣5) ↩︎

  7. 包含奇数个1或奇数个0的二进制数串: ( 1 ∗ 0 ) ( 1 ∗ ∣ 0 1 ∗ 0 ) ∣ ( 0 ∗ 1 ) ( 0 ∗ ∣ 1 0 ∗ 1 ) (1^*0)(1^*|01^*0)|(0^*1)(0^*|10^*1) (10)(1∣010)(01)(0∣101)。解释:奇数个0与奇数个1的正规式类似,以求奇数个0为例,。。。。 ↩︎

  8. 英文字母组成的所有符号串,要求符号串中的字母按照字典序排列:以a~z为例: a ∗ b ∗ c ∗ . . . z ∗ a^*b^*c^*...z^* abc...z ↩︎

  9. 答案: ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/164468.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot 并发编程学习历程(绝对的干货)

如果一个项目总用单线程来跑,难免会遇到一些性能问题,所以再开发中,我们应该尽量适量的使用多线程(在保证线程安全的情况下)。 本教程大概目录: 1.模拟单线程情节 2.用Callable实现 并发编程 3.用DeferedR…

高并发系统设计 --基于bitmap的用户签到

业务需求分析 一般像微博,各种社交软件,游戏等APP,都会有一个签到功能,连续签到多少天,送什么东西,比如: 签到1天送10积分,连续签到2天送20积分,3天送30积分&#xff0…

Qt之QDrag的使用(含源码+注释)

一、效果示例图 提示:主控件(CDragTest界面,UI中中包含CWidget界面);子控件(CWidget界面,在CDragTest界面添加) 提示:源码中拖拽数据设置的文本不同,是博主准…

【ONE·C || 分支循环】

总言 C语言:分支循环。 文章目录总言1、分支语句1.1、if语句1.1.1、基本格式1.1.2、逻辑真假与悬空else1.1.3、练习1.2、switch语句1.2.1、基本格式:break、case、default1.2.2、练习:switch语句嵌套2、循环语句2.1、while循环2.1.1、基本格式…

uniapp实现界面可任意拖动小图标

uniapp实现界面可任意拖动小图标一、问题:二、解决步骤2.1 根据uni-app官方提供的案例,创建组件2.2 在需要的界面引入组件使用额外注意一、问题: 例如购物车小图标可任意拖动 二、解决步骤 2.1 根据uni-app官方提供的案例,创建…

Kubernetes教程(二)---集群网络之 Flannel 核心原理

来自:指月 https://www.lixueduan.com 原文:https://www.lixueduan.com/posts/kubernetes/02-cluster-network/ 本文主要记录了 Kubernetes 集群网络方案之 Flannel 核心原理详解,包括其隧道方案中的两种:UDP 实现和 VXLAN 实现…

Mysql之增删改查

这里的增删改查主要是对应表中的数据,不像前一篇那个列类型,耳机具体的哪一条数据 Insert 其实我们前面都用过好多次了 比如下面那个 可以 关于那个表名后面加不加(列类型),下面有解释 INSERT INTO shanpin VALUES…

关于yolov8一些训练的情况

U神出品了最新的yolov8,从公开的参数量来看确实很优秀!!!!比如下图得一些指标: 可以看到s模型640得map已经达到了44.9,v8n得map也已经达到了37.3,很强了,但是实际上是怎么…

Python爬虫之Scrapy框架系列(3)——项目实战【某瓣top250电影信息获取】

目录:1. 某瓣电影top250首页电影信息的获取!1.创建项目:2.创建爬虫文件:3.运行爬虫文件:4.设置请求头:5.获取到电影名字:5.1 使用shell交互式平台:5.1.1 首先:打开我们的…

239页10万字“联、管、用”三位一体雪亮工程整体建设方案

【版权声明】本资料来源网络,知识分享,仅供个人学习,请勿商用。【侵删致歉】如有侵权请联系小编,将在收到信息后第一时间删除!完整资料领取见文末,部分资料内容: 目录 1、 项目概述 1.1 项目背…

用R语言绘制泰勒级数的逼近过程

文章目录泰勒级数是如何被发现的用图像理解Taylor级数的逼近过程前情提要 R语言微积分极限π,e,γ\pi, e, \gammaπ,e,γ洛必达法则连续性和导数数值导数差商与牛顿插值方向导数 泰勒级数是如何被发现的 如果我是泰勒,我会把思考的起点建立在这样的一个等式上 f(n…

Windows10电脑重装系统详细步骤(纯净版)

目录 前言: 一、准备工作 二、下载pe工具 三、下载系统镜像ISO文件 获取方式一 获取方式二 获取方式三 四、进入pe系统 1.检查以上的准备工作是否完成 2.然后拔出来u盘插入要重装的电脑上面 3.然后按电源键开机(不能点击重启!&…

【Git 从入门到精通】使用Git将本地代码推送到Github

文章目录一、创建远程库二、Git操作远程库1.推送代码2.克隆代码3.拉取代码4.Pull request5.常用命令总结一、创建远程库 打开github.com,点击右上角加号,点击第一个选项。 填写库的基本信息,如果你想代码开源就选择public,否则就…

开发模型和测试模型

开发模型瀑布模型特点:线性结构,每个阶段只执行一次,必须完成上一个才能执行下一个。是其他模型的基础框架缺点:测试后置,1)前面各个阶段的遗留的风险推迟到测试阶段才被发现,导致项目大面积返工…

【7】SCI易中期刊推荐——图像处理领域(中科院4区)

🚀🚀🚀NEW!!!SCI易中期刊推荐栏目来啦 ~ 📚🍀 SCI即《科学引文索引》(Science Citation Index, SCI),是1961年由美国科学信息研究所(Institute for Scientific Information, ISI)创办的文献检索工具,创始人是美国著名情报专家尤金加菲尔德(Eugene Garfield…

【LGR-(-17)】洛谷入门赛 #8个人思考

T306713 Hello, 2023 题目背景 Goodbye, 2022 Hello, 2023 题目描述 某 E 在 2022 年的幸运数字是 xxx,这个数可能是正的,也可能是负的。 某 E 想要知道 xmod2023x \bmod 2023xmod2023 的值。其中,mod\bmodmod 是取模操作。也就是说&am…

数据结构:线性表的顺序表示和实现

在实际应用程序中涉及的线性表的基本操作都需要针对线性表的具体存储结构加以实现。线性表可以有两种存储表示方法:顺序存储表示和链式存储表示。下面我们先说说顺序存储表示。 1、顺序表——线性表的顺序存储表示 在计算机中表示线性表的最简单的方法是用一组地址连续的存储…

Linux:自动化构建工具make/Makefile

文章目录一.前言二.Makefile如何写入/make命令使用2.1清楚依赖关系和依赖方法2.2删除文件2.3Makefile中的关键字.PHONY2.4一个小补充一.前言 在此之前我们已经可以用vim编写代码和用gcc编译代码。但是如果现在要写一个大型项目,一下子写了很多源文件,在…

C. Zero Path(DP)

Problem - 1695C - Codeforces 给你一个有n行和m列的网格。我们用(i,j)表示第i(1≤i≤n)行和第j(1≤j≤m)列的方格,用aij表示那里的数字。所有的数字都等于1或等于-1。 你从方格(1,1)开始,每次可以向下或向右移动一个方格。最后&…

基于结点的数据结构——链表(单链表双向循环链表)| 附完整源码 | C语言版

本章内容 1.什么是链表 2.链表常见几种形式 3.无头单向非循环链表的实现 3.1结点结构的定义 3.2函数接口的实现 3.2.1尾插 3.2.2尾删 4. 带头双向循环链表的实现 4.1结点结构的定义 4.2函数接口的实现 5.两种链表的差异 ①尾插与尾删的时间复杂度 ②头插与头删的时…