计算机编译原理复习题附答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译原理(一)
一、是非题
1、算符优先关系表不一定存在对应的优先函。
………………………………………(√)
2、数组元素的地址计算与数组的存储方式有关。
……………………………(√)
3、仅考虑一个基本块,不能确定一个赋值是否真是无用的。
……………………(√)
4、每个文法都能改写为LL(1)文法。
……………………………………………(×)
5、对于数据空间的存贮分配,FORTRAN采用动态贮存分配策略。
…………(×)
二、填空题
1、从功能上说,程序语言的语句大体可分为(执行性)语句和(说明性)语句两大类。
2、扫描器的任务是从(源程序)中识别出一个个(单词符号)。
3、所谓最右推导是指:(任何一步α β都是对α中最右非终结符进行替换的)。
4、语法分析最常用的两类方法是(自上而下)和(自下而上)分析法。
5、一个上下文无关文法所含四个组成部分是(一组终结符号、一组非终结符号、一个开始符号、一组产生式。
)。
6、所谓语法制导翻译方法是(为每个产生式配上一个翻译子程序,并在语法分析的同时执行这些子程序)。
7、符号表中的信息栏中登记了每个名字的有关的性质,如(类型、种属、所占单元大小、地址)等等。
8、一个过程相应的DISPLAY表的内容为(现行活动记录地址和所有外层最新活动记录的地址)。
9、常用的两种动态存贮分配办法是(栈式)动态分配和(堆式)动态分配。
10、产生式是用于定义(语法范畴)的一种书写规则。
三、名词解释
1、遍--_指编译程序对源程序或中间代码程序从头到尾扫描一次。
2、无环路有向图(DAG)--如果有向图中任一通路都不是环路,则称庐有向图为无环路有向图,简称DAG。
3、语法分析--按文法的产生式识别输入的符号串是否为一个句子的分析过程
4、短语--—令G是一个文法。
S划文法的开始符号,假定αβδ是文法G的一个句
型,如果有SαAδ且AB,则称β是句型αβ相对非终结符A的短语。
5、后缀式--一种把运算量(操作数)写在前面把算符写在后面(后缀)的表示法。
四、简述题
1、考虑下面程序
…………
Var a:integer;
Procedure S(X);
Var X:integer;
Begin
a:=a+1;
X:=a+X
End;
Begin
a:=5;
S(a);
Print(a)
End.
试问:若参数传递方式分别采取传名和传值时,程序执行后输出a的值是什么?
1、答:传名:a=12(2分)
传值:a=6(2分)
2、画出Pascal中实数(不带正负号,可带指数部分)的状态转换图。
3、写出表达式(a+b*c)/(a+b)-d的逆波兰表示及三元式序列。
Yi
3、答:逆波兰表示:
abc*+ab+/d-(2分)
三元式序列:
① (*,b,c)
② (+,a,①)
③ (+,a,b)
④ (/,②,③)
⑤ (-,④,d)(2分)
4、已知文法G(S) san
S→a|∧|(T)
T→T,S|S
写出句子((a,a),a)的规范归约过程及每一步的句柄。
4、答:句型归约规则句柄
((a,a),a)S→a a
((S,a),a)T→S S
((T,a),a)S→a a
((T,S),a)T→T,S T,S
((S),a)T→S S
((T),a)S→S(T)(T)
(S,a)T→S S
(T,a)S→a a
(T,S)T→T,S T,S
(T)S→(T)(T)
S(4分)
5、何谓优化?按所涉及的程序范围可分为哪几级优化?
5、答:优化:对程序进行各种等价变换,使得从变换后的程序出发,能产生更有效的目标代码。
(2分)
三种级别:局部优化、循环优化、全局优化。
(2分)
6、目标代码有哪几种形式?生成目标代码时通常应考虑哪几个问题?
答:目标代码通常采用三种形式:机器语言,汇编语言,待装配机器语言模块。
(2分) 应着重考虑的问题:
(1)如何使生成的目标代码较短;
(2)如何充分利用寄存器,以减少访问内存次数;
(3)如何充分利用指仅系统的的特点。
(2分)
五、计算题
1、写一个文法,使其语言是奇数集,且每个奇数不以0开头。
1、解:文法G(N):
N→AB|B
A→AC|D
B→1|3|5|7|9
D→B|2|4|6|8
C→0|D(5分)
2、设文法G(S):si
S→(L)|a S|a
L→L,S|S
(1) 消除左递归和回溯;
(2) 计算每个非终结符的FIRST和FOLLOW;
(3) 构造预测分析表。
2、解:(1)
S→(L)|aS'
S'→S|ε
L→SL'
L'→SL'|ε
评分细则:消除左递归2分,提公共因子2分。
(2)
FIRST)S)={(,a}FOLLOW(S)={#,,,)}
FIRST(S')={,a,ε}FOLLOW(S')={#,,,)}
FIRST(L)={(,a}FOLLOW(L)={ )}
FIRST(L')={,,ε}FOLLOW(L'〕={ )}
3、While a>0 ∨b<0do
Begin
X:=X+1;
if a>0 then a:=a-1
else b:=b+1
End;
翻译成四元式序列。
3、解:
(1) (j>,a,0,5)
(2) (j,-,-,3)
(5) (+,×,1,T1)
(6) (:=,T1,-,×)
(7) (j≥,a,0,9)
(8) (j,-,-,12)
(9) (-,a,1,T2)
(10) (:=,T2,-,a)
(11) (j,-,-,1)
(12) (+,b,1,T3)
(13) (:=,T3,-,b)
(14) (j,-,-,1)
(15)
评分细则:控制结构4分,其它3分。
4、已知文法G(E) wu
E→T|E+T
T→F|T * F
F→(E)|i
(1) 给出句型(T * F+i)的最右推导及画出语法树;
(2) 给出句型(T * F+i)的短语、素短语。
4、解:(1) 最右推导:
ETF(E)(E+T)(E+F)(E+i)
(T+i)(T*F+i)
(2) 短语:(T*F+i),T*F+i,T*F,i(2分)
素短语:T*F,i (1分)
5、设布尔表达式的文法为
E → E(1)∨E(2)
E → E(1)∧E(2)
E → i
假定它们将用于条件控制语句中,请
(1) 改写文法,使之适合进行语法制导翻译和实现回填;
(2) 写出改写后的短个产生式的语义动作。
5、解:(1) E0→E(1)
E→E0E(2)
EA→E(1)
E→EAE(2)
E→i(3分)
(2) E→E(1)
{BACKPATCH(E(1)·FC,NXQ);
E0·TC:=E(1)·TC}
E→E0E(2)
{E·FC:=E(2)·FC;
E·TC:=MERG(E0·TC,E(2)·TC)}
EA→E(1)
{BACKPA TCH(E(1)·TC,NXQ);
E0·FC:=E(1)·FC}
E→EAE(2)
{E·TC:=E(2)·TC;
E·FC:=MERG(EA·FC,E(2)·FC}
E→i
{E·TC:=NXQ;E·FC:=NXQ+1;
GEN(jn2,entry(i),-0);
GEN(j,-,-,0)(3分)
6、设有基本块liu
T1:=2
T2:=10/T
T3:=S-R
T4:=S+R
A:=T2 * T4
B:A
T5:=S+R
T6:=T3 * T5
B:=T6
(1) 画出DAG图;
(2) 假设基本块出口时只有A,B还被引用,请写出优化后的四元序列。
6、解:(1)DAG:
(2) 优化后的四元式
T3:=S-R
T4:=S+R
A:=5*T4
B:=T3+T4(3分)
/jp2005/20/kcwz/stk/mnst/mnst2.htm
编译原理(二)
一选择题
【 B 】1.词法分析器的输入是。
A.符号串B.源程序C.语法单位D.目标程序
【 C 】2.两个有穷自动机等价是指它们的。
A.状态数相等B.有向弧数相等
C.所识别的语言相等 D.状态数和有向弧数相等
【 C 】3.文法G:S → xSx | y 所识别的语言是。
A.xy*x B.(xyx)* C.xx*yxx* D.x*yx*
【】4.设a,b,c为文法的终结符,且有优先关系a≡b和b≡c,则。
A.必有a≡c B.必有c≡a
C.必有b≡a D.选项A、B和C都不一定成立
【 D 】5.若状态k含有项目“A→α.”,且仅当输入符号a∈FOLLOW(A)时,才用规则“A →α”归约的语法分析方法是。
A.LALR分析法B.LR(0)分析法
C.LR(1)分析法D.SLR(1)分析法
【 D 】6.生成中间代码时所依据的是。
A.语法规则B.词法规则C.语义规则D.等价变换规则
【】7.表达式(┐a∨b)∧(c∨d)的逆波兰表示为。
A.┐ab∨∧cd∨B.a┐b∨cd∨∧
C.ab∨┐cd∨∧D.a┐b∨∧cd∨
【 A 】8.基本块。
A.只有一个入口语句和一个出口语句B.有一个入口语句和多个出口语句
C.有多个入口语句和一个出口语句D.有多个入口语句和多个出口语句
二判断题
【T 】1.同心集的合并有可能产生“归约/归约”冲突。
【】2.一个文法所有句子的集合构成该文法定义的语言。
【】3.非终结符可以有综合属性,但不能有继承属性。
【】4.逆波兰表示法表示表达式时无需使用括号。
【】5.一个有穷自动机有且只有一个终态。
【】6.若过程p第k次被调用,则p的DISPLAY表中就有k+1个元素。
三填空题
1.最常用的两类语法分析方法是自上而下和自下而上分析法。
2.对于文法G[E]:E→T|E+T T→F|T*F F→P↑F|P P→(E)|i,句型T+T*F+i的直接短语为,句柄为。
V则称“A →α.”为项目,称3.在LR(0)分析法中,若α,β∈V*且a∈T
“S →α.aβ”为项目。
4.在PL/0的目标代码解释执行时,寄存器B总是指向当前执行过程活动记录的,而寄存器T总是指向。
四(7分)有穷自动机M接受字母表∑={0,1}上所有满足下述条件的串:串中至少包含两个连续的0或两个连续的1。
请写出与M等价的正规式。
qi
五(8分)构造下列文法相应的有穷自动机。
ba
G[S]:S →aA | bQ
A →aA | b
B | b
B →bD | aQ
Q →aQ | bD | b
D →bB | aA
E →aB | bF
F →bD | aE | b
六(8分)写一个文法,使其语言是:
L ={ ambmanbn | m,n≥0 }
七(12分)已知文法
G[A]: A →aAB | a
B →Bb | d
(1)构造与G[A]等价的LL(1)文法;
(2)构造G’[A]的预测分析表。
八(12分)考虑文法
G[S]: S → AS | b A → SA | a
(1)构造文法的可归前缀图(活前缀的DFA ); (2)判断文法是否是LR(0)文法,并说明理由。
九(7分)将下面程序段翻译成四元式序列。
er while A<C ∧B<D do if A=1 then C:=C+1 else while A<D do A:=A+2; 十(6分)设有以下程序段 program main; var a,b:integer;
procedure p(x,y,z:integer); begin y:=y+1; z:=z+x end; begin
a:=2; b:=3; p(a+b,a,a); write(a) end.
对于下列参数传递方式,分别写出执行程序后a 的输出值。
(1)传名; (2)传地址。
编 译 原 理(三)
一、:请写出由下列文法所确定的语言. 1. G1: S →10S01 S →aA A →bA A →a
2. G2: S →aSS S →a
1、解:
n m n n m n m
n
n n n n n n
a a
b A ab abA aA S S S S )01()10()01()10()01()10()01()10()01()10(010*********⇒⇒⇒⇒⇒⇒⇒
所以语言{n
m n a ab )01()10(} n>=0,m>=0
2、解:1
2*
+⇒⇒⇒⇒⇒⇒n a S aaaaaaa
aaSSaSS S aaaaa aaSSS S aaa
S
所以语言{ 1
2+n a
} n>=0
证明文法G1和G2等价 G1:S →0S1,S →01
G2:A →0R ,A →01,R →A1
证明:n
n n n n S S S S 1010110010111
⇒⇒⇒⇒---
n n n n n A A R A R A 10101100100100111
⇒⇒⇒⇒⇒⇒---
因为两个文法的语言相同,所以文法G1,G2等价 三、令文法G 为 E →T|E+T|E-T T →F|T*F|T/F F →(E )|i
给出句子i+i*i 的最左推导和i*(i+i)的最右推导,并给出相应的语法树 试证明符号串T*F+i 是G 的一个句型(要求画出语法树). 写出T*F+i 句型的所有短语,直接短句和句柄.
解:i
i i F i i F
F i F T i T i T F T T T E E ****.1+⇒+⇒+⇒+⇒+⇒+⇒+⇒+⇒
)(*)(*)(*)(*)(*)(*)
(*)(*)(**i i i i i F i i T i F T i T T i E T F E T T E T E T F T T E +⇒+⇒+⇒+⇒+⇒+⇒+⇒+⇒⇒⇒⇒
2、证明:i F T F F T T F T T T T E E +⇒+⇒+⇒+⇒+⇒***
E E + T T F
T * F i
3、短语:T*F+i,T*F,i,
直接短语:T*F,i 句柄:T*F
四、构造以下正规式相应的NFA ,再确定化 10(1|0)*11
G :S →A|B A →aA|a B →bB|b
解:因为}{)()(}
{)()((b b B Select bB B Select a a A Select aA A aSelect A Select =→→=→→→
所以此文法不是LL (1)文法 产生式A ,B 有左公因子 提取左公因子得:
εεεε→→→⇔→→→→⇔→'''
)|(''')|(B B
B bB B B b B A A A aA A A a A
故文法为ε
ε
→→→→→→→→'''
'''B B
B bB B A A
A aA A
B S A
S
判断此文法是否为LL (1)文法
φεφεφ
===→→===→→==→→)(}{)'()()'()'()(}{)'()()'()'()()()()(S follow b B follow B first B select B B select S follow a A follow A first A select A A select B first A first B S select A S select
因为它们的SELECT 集交集为空,所以转化后的文法为LL (1)文法
编 译 原 理(四)
1.写出字母表∑ = {a, b}上语言L = {w | w 中a 的个数是偶数}的正规式,并画出接受该语言的最简DFA 。
答:1.语言L 的正规式是: (a b*a | b)* 或 b*(a b*a b*)* 接受该语言的最简DFA 是:
2.考虑下面的表达式文法,它包括数组访问、加和赋值: E → E[E] | E + E | E = E | (E) | id
该文法是二义的。
请写一个接受同样语言的LR(1)文法,其优先级从高到低依次是数组访问、加和赋值,并且加运算是左结合,赋值是右结合。
2. E → T = E | T T → T + F | F F → F[E] | (E) | id
3.下面是产生字母表∑ = { 0, 1, 2}上数字串的一个文法: S → D S D | 2 D → 0 | 1
写一个语法制导定义,它打印一个句子是否为回文数(一个数字串,从左向右读和从右向左读都一样时,称它为回文数)。
3. S ' → S print(S.val) S → D1 S1 D2 S.val = (D1.val = D2.val) and S1.val S → 2 S.val = true D → 0 D.val = 0 D → 1 D.val = 1
b。