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

阅读规范:

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

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

本文已开启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. 答案: ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

csdnGuoYuying

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值