阅读规范:

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

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

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

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

基本定义

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

    右线性文法:产生式形式为 U→xV∣yU→xV|yU→xV∣y 且 U,V∈VN,x,y∈VT∗U,V ∈V_N,x,y∈V_T^*U,V∈VN​,x,y∈VT∗​

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

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

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

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

正规式与正规集

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

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

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

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

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

  • 例子1:a∣b∗ca|b^*ca∣b∗c,它所表示的正规集为:串a或者是零个或多个b后跟随一个c,即{a,c,bc,bbc,bbbc,...}\{a, c, bc, bbc, bbbc, ...\}{a,c,bc,bbc,bbbc,...}
  • 例子2:求“每个1都有0直接跟在右边”的正规式:(0∣10)∗(0|10)^*(0∣10)∗
    • 思考方式:上述描述的基本结构是101010,(10)∗(10)^*(10)∗表示的是{ϵ,10,1010,...}\{\epsilon, 10, 1010,...\}{ϵ,10,1010,...},在这个基本结构之上,0的位置是任意的,因此也就变成了“101010与000的所有组合”,即(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,S0,Z)M=(S, \Sigma, f, S_0, Z)M=(S,Σ,f,S0​,Z)
    1. SSS是一个非空有限集,它的每个元素称为一个状态
    2. ΣΣΣ是一个有限的输入字母表,它的每个元素称为一个输入字符
    3. f是转换函数集,形如f(ki,a)=kj(ki∈S,kj∈S,a∈Σ)f(k_i,a)=k_j(k_i∈S, k_j∈S,a∈Σ)f(ki​,a)=kj​(ki​∈S,kj​∈S,a∈Σ):当前状态为kik_iki​,输入字符为a时,将转换到下一个状态kjk_jkj​, fff值唯一
    4. S0∈SS_0 ∈SS0​∈S是唯一的一个初始状态;
    5. Z⊆SZ\subseteq SZ⊆S,是终止状态(终态)集合
    • 注意:初始状态只有一个、终态可以多个、f值唯一
  • 状态转换图表示法

  • 状态矩阵表示法

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

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

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

  • 状态矩阵表示法

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

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

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

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

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

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

    ε−closure(I)ε-closure(I)ε−closure(I)——状态集的εεε闭包

    move(I,a)move(I, a)move(I,a)——状态集的aaa弧转换

    Ia=ε−closure(move(I,a))I_a = ε-closure( move(I, a) )Ia​=ε−closure(move(I,a))——状态集的aaa弧转换的闭包IaI_aIa​

    • ε−closure(I)ε-closure(I)ε−closure(I)

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

      • 状态集III中的每个元素经过 1条a弧1条a弧1条a弧 能到达的所有状态集合
      • 注意:仅经过1条a弧
    • Ia=ε−closure(move(I,a))I_a = ε-closure( move(I, a) )Ia​=ε−closure(move(I,a))

      • 先求 move(I,a)move(I, a)move(I,a) , 记所得集合为 MMM
      • 再求 ε−closure(M)ε-closure(M)ε−closure(M)
    • 习题:NFA的状态转换图如下,状态集I={2,3}I=\{2, 3\}I={2,3},求ε−closure(I)ε-closure(I)ε−closure(I)和I2I_2I2​、I3I_3I3​

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

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

      III IaI_aIa​ IbI_bIb​
      T0T_0T0​ ε−closure(move(T0,a))ε-closure( move(T_0, a) )ε−closure(move(T0​,a)) ε−closure(move(T0,a))ε-closure( move(T_0, a) )ε−closure(move(T0​,a))
      T1T_1T1​ ε−closure(move(T1,a))ε-closure( move(T_1, a) )ε−closure(move(T1​,a)) ε−closure(move(T1,a))ε-closure( move(T_1, a) )ε−closure(move(T1​,a))
    • (1)(1)(1) T0=ε−closure(X)T_0 = ε-closure( X )T0​=ε−closure(X),XXX是NFA的唯一初态。NFA的初态可能有多个,因此分以下两种情况讨论:

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

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

    • (4)(4)(4)根据上表构造状态转换矩阵,对每个Tj=ε−closure(move(Ti,a))T_j = ε-closure( move(T_i, a) )Tj​=ε−closure(move(Ti​,a))

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

      • 若原初态X∈Ti原初态X \in T_i原初态X∈Ti​, TiT_iTi​对应的新状态名就是新DFA的初态S0S_0S0​
      • 若原终态Y∈Ti原终态Y \in T_i原终态Y∈Ti​, TiT_iTi​对应的新状态名加入新DFA的终态集合ZZZ
      • 对矩阵中的所有TiT_iTi​都重命名后,所得的状态转换矩阵就是确定化后的DFA状态矩阵
      • III表示当前状态s,IaI_aIa​表示输入字母为aaa,矩阵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的确定化】

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∗∣01∗0)∣(0∗1)(0∗∣10∗1)(1^*0)(1^*|01^*0)|(0^*1)(0^*|10^*1)(1∗0)(1∗∣01∗0)∣(0∗1)(0∗∣10∗1)。解释:奇数个0与奇数个1的正规式类似,以求奇数个0为例,。。。。 ↩︎

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

  9. 答案: ↩︎

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

  1. 【编译原理】龙书第三章作业答案

    [编译原理]龙书第三章作业答案 练习3.1.1:根据3.1.2节中的讨论,将下面的C++程序划分成正确的词素序列.哪些词素应该有相关联的词法值?应该具有什么值? 答案: 左列为词素,右列为值,划分如下 ...

  2. 【20200422】编译原理课程课业打卡十七之求解文法FirstVTLastVT构造文法算符优先关系表

    [20200422]编译原理课程课业打卡十七之求解文法FirstVT&LastVT&构造文法算符优先关系表 一.课业打卡十七之求解文法FirstVT&LastVT&构造 ...

  3. 编译原理课后习题答案(清华大学第三版)

    编译原理期末速成详细笔记在本人发布的资源里,可自行下载. 第二章答案 第三章答案 第四章答案 第五章答案 第六章答案

  4. 每天两小时学习编译原理——一个学期的第三天,希望能坚持长久✨

    上一篇:每天两小时学习编译原理--一个学期的第二天,希望能坚持长久✨ 下一篇:每天两小时学习编译原理--一个学期的第四天,希望能坚持长久✨ 继续学习 编译程序过程 词法分析 语法分析 语义分析与中间代 ...

  5. 【计算机网络】知识点整理 第三章 数据链路层(王道考研视频学习记录)

    数据链路层 3.1 功能概述 3.2 封装成帧与透明传输 3.3差错控制 3.3.1(检错编码) 3.3.2 (纠错编码) 3.4 3.4.1 流量控制与可靠传输机 3.4.2 停止- 等待协议 信道 ...

  6. 编译原理 理论知识点

    第一章 引论 编译程序和解释程序是两类重要的高级语言处理程序. 机器语言:计算机可以直接执行的代码形式的指令系统称为机器语言. 翻译程序:源程序 --- 目标程序 汇编程序:汇编语言 --- 机器语言 ...

  7. 高中数学必修5知识点:第三章不等式

    大家好,今天分享高中数学必修5知识点第三章不等式(本文有电子版),不等式知识点分三点:1.不等式解法2.基础不等式3.简单的线性规划问题,希望能够帮助大家解决高中数学必修5知识点问题. 好了,今天分享 ...

  8. 高中数学必修4知识点:第三章三角恒等变形

    大家好,今天分享高中数学必修4知识点第三章三角恒等变形最后章节,三角恒等变形是高一数学重点知识点,需要掌握哪些知识点,下面老师整理好三角恒等变换知识点. 好了,今天高中数学必修4知识点第三章三角恒等变 ...

  9. 微型计算机技术第三版第三章答案,微型计算机原理与接口技术第三章习题及答案...

    第三章 习题及答案 2. DS=1000H, BX=0200H, SI=2, 内存10200H-10205H 单元的内容分别是10H, 2AH, 3CH, 46H, 59H, 6BH ,下列指令执行后 ...

最新文章

  1. asp.net mvc 3 unobtrusive client side validation not working in IE
  2. Windows server 2008 R2远程桌面3389端口号修改
  3. Eclipse使用SVN
  4. ThreadLocal 是什么?有哪些使用场景?——Spring系列学习笔记
  5. C++读取ini文件的类
  6. 记录一下flex布局左边固定,右边100%
  7. Unity3D播放视频
  8. 项目后台运行关闭_iOS到底有没有必要上滑强制关闭APP?
  9. Postfix+Dovecot搭建MailServer配置说明
  10. 06.Android之消息机制问题
  11. 网络中看不见的五大重要安全隐患
  12. 20220513-rk3568编译linux4.19的buildroot-2(kernel)
  13. 如何将百度文库中不能复制的文字复制下来
  14. 经典怀旧软件----PP点点通
  15. 我要偷偷的学Python,然后惊呆所有人(第四天)
  16. 课室用的电子黑板|一体手写屏哪家做的好?
  17. 零基础能不能学习web前端开发?【爱创课堂专业前端培训】
  18. 实施ASP.NET Core应用程序的常见陷阱
  19. CTime和COleDateTime区别 比较
  20. 房产抵押贷款必须搞懂的七个问题

热门文章

  1. Redmi路由器AC2100之Padavan设置优化
  2. (1)-Halcon入门学习路线
  3. LabVIEW使用两三年感触
  4. 修改freeradius服务器配置
  5. 一看就会的meta分析-Stata
  6. 可以删除一个lib下所有文件的cl程序(转)
  7. 用Grads画等值线(二)------.map生成
  8. Android V1签名与校验原理分析(全网最全最详细)
  9. 嵌入式软件开发培训笔记——Java第二天(运算符、程序结构、数组与继承)
  10. 给硬件工程师的入门课-硬件开发流程