编译原理1-3章重要概念与题型总结

本文概括了编译原理的前三章内容,包括文法的概念,如句型、句子和语言的描述,文法的二义性及其判断,以及正规式和有限自动机的等价性。重点讨论了如何证明文法的句子、求解文法产生的语言、反推文法以及构造最左推导和语法树。同时,介绍了正规式和正规集的性质,正规表达式的等价性验证,以及确定有限自动机(DFA)和非确定有限自动机(NFA)的转换与等价性。
摘要由CSDN通过智能技术生成

编译原理1-3章重要概念与题型总结

文章目录

1-2章概念测试题总结:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

程序语言的语法描述

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

V ∗ V^* V V + V^+ V+区别在于,如果V中间原来没有空字,闭包中包含空字,正规闭包没有空字

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

句型、句子和语言

在这里插入图片描述

题型一:证明某表达式是文法的句子:
  • 首先要证明是该表达式是文法的一个句型:能够从文法的开始符号推出来。也就是给出来一个从文法的开始符号到你要推导的序列。
  • 再证明该句型仅含终结符
    在这里插入图片描述

要证明是一个句子

  1. 必须证明它只有终结符
  2. 再证明它能从文法的开始符号推出来
题型二:求文法产生的语言:

解题思路:先分析下文法可能产生的推导,然后总结出语言的模式。
在这里插入图片描述

使用第一个候选推导停止,使用第二个候选,在右边增加b
每次使用递归候选替换时,都会导致句型变长,这样就能推出结构相似长度不同的句子。

在这里插入图片描述
S推出AB
S所能推导的式子都可以看成两个部分,前一部分由A推导出来,后一部分由语法单位B产生。

继续分析A,B产生串的特点
A的候选,aA递归候选(不断在A前面增加a),a非递归候选(使用即结束)
A最终产生的串就是若干个a构成的串(个数>0)

B的候选,bB递归候选(不断在B面增加a),b非递归候选(使用即结束)
B最终产生的串就是若干个b构成的串(个数>0)

题型三:由产生串反推文法:

在这里插入图片描述

关键性约束:a,b数目一样多

  • 拿掉开头的子串,剩下的子串也满足条件:前一半若干个a,后一半若干个b,数目相同,所以可以写出规则S→aSb
  • 最后不断拿掉,最简单的句子是ab,S→ab递归基础

在这里插入图片描述

句子特点:前面若干个a后面若干个b,a的数目是b的1到2倍之间。

  • 首先找出满足条件最简单的句子:S→ab|aab
  • 递推:S→aSb|aaSb
题型四:写出最左推导/最右推导,并画出语法树

最左推导和最右推导

在这里插入图片描述
最左推导和最右推导的语法树是一样的,只是树的生长顺序不同,从上往下(从左到右|从右到左生长)

语法树

用一张图表示一个句型的推导,称为语法树
在这里插入图片描述

如果使用最左(右)推导,则一个最左(右)推导与语法树一一对应。

文法层面的二义性

在这里插入图片描述

  • 文法的二义性:如果一个文法存在某个句子对应两颗不同的语法树,则说这个文法是二义的。

G(E): E → i|E+E|E*E|(E) 是二义文法。

题型五:证明某文法是二义文法:

在这里插入图片描述

只要找出他的一个有两颗不同的语法树这样的句型/句子就能证明这个文法是二义的。
同理,只要找到一个有两个不同的最左推导/最右推导的句子/句型也能证明这个文法是二义的。

语言层面的二义性

  • 语言的二义性:一个语言是二义性的,如果对它不存在无二义性的文法。
  • 对于语言L,可能存在G和G’,使得L(G)=L(G’)=L,但可能其中一个为二义的,一个为无二义的。
  • 二义性问题是不可判定问题,即不存在一个算法,它能在有限步骤内,确切地判定一个文法是否是二义的。
  • 可以找到一组无二义文法的充分条件。
    在这里插入图片描述
    在这里插入图片描述

判断文法是否是二义的:
在这里插入图片描述

在这里插入图片描述

形式语言鸟瞰

  • Chomsky于1956年建立形式语言体系,他把文法分成四种类型:0,1,2,3型。
  • 与上下文无关文法一样,它们都由四部分组成,但对产生式的限制有所不同。
    在这里插入图片描述
题型六:掌握0,1,2,3型文法,要求能根据语言按要求写出相对应符合条件的0,1,2,3型文法
0型(短语文法,图灵机):

产生式形如: α → β α→β αβ
其中: α ∈ ( V T ∪ V N ) ∗ α∈ (V_T∪V_N)^* α(VTVN)且至少含有一个非终结符; β ∈ ( V T ∪ V S ) ∗ β∈ (V_T∪V_S)^* β(VTVS)

α、β都是由终结符和非终结符组成的任意串,但α含有一个非终结符(全是终结符就没法定义了)

2型文法(上下文无关文法是0型文法的一个特例)

1型(上下文有关文法,线性界限自动机):

产生式形如: α → β α→β αβ
其中: α ∈ ( V T ∪ V N ) ∗ α∈ (V_T∪V_N)^* α(VTVN)且至少含有一个非终结符; β ∈ ( V T ∪ V S ) ∗ β∈ (V_T∪V_S)^* β(VTVS)
∣ α ∣ ≤ ∣ β ∣ |α| ≤ |β| αβ,仅 S → ε S→ε Sε 例外。

左边一定比右边短

2型(上下文无关文法,非确定下推自动机):

产生式形如: A → β A → β Aβ
其中: A ∈ V N ; β ∈ ( V T ∪ V N ) ∗ A∈ V_N;β∈ (V_T ∪ V_N)^* AVNβ(VTVN)

左边是一个非终结符,右边是终结符非终结符组成的任意串。

3型(正规文法,有限自动机):
右线性文法

产生式形如: A → α B 或 A → α A → αB 或 A → α AαBAα
其中: α ∈ V T ∗ ; A , B ∈ V N α∈ V_T^*;A,B∈V_N αVTABVN

右边要么没有非终结符
如果有非终结符的话,只能出现在最右边。

左线性文法

产生式形如: A → B α 或 A → α A → Bα 或 A → α ABαAα
其中: α ∈ V T ∗ ; A , B ∈ V N α∈ V_T^*;A,B∈V_N αVTABVN

右边要么没有非终结符
非终结符要出现,只能在定义式的最左边。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

是个2型文法不是3型文法,S出现在候选式中间,不是最左边也不是最右边,只能由上下文无关文法来产生,不能由正规文法来产生

计算机科学理论可以证明,像 a n b n a^nb^n anbn这种自嵌套的语言只能由上下文无关文法来描述,不能由正规文法来描述

举例:
在这里插入图片描述

在这里插入图片描述

第三章

在这里插入图片描述

小概念:单词的长度不能超过半区的长度,半区的长度就是程序语言允许的最大长度
如果标识符长度不能超过128,就可以推断出扫描缓冲区的长度为256

正规式和正规集

在这里插入图片描述

程序语言定义合法单词的集合就是正规集
为了更好的表示正规集,我们用正规式作为正规集的代表/命名。

对给定的字母表 ∑ ∑
1) ε ε ε Ф Ф Ф都是 ∑ ∑ 上的正规式,它们所表示的正规集为{ ε ε ε}和 Ф Ф Ф;
2) 任何 a ∈ ∑ a∈ ∑ a,a是 ∑ ∑ 上的正规式,它所表示的正规集为{a} ;
3) 假定e1和e2都是 ∑ ∑ 上的正规式,它们所表示的正规集为L(e1)和L(e2),则

  • i) (e1|e2)为正规式,它所表示的正规集为L(e1)∪L(e2),(两个正规集的并还是正规集)
  • ii) (e1.e2)为正规式,它所表示的正规集为L(e1)L(e2),(两个正规集的连接还是正规集)
  • iii) ( e 1 ) ∗ (e1)^* (e1)为正规式,它所表示的正规集为 ( L ( e 1 ) ) ∗ (L(e1))^* (L(e1)),(一个正规集的闭包还是正规集)

仅由有限次使用上述三步骤而定义的表达式才是 ∑ ∑ 上的正规式,仅由这些正规式表示的字集才是 ∑ ∑ 上的正规集

Ф Ф Ф/{ }既是集合也是正规式也是正规集
不是字符也不是由字母表字符构成的字符串,因此其不是字

ε ε ε既是字也是正规式,其正规集是{ ε ε ε}

a是字母表中的字符
则a是字符,当然a也可以看成一个由一个字符a构成的长度为1的字符串,因此a是字
根据定义a也是正规式
其对应的正规集为{a}
在这里插入图片描述
在这里插入图片描述

{} VS { ε ε ε}
这两个集合都是正规集,空集对应的正规式是 Ф Ф Ф这个符号,而{ ε ε ε}所对应的正规式是 ε ε ε,{ ε ε ε}集合中有一个元素(字)尽管字的长度是0,而空集{}里面没有任何元素。

在这里插入图片描述
回顾:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

题型——证明正规式等价

对给定的字母表 ∑ ∑
1) ε ε ε Ф Ф Ф都是 ∑ ∑ 上的正规式,它们所表示的正规集为{ ε ε ε}和 Ф Ф Ф;
2) 任何 a ∈ ∑ a∈ ∑ a,a是 ∑ ∑ 上的正规式,它所表示的正规集为{a} ;
3) 假定e1和e2都是 ∑ ∑ 上的正规式,它们所表示的正规集为L(e1)和L(e2),则

  • i) (e1|e2)为正规式,它所表示的正规集为L(e1)∪L(e2),(两个正规集的并还是正规集)
  • ii) (e1.e2)为正规式,它所表示的正规集为L(e1)L(e2),(两个正规集的连接还是正规集)
  • iii) ( e 1 ) ∗ (e1)^* (e1)为正规式,它所表示的正规集为 ( L ( e 1 ) ) ∗ (L(e1))^* (L(e1)),(一个正规集的闭包还是正规集)

仅由有限次使用上述三步骤而定义的表达式才是 ∑ ∑ 上的正规式,仅由这些正规式表示的字集才是 ∑ ∑ 上的正规集

解题思路:运用上述规则,证明两个正规式对应的正规集等价。

在这里插入图片描述

在这里插入图片描述

小结: 正规式和正规集

保留字,标识符,整常数等合法的单词符号构成正规集,每个正规集抽象成一个正规表达式。

上面集合也可以用正规表达式表达出来:
先把每一类单词表示成正规式
DIM正规式→{DIM}正规集
IF正规式→{IF}正规集
letter(letter|digit)*
digit(digit)*

状态转换图

在这里插入图片描述

初态:有一个
终态:至少有一个

3.3.2 确定有限自动机(DFA)

在这里插入图片描述
DFA允许没有终止状态
在这里插入图片描述
DFA可以表示为状态转换图。

  • 假定DFA M含有m个状态n个输入字符

  • 这个图含有m个状态结点,每个结点顶多含有n条箭弧射出,且每条箭弧用Σ上的不同的输入字符来作标记

  • 对于Σ*中的任何字α,若存在一条从初态到某一终态的道路,且这条路上所有弧上的标记符连接成的字等于α,则称α为DFA M所识别(接收)

  • DFA M所识别的字的全体记为L(M)。
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

在这里插入图片描述

A:能识别空字 ε ε ε,系统初始就是q0状态,这个时候不读入任何字符,也是停留在q0状态,而q0又是终态。
或者说我从q0到q0是一条初态到终态的通路,这个通路上的边上的标记没有读入任何符号,所以没有转换关系,路径长度为0,字符串长度为0,但它又是从初态到终态的一条通路,这条通路上所标记的字符串就是空字 ε ε ε,所以说其能识别空字 ε ε ε
即相当于从初态q0出发,读入了长度为0的字符串之后,继续停留在终止状态q0,也就是识别了空字 ε ε ε

B:系统初始就是q0状态,又没有任何其他状态,也没有任何转换关系,因此,它永远找不到一条从初态出发到终态的道路,所以它不能完成任何字的识别,所以它识别的字的全体为空集 Ф Ф Ф(区别于上述由空字 ε ε ε构成的集合)

题型:确定有限自动机DFA的化简

DFA的化简(最小化)

  • 对于给定的DFA M,寻找一个状态数比M少的DFA M’,使得L(M)=L(M’)
    两个状态s和t等价的条件为:
  • 一致性条件: 状态s和t必须同时为终态或非终态;
  • 蔓延性条件: 对于所有输入符号,状态s和t必须转换到等价的状态里。

假设s和t为M的两个状态,称s和t等价∶如果从状态s出发能读出某个字α而停止于终态,那么同样,从t出发也能读出α而停止于终态;反之亦然。
p.s.两个终态可以不一样

  • 两个状态不等价,则称它们是可区别的。

在这里插入图片描述

在这里插入图片描述
只要找到一个字
在这里插入图片描述
划分时要确保划到不同子集里面的一定是可区分的
在这里插入图片描述
ε可以把终态非终态区别开来

具体做法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.3.3 非确定有限自动机(NFA)

在这里插入图片描述

  • DFA初态唯一(确定性)
    NFA初态可以有多个,即其起始状态可以从不同的状态出发(非确定性)
  • DFA状态函数为单值的部分映射,转换关系后继唯一。(确定性)
    NFA从一个状态识别一个字之后所到到达的后继状态可能是多个,不唯一。(非确定性)

从状态图中看NFA 和DFA的区别:

  1. NFA可以有多个初态
  2. 弧上的标记可以是Σ*中的一个字,而不一定是单个字符;
  3. 同一个字可能出现在同状态射出的多条弧上。

DFA是NFA的特例

在这里插入图片描述

问题:是不是正规式的闭包必须用正规集来求?

b*c是一个正规式,对应了一个正规集{c,bc,bbc,…}这个转换关系说的是 从状态0出发,识别了这个正规式所对应的正规集当中的一个字之后就可以从0转到2,而1状态边上的标记可以理解为ab是一个字,表示从1出发识别ab这个字之后还是回到状态1。

甚至也可以把ab理解为一个正规式,这个正规式所对应的正规集里面只有一个字ab,也是识别了这个正规式中间所中的一个所对应的正规集当中的一个字之后从状态1转到状态1。

对状态2自圈弧上的标记是一个正规式a|b,这个正规式表示从状态2出发,识别了这个正规式所对应的正规集中间的一个字之后转到状态2,这个a|b的正规式所对应的正规集是{a,b}

DFA弧上的标记只能是字符
NFA弧上的标记可以是字符,可以是字,(可以是正规式,暂不考虑)。
p.s.字VS字符 字符组成字,字符一般指单个字符。

在这里插入图片描述
在这里插入图片描述

DFA与NFA区别:

  1. DFA初态唯一(确定性)
    NFA初态可以有多个,即其起始状态可以从不同的状态出发(非确定性)

  2. DFA弧上标记一定是单个字符
    NFA弧上的标记可以是Σ*中的一个字,而不一定是单个字符;
    注意:空字ε不是字符,它是字/正规式,所以DFA弧上没有空字。

  3. DFA状态函数为单值的部分映射,转换关系后继唯一。(确定性)
    NFA从一个状态识别一个字之后所到到达的后继状态可能是多个,不唯一。(非确定性)

DFA和NFA等价性
  • 定义:对于任何两个有限自动机M和M’,如果L(M)=L(M’),则称M与M’等价

如果两个有限自动机,他们所能接受字的全体等价,那这两个自动机等价

  • 自动机理论中一个重要的结论:判定两个自动机等价性的算法是存在的。
  • DFA与NFA描述能力相同
    对于每个NFA M存在一个DFA M’,使得 L(M)=L(M’)。

在这里插入图片描述

题型:将NFA转换为DFA——证明DFA与NFA的等价性

在这里插入图片描述
将XY分别作为唯一初态与终态,消除NFA和DFA在初始状态上的差异,解决了初始状态上唯一性问题。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

注意:如果算出来的Ia,Ib为空集 Ф Ф Ф,空集 Ф Ф Ф也要放在第一列中,虽然空集Ia,Ib也为 Ф Ф Ф

在这里插入图片描述
当所有第二列,第三列出现过的子集在第一列都已经计算过了,这个计算过程就可以停止。
在这里插入图片描述
得到状态集之间的状态转换关系
给每个状态集进行编号,得到状态转换矩阵,再把它化成状态转换图
在这里插入图片描述
3,4,5,6都有Y,都是终态,0是唯一的初态

3.3.4 正规文法与有限自动机的等价性

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

题型一:由正规文法推有限自动机——证明等价性

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

题型二:由有限自动机推正规文法——证明二者等价性
1. 由DFA构造右线性文法

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2. 由NFA构造左线性文法

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

总结:

  • 右线性文法需要增加终态f
  • 左线性文法需要增加初态q

在这里插入图片描述
在这里插入图片描述

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

为NFA构造正规式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 最后,X到Y的弧上标记的正规式即为所构造的正规式r
  • 显然L( r )=L(M)=L(M’)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

3.3.5’ 为NFA构造正规式

内容跟上面基本相同,细节可能略有不同,上面懂了这个可以跳过

在这里插入图片描述
在这里插入图片描述
然后,反复使用下面的三条规则,逐步消去结点,直到只剩下X和Y为止。
在这里插入图片描述

有时候消除一个节点可能会用到多条路径,一定要把每条路径替换成等价的路径,不能遗漏

在这里插入图片描述

如上例,考虑消除状态3,先把状态3自身U1,U2弧合并,然后在考虑消除状态3,消除状态3可能涉及4条路径:

1→3→4,3有自身的回边,按照规则3,保留/生成一条从1→4的路径,这条路径标记V1(U1|U2)*W1

1→3→5,3有自身的回边,按照规则3,保留/生成一条从1→5的路径,这条路径标记V1(U1|U2)*W2

2→3→4,3有自身的回边,按照规则3,保留/生成一条从1→4的路径,这条路径标记V2(U1|U2)*W1

2→3→5,3有自身的回边,按照规则3,保留/生成一条从1→4的路径,这条路径标记V2(U1|U2)*W2

这样就把状态3消除了,也减少了弧的数目,但是状态转换图和原来状态转换图等价。经过反复计算,弧的数目会越来越少,最后只剩下X和Y两个状态以及他们的弧。

在这里插入图片描述

题型:为正规式构造NFA

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

情形1 : r=r1|r2
  • 由归纳假设,存在L(M1)=L(r1),L(M2)=L(r2)
  • 引入两个新状态q0(唯一初态)和f0(唯一终态)
  • 从q0分别射出两个ε弧到q1,q2
  • M1,M2中的转换关系不变(保留M1,M2内部转换关系)
  • 从f1,f2分别射出ε弧到f0
    在这里插入图片描述
    在这里插入图片描述
情形2 : r=r1r2
  • 由归纳假设,存在L(M1)=L(r1),L(M2)=L(r2)
  • 将M1唯一的初态q1作为最后构造出来的M的唯一的初态,将M2原来唯一的终态f2作为最后构造出来的M的唯一的终态
  • 保留M1,M2内部转换关系。
  • 增加ε弧从f1射到q2
    在这里插入图片描述
情形2 : r=r1*
  • 已知r1中间的运算符一定小于k,因为*(闭包)也算一个运算符。
  • 故r1一定存在一个非确定有限自动机M1与之等价,并且L(M1)=L(r1),且M1有唯一确定的初态q1和唯一确定的终态f1,并且终态没有射出弧
  • 引入两个新状态,q0(唯一初态)和f0(唯一终态)
  • 增加四个转换关系(4个ε弧),具体见下图
  • 对M1之前的转换关系继续保留
    在这里插入图片描述

上述过程展示了将正规表达式转化为非确定有限自动机的算法。

做题只用会下面的就行:
在这里插入图片描述
这三条规则的使用将使状态转换图上的节点和弧不断增多,但是弧上的标记越来越短
反复使用这些规则,就能逐步把这个图转变为每条弧只标记为工上的一个字符或ε,最后得到一个NFA M’,显然L(M’)=L( r )
这一过程和NFA确定化成DFA时所做的工作是类似的
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 7
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1. 实验内容 每一个正规集都可以由一个状态数最少的DFA所识别,这个DFA是唯一的(不考虑同构的情况)。任意给定的一个DFA,根据以下算法设计一个C程序,将该DFA 化简为与之等价的最简DFA。 2. 实验设计分析 2.1 实验设计思路 根据实验指导书和书本上的相关知识,实现算法。 2.2 实验算法 (1)构造具有两个组的状态集合的初始划分I:接受状态组 F 和非接受状态组 Non-F。 (2)对I采用下面所述的过程来构造新的划分I-new. For I 中每个组G do Begin 当且仅当对任意输入符号a,状态s和读入a后转换到I的同一组中; /*最坏情况下,一个状态就可能成为一个组*/ 用所有新形成的小组集代替I-new中的G; end (3)如果I-new=I,令I-final=I,再执行第(4)步,否则令I=I=new,重复步骤(2)。 (4)在划分I-final的每个状态组中选一个状态作为该组的代表。这些代表构成了化简后的DFA M'状态。令s是一个代表状态,而且假设:在DFA M中,输入为a时有从s到t转换。令t所在组的代表是r,那么在M’中有一个从s到r的转换,标记为a。令包含s0的状态组的代表是M’的开始状态,并令M’的接受状态是那些属于F的状态所在组的代表。注意,I-final的每个组或者仅含F中的状态,或者不含F中的状态。 (5)如果M’含有死状态(即一个对所有输入符号都有刀自身的转换的非接受状态d),则从M’中去掉它;删除从开始状态不可到达的状态;取消从任何其他状态到死状态的转换。 。。。。。。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值