编译原理复习

前言

提最近几天快要期末考试了,赶紧复习一下编译原理基本知识


提示:以下是本篇文章正文内容

复习须知

使用的教材是国防工业大学出版社编译原理第3版教材

第一章

在这里插入图片描述

1.1什么叫编译程序

编译程序:是指这样的程序, 它能够把某种语言的程序转化成另一种语言的程序,而后者与前者在逻辑上是等价的。如果源语言是诸如FORTRAN、Pascal、C、Ada、Smalltalk或Java这样的“高级语言”,而目标语言如汇编语言之类的“低级语言”这样的翻译程序则称之为编译程序。

1.2编译程序的工作过程

编译程序的工作过程如下(示例):
在这里插入图片描述
源程序输入,经过词法分析器产生单词符号.
语法分析器对单词符号串进行语法分析,识别出各类语法单位。
语义分析与中间代码产生器对归约出的语法单位进行语义分析并把他们翻译成一定形式的中间代码。
代码优化器对中间代码进行优化处理。
目标代码生成器把中间代码翻译成目标程序。
表格与表格管理用于记录源程序的各种信息以及编译过程中的各种状况。
错误处理
遍就是对源程序或源程序的中间结果从头到尾扫描一次。
错误包括语法错误和语义错误。
语法错误是指源程序中不符合语法(或词法)规则的错误。
语义错误是指源程序中不符合语义规则的错误。

第二章

2.1程序语言的定义

一个程序语言是一个记号系统,程序语言主要语法和语义两部分定义。
所谓一个语言的语法是指这样的一组规则,用它可以形成和产生一个合式的程序。
这些规则的一部分称为词法规则,另一部分称为语法规则(或产生规则)。

词法规则和语法规则
词法规则是指单词符号的形成规则。
语言的语法规则规定了如何从单词符号形成更大的结构(即语法单位),换言之,语法规则是语法单位的形成规则。
语言的词法规则和语法规则定义了程序的形式结构,是判断输人字符串是否构成一个形式上正确(即合式)程序的依据。
语义
一个语言的语义是指这样的一组规则,使用它可以定义一个程序的意义。这些规则称为语义规则。

2.2程序语言语法的描述

重点讨论上下文无关文法、语法分析树以及文法的二义性问题
设Σ是一个有穷字母表,它的每个元素称为一个符号。

1、Σ上的一个符号串:是指由Σ中的符号所构成的一个有穷序列。不包含任何符号的序列称为空字,记为ε。用Σ﹡表示Σ上的所有符号串的全体,空字ε也包括在其中
例如:
∑={a,b},则 ∑﹡={ε,a,b,aa,ab,ba,bb,aaa,…}。
Ф表示不含任何元素的空集{}。
注意:要注意空字ε、{}和{ε}的区别

2、语言:是给定字母表上一个任意的可数的串集合。

语言运算

1、 Σ﹡的子集L和M的并运算
L∪M = {s|s∈L或s∈M}

2、Σ﹡的子集和M的(连接)积
LM = {αβ|α∈L且β∈M}

3、V自身的连接积
记为Vⁿ=VV……V
规定:V°={ε}
令 V﹡= V0∪V¹∪V²∪V ³∪……
称V是V的闭包。记V﹢=VV,称V+是V的正则闭包

2.3上下文无关文法

文法是描述语言的语法结构的形式规则(即语法规则)。
上下文无关文法所定义的语法范畴(或语法单位)是完全独立于这种范畴可能出现的环境的。

一个上下文无关文法G包括四个组成部分:一组终结符号,一组非终结符号,一个开始符号,以及一组产生式。

终结符号乃是组成语言的基本符号,在程序语言中就是以前屡次提到的单词符号,如基本字、标识符、常数、算符和界符等。从语法分析的角度来看,终结符号是一个语言的不可再分的基本符号。
非终结符号(也称语法变量)用来代表语法范畴。例如,“算术表达式”、“布尔表达式”、“赋值句”、“分程序”、“过程”等。
开始符号是一个特殊的非终结符号,它代表所定义的语言中我们最终感兴趣的语法范畴,这个语法范畴通常称为“句子”
产生式(也称产生规则或简称规则)
是定义语法范畴的一种书写规则。一个产生式的形式是A→α
其中,箭头(有时也用::=)左边的A是一个非终结符,称为产生式的左部符号;箭头右边α的是由终结符号或/与非终结符号组成的一符号串,称为产生式的右部。

一个上下文无关文法G是一个四元式(VT,VN,S,ρ),
其中
VT是一个非空有限集,它的每个元素称为终结符号;
VN是一个非空有限集,它的每个元素称为非终结符号,VT∩VN=φ
S是一个非终结符号,称为开始符号;
ρ是一个产生式集合(有限),每个产生式的形式是P→α,其中,P€ VN, α €(VT∪VN)* 。开始符号S至少必须在某个产生式的左部出现一次

对于多个左部相同的产生式:
P→α1
P→α2
……
P→αn
可写为: P→α1| α2…… αn
其中每个αi称为是P的一个候选式。
→ 读为“定义为”,
| 读为“或”。

上下文无关文法定义一个语言的中心思想是:
从文法的开始符号出发,反复连续使用产生式,对非终结符施行替换和展开。
我们称αAβ直接推出αγβ,
即αAβ=> αγβ
仅当A→γ是一个产生式,且α、β∈(VT∪VN)*。
如果αl => α2 => … => αn,则我们称这个序列是从αl至αn的一个推导。
若存在一个从αl至αn的推导,则称αl可推导出αn.
假定G是一个文法,S是它的开始符号。如果S => α,则称α是一个句型。仅含终结符号的句型是一个句子。
文法G所产生的句子的全体是一个语言,将它记为L(G)
L(G) ={α|S => α&α∈VT﹡}

下面介绍几个简单文法的例子:
例1考虑一个文法G1:
S→bA A→aA|a 它定义了一个什么语言呢?
从开始符S出发,我们可以推出如下句子:
SbA ba
SbA baA baa
…………
SbA baA  …  baa…a
可以写为: L(G1)={ban|n≥1}

例2. 设有文法G
S→P|aPPb
P →ba|bQa
Q →ab
求语言L(G).
解:L(G) = {ba,baba,ababab,abababab,ababababab}

例2。3 构造一个文法G3使
L(G3)={anbn|n≥1}
解: S ->aSb|ab

2.4最左推导和最右推导

所谓最左推导指:任何一步a => β都是对α中的最左非终结符进行替换的。
同样,可定义最右推导。
(ii+i)的最右推导:
E =>(E)
=>(E+E)
=>(E+i)
=>(E
E+i)
=>(Ei+i)
=>(i
i+i)

例: G = ({E}, {i, +, *, (, ) } , P , E) P: E  E + E | E * E | ( E ) | i
句子 ( i * i + i)的语法树:
(1) E -> (E) -> (E + E) -> (E * E + E) (i * E + E)  (i *i + i)
(2) E  (E)  (E * E)  (E * E + E) (E * E + i)  (i *i + i)
用一张图表示一个句型的推导,这种表示称为语法分析树,或简称为语法树。
一棵语法树表示了一个句型种种可能的(但未必是所有的)不同推导过程,包括最左(最右)推导。
如果一个文法存在某个句子对应两棵不同的语法树,则称这个文法是二义的。也就是说,若一个文法中存在某个句子,它有两个不同的最左(最右)推导,则这个文法是二义的。

2.5乔姆斯基文法类型

乔姆斯基把文法分成四种类型,即0型、l型、2型和3型。
0型强于1型,l型强于2型,2型强于3型。
这几类文法的差别在于对产生式施加不同的限制。

我们说G=(VT ,VN ,S ,) 是一个0型文法,如果它的每个产生式 是这样的结构
(VNVT)* 且至少有一个非终结符,而 (VNVT)* 。0型文法也称短语文法。
如果对0型文法分别施加以下的第i条限制,则我们就得到第i型文法:
(1)G的任何产生式  均满足||≤ ||(其中||和||分别为和的长度;仅S例外,但S不得出现在任何产生式的右部。
(2)G的任何产生式为A, AVN, (VNVT)* 。
(3)G的任何产生式为AB或 A,其中VT*,A、B  VN 。

其中1型文法也称上下文有关文法。这种文法意味着,对非终结符进行替换式务必考虑上下文并且一般不允许替换成空串。
※2型文法也称上下文无关文法,注意其语言定义:
G的任何产生式为A→β,A∈VN, β∈(VN∪VT)*
    表明凡出现在产生式左边的符号都是非终结符。
3型文法也称右线性文法。
3型文法还有另一种形式,称左线性文法:一个文法G为左线性文法,如果G的任何产生式为
A→Ba 或A→a ,其中∈VT* ,
A、B ∈ VN 由于3型文法等价于正规式所以也称正规文法

2.6第二章考点及例题

[例2.1]:
试构造生成语言L={anbnci|n>=1, i >=0}的文法
解:G[S]:S->AB A->aAb|ab B->cB|ε

[例2.2]:
已知语言L={anbbn| n >=1}, 写出产生L的文法。
解:G[S]: S->aAb A->aAb|b

[例2.3]:
已知文法G=({A,B,C},{a,b,c},A,P)
其中产生式P由以下组成:
A ->abc A ->aBbc
Bb ->bB Bc ->Cbcc
bC ->Cb aC ->aaB
aC ->aa
问:此文法表式的语言是什么?
解:由于以A为开始符号,A->abc|aaBbbcc
此文法表达式的语言为L ={anbncn|n>=1}

[例2.4]: 已知语言L={x | x∈{a,b,c}*,且x重复排列是对称的(aabcbaa,aabbaa,等) 写出该语言的文法。
解:
G(S): S->aSa|bSb|cSc|a|b|c|ε

重点考察题型:(1)乔姆斯基文法类型、(2)根据文法写出生成的语言(3)根据语言构造相应的文法

第三章 词法分析

词法分析的任务:从左至右逐个字符地对源程序进行扫描,产生一个个的单词符号,把作为字符串的源程序改造成为单词符号串的中间程序。

一、设计第一步:输入、预处理
词法分析器工作的第一步是输入源程序文本。输入串一般是放在一个缓冲区中,这个缓冲区称输入缓冲区。
预处理工作包括对空白符、跳格符、回车符和换行符等编辑性字符的处理,及删除注解等。
设想构造一个预处理子程序,他完成上面的工作。每当词法分析器调用它时就处理出一串确定长度的输入字符,并将其装入词法分析器所指定的缓冲区中(称为扫描缓冲区)。这样分析器就可以在此缓冲区中直接进行单词符号的识别工作。

二、单词符号的识别:超前搜索
分析器对扫描缓冲区进行扫描时一般用两个指示器,一个指向当前正在识别的单词的开始位置(指向新单词的首字符),另一个用于向前搜索以寻找单词的终点。

3.1状态转换图

状态转换图是一张有限方向图。在状态转换图中,结点代表状态,用圆圈表示。状态之间用箭弧连结。箭弧上的标记(字符)代表在射出结点(即箭弧始结点)状态下可能出现的输入字符或字符类。
一张转换图只包含有限个状态(即有限个结点),其中有一个被认为是初态,而且实际上至少要有一个终态(用双圈表示)。一个状态转换图可用于识别(或接受)一定的字符串。
例如下图所示
在这里插入图片描述
终态结点一般对应一个形如return(code,value)的语句。
其中,code为单词种别编码;value或是单词符号的属性值,或无定义。

3.2 正规表达式与有限自动机

正规式和正规集的递归定义:

(1)ε和φ都是Σ上的正规式,它们所表示的正规集分别为{ε}和φ
(2)任何a€Σ,a是Σ上的一个正规式,它所表示的正规集为{a};
(3)假定U和V都是Σ上的正规式,它们所表示的正规集分别记为L(U)和L(V),那么,(U|V)、(U·V)和(U)也都是正规式,它们所表示的正规集分别为L(U) UL(V),L(U)L(V)(连接积)和(L(U))(闭包)。
仅由有限次使用上述三步骤而得到的表达式才是Σ上的正规式。仅由这些正规式所表示的字集才是Σ上的正规集

确定有限自动机(DFA)
定义:
一个确定有限自动机(DFA)M是一个五元式
M=(S,Σ,δ,s0,F)
其中
(1) S是一个有限集,它的每个元素称为一个状态。
(2) Σ是一个有穷字母表,它的每个元素称为一个输入字符。
(3) δ是一个从SxΣ至S的单值部分映射。δ(s,a)=s’ 意味着:当现行状态为s、输入字符为a时,将转换到下一状态s’。我们称s’为s的一个后继状态。
(4) s0∈S,是唯一的初态。
(5) F⊆S,是一个终态集(可空).

2、状态转换矩阵:显然, DFA可以用一个矩阵表示,该矩阵的行表示状态,列表示输入字符,矩阵元表示δ(s,a)的值,该矩阵称为状态转换矩阵

例如,有DFA M=({0,1,2,3},{a,b},δ,0,{3})
其中δ为

δ(0,a)=1                δ(0,b)=2
δ(1,a)=3                δ(1,b)=2
δ(2,a)=l                δ(2,b)=3
δ(3,a)=3                δ(3,b)=3

它所对应的状态转换矩阵如表所列
在这里插入图片描述
3、一个DFA也可表示成一张(确定的)状态转换图。
假定DFA M 含有m个状态n个输入字符,那末,这张图含有m个状态结点,每个结点顶多有n条箭弧射出和别的结点相连接,每条箭弧用上的一个不同字符作标记,整张图含有唯一的初态和若干个(可以是0个)终态结点。

在这里插入图片描述
对于∑*中的任何字α,若存在一条从初态结点到某一终态结点的通路,且这条通路上所有弧的标记符连接成的字等于α,则称α可为DFA M所识别(读出或接受)。
若M的初态结点同时又是终态结点,则空字ε可为M所识别(或接受)。
DFA M 所能识别的字的全体记为L(M)。

非确定有限自动机(NFA)
一个非确定有限自动机(NFA) M是一个五元式
M=(S,∑,δ,S0,F)
其中
(1)S同上;
(2)∑同上;
(3) δ是一个从S×∑到S的子集的映照,
即δ: S ×∑
→2的s次方
(4) S0⊆S,是一个非空初态集;
(5) F⊆S,是一个终态集(可空)。
一个含有m个状态和n个输入字符的NFA可表示成如下的状态转换图:
该图含有m个状态结点,每个结点可射出若干条箭弧与别的结点相连接,每条弧用∑*中的一个字(不一定要不同的字而且可以是空字ε)作标记(称为输入字),整张图至少含有一个初态结点以及若干个(可以是0个)终态结点。某些结点既可以是初态结点也可以是终态结点。

第三章考点及例题

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值