编译原理学习笔记——正规文法与有限自动机

教材:《编译原理》 陈火旺

这是个人学习笔记,从文法到有限自动机梳理了一下知识点

文法

前导概念

注:我用 单引号(‘ ’)表示 单个字符 双引号(“ ”)表示符号串
这样更容易区分,不过书里面是没有单引号和双引号的!

符号表

单个符号构成的有穷集合,一般表示为 “Σ”
例如:Σ={‘a’,’b’,’c’,’1’,’2’,’3’,’%’,’+’,’-‘}
Σ* 表示 Σ上所有符号串的全体

2.符号串

很好理解 符号串就是由符号表中的符号构成的有穷序列。
设有符号串X=‘a’+’b’=”ab” ,Y=‘c’+’d’=”cd”
符号串有一个属性叫长度,很好理解:“ab”的长度为2,”abc”的长度为3
对符号串的运算:乘积(连接).
很好理解: XY=“abcd”
直观理解:这编程语言中很常见的两个字符串变量相加

3.符号串集合

很好理解:把一些符号串组成一个集合就得到了符号串集合

集合相乘:

设两个符号串集合
A={“a”,”b”,”ab”,”12”}
B={“c”,”bc”}
设x代表A集合的元素
设y代表B集合的元素
则A与B相乘的结果定义为这样的一个 符号串集合:
A*B={xy|x∈A,y∈B}
其中xy表示两个符号串的连接而成的符号串

另外我觉得有必要补充的是离散数学中笛卡儿积的概念,笛卡儿积也是两个集合相乘运算的一种定义
AxB={(x,y)|x∈A,y∈B},但是经过这样运算以后生成的是有序偶的集合与编译原理中的集合相乘运算定义并不一样

定义了乘法那么 集合的幂运算 其实就是自己跟自己相乘。

集合的闭包

设现有符号串集合A,令A={“a”,”ab”,”c”}(无论是符号串集合还是符号表)
则A的闭包(A*)为是指这样的一个符号串集合:
A*所有元素都是由A中的符号串经过有限次连接而成

A*=A0∪A1∪A2∪····∞
其中 规定了 A0={ ε } 即 空串集合(不等于空集!)
直观看来其A*之中已经包括所有组合连接的可能情况,
显然这个集合是无穷集合。
更加形象来说:假设用26个英文字母作为集合A 那么A*就是用这26个字母可能构成的所有单词的集合(不考虑组成的单词是否有意义)
A的正(则)闭包 A+其实就是去除了集合A0 也就是{ε}之后的集合

语言

符号序列的集合称为形式语言

每个形式语言都是某个字母表上按某种规则构成的所有符号串的集合。反之,任何一个字母表上符号串的集合均可定义为一个形式语言。

通俗点说语言是句子的集合。

每个具体语言,都有语法和语义两个方面
形式语言是指不考虑语言的具体意义,即不考虑语义。

现在的问题是如何描述这门语言
如果组成语言的句子是有限个的话,那么只要枚举出来所有的句子就等于是描述清楚了这门语言。

但情况往往是:我们可以构造无穷多个不同的句子,因此无法通过枚举语言中包含的所有句子来描述这门语言。

在这种情况下,我们使用文法来描述这门语言。

例如,设字母表∑={ 0, 1 }, 则

∑+=∑1∪∑2∪∑3∪…

={ 0, 1, 00, 10, 11, 01, 000, 100, …}

显然形式语言 Σ+是无穷集合

下面用A表示∑+,用式子A→0表示符号串0∈A或A生成符号串0,

符号“→”读作“定义为
则集合A可表示成:

{
   A0
   A1
   A→A0
   A→A1
 }

以上诸如“A→0”的式子 称为 规则 也称 产生式

定义

设有文法G
G包括四个组成部分:一组终结符号(Terminal),一组非终结符号(Nonterminal),一个开始符号,以及一组产生式。
通常表示成四元组
这里写图片描述
VN 是规则中非终结符号的集合。

VT 是规则中终结符号的集合。

P 是文法规则的集合。※

P={
   A0
   A1
   A→A0
   A→A1
 }

S 是一个非终结符号,称为文法的开始符号或文法的识别符号,它至少要在一条规则中作为左部出现。由它开始,识别出我们所定义的语言。

由文法定义可知,文法是对语言结构的定义和描述,文法四大要素中关键是规则的集合。

以上就是文法的定义。

文法分类

乔姆斯基把文法分成了4类;即,对以上定义中的产生式的格式进行限制,比如0型文法(不加限制),1型文法,2型文法,3型文法

0型文法

就是不加限制的文法

1型文法

从略

2型文法 ※

2型文法相应的语言称为2型语言或上下文无关语言,它的识别系统是非确定下推自动机
产生式形如: A→b
其中:A∈VN ;b∈(VT∪VN)*

3型文法 ※

由于3型文法( 左线性右线性)等价于正规式,所以也称正规文法
产生式形如: A→aB 或 A→a
其中: a∈VT*;A,B∈VN

四种文法描述能力比较

这里写图片描述
由图可知 正规文法是描述能力最弱的 0型文法最强


正规式与正规集

正规文法和 正规式正规集

定义

递归定义

  • ε是一个正规式,它表示集合L(ε)={ε}。
  • 若a是∑上的字符,则a是一个正规式,它所表示的正规集L(a)={a}。
  • 若正规式r和s分别表示正规集L(r)、L(s),则
    (a)r|s是正规式,表示集合L(r)∪L(s);
    (b)r·s是正规式,表示集合L(r)L(s);
    (c)r*是正规式,表示集合(L(r))*;
    (d)(r)是正规式,表示集合L(r)。

仅由有限次地使用上述三个步骤定义的表达式才是∑上的正规式。
运算符“|”、“·”、“*”分别称为“或”、“连接”和“闭包”。在正规式的书写中,连接运算符“·”可省略。运算符的优先级从高到低顺序排列为:“*”、“·”、“|”。
运算符“|”表示“或”、并集。“*”表示*之前括号里的内容出现0次或多次。
若两个正规式表示的正规集相同,则认为二者等价。两个等价的正规集U和V

关于正规式和正规集的理解:简单说来,字母表里面的元素是正规式,这些元素经过一些运算(| 或,· 连接,* 闭包)之后依然是正规式 由此可知正规式其实是描述了一个集合,这个集合称作正规集。

正规式本身是由字符表元素和运算符组成。可以没有运算符,比如,L(a)={a}
也可以有运算符的比如正规式 U=(a|b) ,L(U)={a,b}
如果正规式里面没有闭包操作,那么就是有限个字符串,反之则是无穷个字符串。
(a|b)=(a*b)*

确定有限自动机(DFA)

定义

一个确定有限自动机(DFA)M 是一个五元式

M =(S,Σ,δ,s0 ,F )
(1) S 是一个非空有限集,它的每个元素称为一个状态
(2) Σ是一个有穷字母表,它的每个元素称为一个输入符号,所以也称为输入符号字母表
(3)δ是状态转换函数,是在S×Σ→S上的单值映射。δ(s,a)=s’ 意味着输入a以后会从s状态转换到s’状态
(4) s0, s0 ∈S,是唯一的一个初态
(5) F, F∈S,可空,是一个终态集,终态也称可接受状态或结束状态

特点:

  1. 初态唯一
  2. 输入字符不包括ε
  3. 有向边上只有一个字符
  4. 一个状态对于某个字符,最多只有一条出边

如图:

这里写图片描述

对定义进行一些说明:

SxΣ 是指 S与Σ的笛卡儿积,生成的是有序偶集合

笛卡儿积:设A,B为集合,用A中元素为第一元素,B中元素为第二元素构成有序对,所有这样的有序对组成的集合叫做A与B的笛卡尔积,
记作AxB.A×B={(x,y)|x∈A∧y∈B}
例如:设 有状态S={1,2} Σ={a,b},则SxΣ={(1,a),(1,b),(2,a),(2,b)}

单值映射

两个非空集合A与B间存在着对应关系f,而且对于A中的每一个元素x,B中总有唯一的一个元素y与它对应,就这种对应为从A到B的映射,记作f:A→B。其中,b称为元素a在映射f下的,记作:b=f(a)。a称为b关于映射f的原象。集合A中所有元素的象的集合称为映射f的值域,记作f(A)。

非确定有限自动机(NFA)

定义

一个非确定有限自动机(NFA) M是一个五元式

M=(S,Σ,δ,S0,F)
(1)S 有穷非空状态集合
(2)Σ 有穷的输入字母表集合
(3)δ 从Sx∑*到S的子集的映射
(4)S0∈S, 是S的非空子集,称为初始状态集合
(5)F ∈ S ,是S的子集(可空),称为终止状态集合

特点:

  1. 初态不唯一
  2. 输入字符包括 ε
  3. 有向边上可以为字符串
  4. 一个状态对于某个字符,可能有多条输出边,即状态的后继不唯一

正规文法,正规式,DFA以及NFA的关系

对于每一个NFA M 都存在一个DFA M” 使 L(M)=L(M”)(NFA可以转换成DFA)
正规文法与有限自动机等价(可以相互转换)
正规式与有限自动机等价(可以相互转换)
正规文法与正规式等价(可以相互转换)

正规文法→正规式

方法
  1. 将正规文法中的每个非终结符表示成关于它的一个正规式方程,获得一个联立方程组

  2. 依照求解规则:

   若 x = αx | β (或 x = αx + β ) 
   则解为 x = α*β (右线性)
   若 x = xα | β (或 x = xα + β ) 
   则解为 x = βα* (左线性)

以及正规式的分配律、交换律和结合律求关于文法开始符号的正规式方程组的解。

另注:
2型文法是(上下文无关文法)是用来语法分析的,词法分析暂时不需要考虑它啦,3型文法是主场

正规式→正规文法

方法
  1. 令 VT=Σ 。
  2. 对任何正规式R选择一个非终结符Z生成规则Z→R并令S=Z。
  3. 若a和b都是正规式,对形如 A→ab 的规则转换成 A→aB和 B→b两规则,其中B是新增的非终结符。
  4. 对已转换的文法中, 形如A→ a*b 的规则,进一步转换 成 A → aA | b 。
  5. 不断利用规则(3)和(4)进行变换,直到 每条规则最多含有一个终结符为止。

正规式→NFA

由正规式构造NFA
设有正规式R

输入:字母表Σ上的正规式R

注:因为正规式代表了一类符号集合,转换成NFA的过程中正规式充当的对象是输入字符的作用。也就是说,构造出可以识别此正规式的NFA

输出:识别(接受)语言L(R)的NFAN

方法
1.引进初始结点X和终止结点Y,把R表示成拓广转换图

拓广转换图

2.分析R的语法结构,用如下规则对R中的每个基本符号构造NFA。

(1)R=Φ, 构造NFA如图所示。
这里写图片描述

2)R= ε , 构造NFA如图所示。
这里写图片描述

(3)R= a (a∈Σ), 构造NFA如图所示。
这里写图片描述
(4) 若R是复合正规式,则按下图的转换规则
对R进行分裂和加进新结, 直至每个边上只留下一个符号或 ε 为止。
这里写图片描述

3.整个分裂过程中, 所有新结均采用不同的名字,保留X,Y为全图唯一初态结和终态结。

NFA→正规式

从NFA构造正规式
设有NFA M 以及正规式r

方法 :

(1)在M中引进新的初态结点X和终态结点Y,形成M’,使得:

这里写图片描述
这里写图片描述

(2)M’消结,只剩下X,Y 反复使用下面的替换规则消去M’中的所有结点,逐步用正规式来标记弧:
这里写图片描述
(3)结点X和Y之间弧上的标记,即为所求正规式r
这里写图片描述

  • 17
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值