全套编译原理复习与期末必考试题.docx
《全套编译原理复习与期末必考试题.docx》由会员分享,可在线阅读,更多相关《全套编译原理复习与期末必考试题.docx(33页珍藏版)》请在冰豆网上搜索。
全套编译原理复习与期末必考试题
第一章:
1.编译程序的步骤和任务:
1)词法分析:
从左到右一个字符一个字符地读入源程序,对构成源程序的字符流进行扫描和分解,从而识别出一个个单词。
2)语法分析:
是在词法分析基础上将单词序列分解成各类语法短语(比如程序、语句、表达式等),通过语法分析确定整个输入串是否构成一个语法上正确的程序。
3)语义分析:
是审查源程序有无语义错误,为代码生成阶段收集类型信息。
4)中间代码产生:
将源程序变成一种易于翻译成目标代码的内部表示形式。
5)代码优化:
对前阶段生成的中间代码进行变换或改造,使生成的目标代码更为高效
6)目标代码生成:
把中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码。
2.前端和后端的概念,试问前端通常包括那些阶段,后端包括那些阶段?
答:
前端只依赖于源语言,与目标机无关。
编译程序的前端通常包括词法分析程序、语法
分析程序、语义分析程序、中间代码生成程序及相关的表格管理程序和出错处理程序。
后端
是指编译器中依赖于目标机器的部分,只与中间代码有关。
通常包括目标代码生成程序、代
码优化程序以及相关的表格管理程序和出错处理程序。
遍(PASS):
对输入文件(源程序或其等价的中间语言程序)从头到尾扫视,完成预定处理
的过程。
一个多遍的编译程序较之一遍的编译程序可能少占内存,逻辑结构可能清晰些,但效率相
对可能差点
3.程序的正确与否:
结构上的语法规则,语义上的语义规则。
翻译程序:
汇编,解释,编译。
4.解释程序及其与编译程序的比较
解释程序功能:
源程序+初始数据=计算结果
解释与编译的区别:
工作模式:
这是根本区别,编译把源程序翻译成目标代码,而解释直接得到计算结果,不生成目标代码。
存储区内容:
编译方式翻译和执行分开,解释方式翻译和执行同时并允许修改源程序,因此二者存储组织不同。
效率:
解释慢于编译,很多语言两种方式都有。
标识符:
=表达式
第三章:
文法和语言
1.文法的直观概念:
一组判定规则。
在实践中,文法不包含多余产生式。
2.文法G定义为四元组(VT,VN,S,P),其中:
VT是一个非空有穷终结符号集合;
VN是一个非空有穷的非终结符号集合,且VT∩VN=Φ;
P是一个产生式的非空有穷集合(注意:
产生式左部至少含有一个非终结符);
S∈VN,称为开始符号,且S至少必须在某个产生式的左部出现一次。
通常用V表示VN∪VT,V称为文法G的字母表或字汇表.
3.句型、句子:
设文法G,如果符号串x是从识别符号推导出来的,即S→x,x∈V*,则称x是一个句型。
仅含终结符号的句型是一个句子。
4.语言:
语言L(G)是由文法G产生的所有句子所组成的集合。
5文法的类型:
逐渐对产生式施加限制四种类型:
0型,1型,2型,3型
0型:
G=(VT,VN,S,P),规则形式:
β→αα,∈β(VT⋃VN)*,α中至少有一个非终结符
1型(上下文有关):
∣β∣≤∣α∣,仅S->ε除外
规则形式:
αAβ→αγβA∈VN,α,γ,β∈(VT⋃VN)*,γε≠
2型(上下文无关):
规则形式:
Aβ→A∈VN,β∈(VT⋃VN)*
3型正规文法(右线性):
A→aB或A→aA,B∈VN
(左线性)A→Ba或A→aa∈VT⋃{ε}
6.最左(最右)推导
在推导的任何一步α⇒β,其中α、β是句型,都是对α中的最左(右)非终结符
进行替换
规范推导:
即最右推导。
规范句型:
由规范推导所得的句型。
7.文法的二义性
如果一个文法存在某个句子对应两棵不同的语法树,或者说,若一个文法中存在某个句子,它有两个不同的最左(最右)推导,则说这个文法是二义的.如果产生上下文无关语言的每一个文法都是二义的,则说此语言是先天二义的。
8.自上而下的分析方法:
自上而下分析法,是从文法开始符号出发,反复使用各种产生式,逐步进行推导,直至推导出输入符号串。
过程:
自上而下方法是从文法识别符号开始,将它作为语法树的根,向下逐步建立语法树,使语法树的末端结点符号串正好是输入符号串。
关键问题:
假定要被代换的最左非终结符号是A,且有n条产生式:
A→a1|a2|…|an,那么如何确定用哪个产生式右部去替代A?
9.自下而上的分析方法:
自下而上分析法,是从输入符号串开始,逐步进行归约,直至归约到文法的开始符号。
过程:
自下而上方法是从输入符号串开始,以它作为语法树的末端结点,自底向上地构造语法树,使语法树的根结点正好是文法的开始符号。
关键问题:
因为分析工作的每一步都是从当前串中选择一个子串,将它归约到某个非终结符,暂且把这个子串称为可归约串,问题是,每一步如何确定这个可归约串?
10.短语:
若S⇒*αAδ且A⇒+β,则称β是句型αβδ相对于非终结符A的短语。
直接短语:
若S⇒*αAδ且A⇒β,则称β是句型αβδ相对于非终结符A的直接短语。
句柄:
一个句型的最左直接短语。
(产生式的右部)
11.子树:
一棵语法树中一个特有的结点连同它的全部后裔,连接这些后裔的边以及这些结点的标记,称为子树。
子树与短语的关系
(1)短语:
子树的末端结点(即树叶)组成的符号串;
(2)直接短语:
简单子树的末端结点组成的符号串;
(3)句柄:
最左简单子树的末端结点组成的符号串;
左图所示的关于句型E+E*i的语法树来说:
它有3棵子树,即3个短语分别为i、E*i和E+E*i;
直接短语、句柄均为i。
从语法树中可以看出,
所有树叶的组合就是其相对应的父结点的短语。
句型i+i*i的语法树
有5棵子树,短语和直接短语如下:
直接短语:
i1,i2,i3
短语:
i1,i2,i3,i1*i2,i1*i2+i3
句柄:
i1
注意:
i2+i3不是短语不是某棵子树的结果
12.有关文法的实用限制:
有害规则是指形为U->U的产生式。
会引起文法二义性。
多余规则是指文法中那些任何句子推导都用不到的规则,包括两种规则,即不可到达的和不可终止的。
不可达到的:
不在文法的任何规则右部出现的非终结符。
不可终止的:
文法中那些不能从其推出终结符号串的非终结符。
第四章:
词法分析
1.任务:
从左至右逐个字符地对源程序进行扫描,产生一个个单词序列,用以语法分析
2、接口方式:
(1)词法分析工作可以组织成独立的一遍,把字符流的源程序变为单词序列,输出在一个中间文件上,这个文件作为语法分析程序的输入而继续编译过程。
(2)将词法分析程序设计成一个子程序,当语法分析程序需要一个单词时,则调用该子程序,从源程序中读入一些字符,直到识别出一个单词,或说直到下一个单词的第一个字符为止,这种设计方案是把词法分析和语法分析程序放在同一遍,省掉了中间文件。
单词符号的输出形式:
二元组:
(单词种别,单词自身的值)
单词符号的分类:
关键字,标识符,常数,运算符,界符等(这种分类不是唯一的)
3.正规文法与正规式的转换
(若两个正规式x和y所表示的正规集相同,则说x和y等价,写作x=y。
)
转换为DFA:
DFA的表示
(1)用转换函数;
(2)状态转换矩阵;(3)状态转换图
NFA与DFA的主要区别:
允许有多个初始状态。
允许状态在其输出边上有相同的符号(多值映射)。
允许输出边上有空串符号ε。
NFA特点:
在给定状态和符号的情况下,不能唯一的确定下一个状态。
NFA的确定化基本方法基本方法:
ε边合并,符号合并(NFA转化成的DFA不是唯一的)
【例】NFAM如右图所示,试将其确定化为DFAM'。
【解答】
(1)用子集法将图所示的NFAM确定化为表1。
(2)对表1中的所有子集重新命名
得到表2的状态转换矩阵
化简:
通过消除多余状态和合并等价状态将一个DFAM转换成一个最小的与之等价的DFAM`
多余状态是指,从该自动机的开始状态出发,任何输入串都不能到达的那个状态。
在有穷自动机中,两个状态s和t等价的条件是:
1)一致性条件:
即s和t必须同为终态或同为非终态
2)蔓延性条件:
即对所有输入符号,s和t必须转换到等价的状态里。
有穷自动机的状态s和t不等价,则称这两个状态是可区别的。
6.正规式转换为有穷自动机:
r=s|t
r=s*
x
y
ε
ε
ε
ε
N(s)
第五章:
自顶向下语法分析方法
求FIRST集,FOLLOW集
LL
(1)文法判定
1、语法分析是编译程序的核心部分:
在词法分析的基础上,识别单词符号序列是否是给定文法的正确句子(程序)。
自上而下分析的前提:
消除左递规和
消除回溯。
自顶向下分析法就是
从文法的开始符号
出发,试图推导出与
输入的单词串完全
匹配的句子。
如果能够推导出,则该输入串是给定文法的句子。
如果不能推导出,则该输入串不是给定文法的句子。
2.自顶向下分析法分两种:
不确定的自顶向下分析法:
是带有回溯的分析方法,效率低,代价高,极少使用。
确定的自顶向下分析法:
对文法有一定的限制,但实现简单直观,便于手工或自动构造。
3.确定的自顶向下分析思想:
判定是否为LL
(1)文法
首符号FIRST集:
设G=(VT,VN,S,P)是上下文无关文法
FIRST(α)={a|α→aβ,a∈VT,α,β∈V*}
若α→ε,则规定ε∈FIRST(α).
后跟符号FOLLOW集:
FOLLOW(A)={a∣S→…Aa…,a∈VT,A∈VN}
若S→...A,则规定#∈Follow(A).
选择集合SELECT集:
给定上下文无关文法的产生式A->α,A∈VN,α∈V*,若α→﹨ε,则SELECT(A->α)=FIRST(α)
如果α→ε,则SELECT(A->α)=(FIRST(α)-{ε})⋃FOLLOW(A)
(1)的含义:
LL
(1)文法是无二义的、LL
(1)文法不含左递归
第1个L:
从左到右扫描输入串
第2个L:
生成的是最左推导
1:
向右看1个输入符号便可决定选择哪个产生式
一个上下文无关文法是LL
(1)文法的充分必要条件是:
对每个非终结符A的任两个不同产生式A→α,A→β,满足:
Select(A→α)∩Select(A→β)=∅,其中:
α、β不同时推导出ε
注:
对LL
(1)文法进行语法分析时不会产生回溯。
5.某些非LL
(1)文法到LL
(1)文法的等价变换:
1.提取左公因子
2.消除左递归(如果一个文法是左递归时,则不能采用自顶向下分析法。
)
(1)左递归的定义(含有左递归的文法绝对不是LL
(1)文法)
一个文法含有下列形式的产生式时,
A→AβA∈VN,β∈V*直接左递归
②A→BβB→AαA,B∈VN,α,β∈V*间接左递归
(2)直接左递归的消除(改为右递归)
S→Sa
S→b
S→bS’
S’→aS’|ε
形如:
A→Aa|β(a非ε,β不以A打头)
改写为:
A→βA¢A¢→aA¢|ε
形如:
A→Aa1|Aa2|...|Aan|b1|b2|...|bm
其中,每个a都不等于ε,b1,...,bm均不以A开头。
改写为:
A→b1A¢|b2A¢|...|bmA¢A¢→a1A¢|a2A¢|...|anA¢|ε
6.不确定性分析思想:
(1)由于相同左部的产生式的右部FIRST集交集不为空而引起回塑。
S->xAyA->ab|a
(2)由于相同左部产生式的右部存在能→ε的,且非终结符FOLLOW集中含有其他产生式右部FIRST集的元素。
1)S->aAS2)S->b3)A->bAS4)A->ε
FOLLOW(A)={a,b}
(3)由于文法含有左递归而引起回溯
7.确定的自顶向下分析方法:
递归子程序法、预测分析法。
8.预测分析法
基本思想:
从左到右扫描源程序,直接根据:
预测分析器构成:
预测分析程序,先进后出栈,预测分析表——与文法有关
第七章:
LR分析
LR(0)分析表
识别活前缀的DFA
分析过程
对输入串的分析过程(已知文法的分析表)
LR分析法:
是一种规范规约过程
LR(k)含义
L:
从左到右扫描输入符号
R:
最右推导对应的最左归约(反序完成最右推导)
k:
超前读入k个符号,以便确定归约用的产生式
LR(0)项目分类
移进项目,形如A→α•aβ,a是终结符,α,β∈V*以下同【例】S→•bBB
待约项目,形如A→α•Bβ【例】S→b•BBS→bB•B
归约项目,形如A→α•【例】S→bBB•
接受项目,形如S’→S•
第八章:
1.语义处理的两个功能:
(1)审查每个语法结构的静态语义,即验证语法结构合法的程序是否真正有意义。
(2)执行真正的翻译,生成中间代码或目标代码。
2.属性文法:
一个属性文法包含一个上下文无关文法和一系列语义规则,这些语义规则附在每个产生式上。
文法符号的属性:
单词的含义,即与文法符号相关的一些信息。
如,类型、值、存储地址等。
一个属性文法是一个三元组A=(G,V,F)
G:
上下文无关文法。
V:
属性的有穷集。
每个属性与文法的一个终结符或非终结符相连。
属性与变量一样,可以进行计算和传递。
F:
关于属性的断言或谓词(一组属性的计算规则)的有穷集。
断言或语义规则与一个产生式相联,只引用该产生式左端或右端的终结符或非终结符相联的属性。
综合属性:
若产生式左部的单非终结符A的属性值由右部各非终结符的属性值决定,则A的属性称为综合属性。
继承属性:
若产生式右部符号B的属性值是根据左部非终结符的属性值或者右部其它符号的属性值决定的,则B的属性为继承属性。
在两种情况下,都说属性b依赖于属性c1,c2,…,ck
(1)非终结符既可有综合属性也可有继承属性,但文法开始符号没有继承属性。
(2)终结符只有综合属性,没有继承属性,它们由词法程序提供。
在计算时:
综合属性沿属性语法树向上传递;继承属性沿属性语法树向下传递。
3.语法制导翻译:
是指在语法分析过程中,完成附加在所使用的产生式上的语义规则描述的动作。
语法制导翻译实现:
对单词符号串进行语法分析,构造语法分析树,然后根据需要构造属性依赖图,遍历语法树并在语法树的各结点处按语义规则进行计算。
4.中间代码:
1、是复杂性介于源程序语言和机器语言的一种表示形式。
2、一般,快速编译程序直接生成目标代码。
3、为了使编译程序结构在逻辑上更为简单明确,常采用中间代码,这样可以将与机器相关的某些实现细节置于代码生成阶段仔细处理,并且可以在中间代码一级进行优化工作,使得代码优化比较容易实现。
何谓中间代码:
源程序的一种内部表示,不依赖目标机的结构,易于代码的机械生成。
为何要转换成中间代码
逻辑结构清楚;利于不同目标机上实现同一种语言。
便于移植,便于修改,便于进行与机器无关的优化。
中间代码的几种形式:
逆波兰记号,三元式和树形表示,四元式
逆波兰记号:
把运算分量(操作数)写在前面,把运算符写在后面的表示法,又称后缀表示法。
中缀表达式向逆波兰表达式转换
第十章:
运行时的存储区
为了使目标程序能够运行,编译程序要从操作系统中得到一块存储区,以使目标程序能够在其上运行。
运行时的存储区划分
目标区:
存放目标代码。
代码区(code)
静态数据区(staticdata):
编译时能确定所占用空间的数据。
栈区和堆区(stackandheap):
可变数据及管理过程活动的控制信息。
存储分配方案策略:
静态存储分配;动态存储分配:
栈式、堆式。
静态存储分配
1、基本策略
在编译时就安排好目标程序运行时的全部数据空间,并能确定每个数据项的单元地址。
2、适用的分配对象:
子程序的目标代码段;全局数据目标(全局变量)
3、静态存储分配的要求:
不允许递归调用,不含有可变数组。
FORTRAN程序是段结构,不允许递归,数据名大小、性质固定。
是典型的静态分配
动态存储分配
1、如果一个程序设计语言允许递归过程、可变数组或允许用户自由申请和释放空间,那么,就需要采用动态存储管理技术。
2、两种动态存储分配方式:
栈式,堆式
栈式动态存储分配
分配策略:
将整个程序的数据空间设计为一个栈。
【例】在具有递归结构的语言程序中,每当调用一个过程时,它所需的数据空间就分配在栈顶,每当过程工作结束时就释放这部分空间。
过程所需的数据空间包括两部分
一部分是生存期在本过程这次活动中的数据对象。
如局部变量、参数单元、临时变量等;
另一部分则是用以管理过程活动的记录信息(连接数据)。
活动记录(AR)
一个过程的一次执行所需要的信息使用一个连续的存储区来管理,这个区(块)叫做一个活动记录。
构成
1、临时工作单元;2、局部变量;3、机器状态信息;4、存取链;
5、控制链;6、实参;7、返回地址
第十一章:
什么是代码优化
所谓优化,就是对代码进行等价变换,使得变换后的代码运行结果与变换前代码运行结果相同,而运行速度加快或占用存储空间减少。
优化原则:
等价原则:
经过优化后不应改变程序运行的结果。
有效原则:
使优化后所产生的目标代码运行时间较短,占用的存储空间较小。
合算原则:
以尽可能低的代价取得较好的优化效果。
优化分类:
局部优化,循环优化,全局优化
常见的优化技术
(1)删除多余运算(删除公共子表达式)
(2)代码外提:
是针对循环的
(3)强度削弱;把执行时间较长的运算替换为执行时间较短的运算
(4)变换循环控制条件(5)合并已知量与复写传播(6)删除无用赋值
基本块定义
程序中只有一个入口和一个出口的一段顺序执行的语句序列,称为程序的一个基本块。
对四元式序列,各个基本块的入口语句是:
(1)代码序列的第一个语句。
(2)转移语句的目标语句。
(3)转移语句的下一条语句。
例子:
(1)read(C)
(2)A:
=0
(3)B:
=1
(4)L1:
A:
=A+B
(5)ifB>=CgotoL2
(6)B:
=B+1
(7)gotoL1
(8)L2:
write(A)
(9)halt
必经结点
在程序流图中,对任意结点m和n,如果从流图的首结点出发,到达n的任一通路都要经过m,则称m是n的必经结点,记为mDOMn。
必经结点集:
流图中结点n的所有必经结点的集合称为结点n的必经结点集,记为D(n)。
回边:
假设a→b是流图中一条有向边,如果bDOMa,则称a→b是流图中的一条回边。
循环(依据回边判断)
1、给出一个回边n→d,定义这个边的(自然)循环是d加上所有不经过d能到达n的结点;
2、d是这个循环的首结点。
【例】求出左图的所有回边。
【解答】
(1)6→6,因为D(6)={1,2,4,6},
所以6DOM6,故6→6是回边;
(2)7→4,因为D(7)={1,2,4,7},
所以4DOM7,故7→4是回边;
(3)4→2,因为D(4)={1,2,4},
所以2DOM4,故4→2是回边。
容易看出,其它有向边都不是回边。
例二:
求回边和循环
回边4→3(3DOM4)
循环:
{3,4,5,6,7,8,10}
回边7→4(4DOM7)
循环:
{4,5,6,7,8,10}
回边10→7(7DOM10)
循环:
{7,8,10}
回边8→3(3DOM8)
循环:
{3,4,5,6,7,8,10}
一、填空题(每空2分,共20分)
1.编译程序首先要识别出源程序中每个单词,然后再分析每个句子并翻译其意义。
2.编译器常用的语法分析方法有自底向上和自顶向下两种。
3.通常把编译过程分为分析前端与综合后端两大阶段。
词法、语法和语义分析是对源程序的分析,中间代码生成、代码优化与目标代码的生成则是对源程序的综合。
4.程序设计语言的发展带来了日渐多变的运行时存储管理方案,主要分为两大类,即静态存储分配方案和动态存储分配方案。
5.对编译程序而言,输入数据是源程序,输出结果是目标程序。
1.计算机执行用高级语言编写的程序主要有两种途径:
解释和编译。
2.扫描器是词法分析器,它接受输入的源程序,对源程序进行词法分析并识别出一个个单词符号,其输出结果是单词符号,供语法分析器使用。
3.自下而上分析法采用移进、归约、错误处理、接受等四种操作。
4.一个LL
(1)分析程序需要用到一张分析表和符号栈。
5.后缀式abc-/所代表的表达式是a/(b-c)。
二、单项选择题(每小题2分,共20分)
1.词法分析器的输出结果是__C。
A.单词的种别编码 B.单词在符号表中的位置
C.单词的种别编码和自身值 D.单词自身值
2.正规式M1和M2等价是指__C_。
A.M1和M2的状态数相等 B.M1和M2的有向边条数相等
C.M1和M2所识别的语言集相等 D.M1和M2状态数和有向边条数相等
3.文法G:
S→xSx|y所识别的语言是_C____。
A.xyx B.(xyx)*C.xnyxn(n≥0) D.x*yx*
4.如果文法G是无二义的,则它的任何句子α_A____。
A.最左推导和最右推导对应的语法树必定相同 B.最左推导和最右推导对应的语法树可能不同
C.最左推导和最右推导必定相同 D.可能存在两个不同的最左推导,但它们对应的语法树相同
5.构造编译程序应掌握____D__。
A.源程序 B.目标语言 C.编译方法 D.以上三项都是
6.四元式之间的联系是通过__B___实现的。
A.指示器 B.临时变量 C.符号表 D.程序变量
7.表达式(┐A∨B)∧(C∨D)的逆波兰表示为__B___。
A.┐AB∨∧CD∨ B.A┐B∨CD∨∧ C.AB∨┐CD∨∧ D.A┐B∨∧CD∨
8.优化可生成__D___的目标代码。
A.运行时间较短 B.占用存储空间较小
C.运行时间短但占用内存空间大D.运行时间短且占用存储空间小
9.下列___C___优化方法不是针对循环优化进行的。
A.强度削弱 B.删除归纳变量 C.删除多余运算 D.代码外提
10.编译程序使用_B_区别标识符的作用域。
A.说明标识符的过程或函数名 B.说明标识符的过程或函数的静态层次
C.说明标识符的过程或函数的动态层次 D.标识符的行号
三、判断题(对的打√,错的打×,每小题1分,共10分)
2.一个有限状态自动机中,有且仅有一个唯一的终态。
x
3.一个算符优先文法的每个非终结符号间都也可能存在优先关系。
X
4.语法分