编译原理题库.docx
- 文档编号:9189557
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:50
- 大小:31.28KB
编译原理题库.docx
《编译原理题库.docx》由会员分享,可在线阅读,更多相关《编译原理题库.docx(50页珍藏版)》请在冰豆网上搜索。
编译原理题库
第一章
什么是编译器?
编译程序的结构分为几个阶段,各阶段的任务是什么?
遍、编译前端及编译后端的含义?
编译程序的生成方式有哪些?
第二章
1.写一文法,使其语言是偶正整数的集合。
要求:
(1)允许0打头
(2)不允许0打头
解:
(1)允许0开头的偶正整数集合的文法
E→NT|DT→NT|D
N→D|1|3|5|7|9D→0|2|4|6|8
(2)不允许0开头的偶正整数集合的文法
E→NT|D
T→FT|G
N→D|1|3|5|7|9
D→2|4|6|8
F→N|0
G→D|0
2.证明下述文法G[〈表达式〉]是二义的。
〈表达式〉∷=a|(〈表达式〉)|〈表达式〉〈运算符〉〈表达式〉
〈运算符〉∷=+|-|*|/
解:
可为句子a+a*a构造两个不同的最右推导:
最右推导1〈表达式〉〈表达式〉〈运算符〉〈表达式〉
〈表达式〉〈运算符〉a
〈表达式〉*a
〈表达式〉〈运算符〉〈表达式〉*a
〈表达式〉〈运算符〉a*a
〈表达式〉+a*a
a+a*a
最右推导2〈表达式〉〈表达式〉〈运算符〉〈表达式〉
〈表达式〉〈运算符〉〈表达式〉〈运算符〉〈表达式〉
〈表达式〉〈运算符〉〈表达式〉〈运算符〉a
〈表达式〉〈运算符〉〈表达式〉*a
〈表达式〉〈运算符〉a*a
〈表达式〉+a*a
a+a*a
3.给出生成下述语言的上下文无关文法:
(1){anbnambm|n,m>=0}
(2){1n0m1m0n|n,m>=0}
解:
(1){anbnambm|n,m>=0}
S→AA
A→aAb|ε
精品文库
(2){1n0m1m0n|n,m>=0}
S→1S0|A
A→0A1|ε
第三章
1、构造一个DFA,它接收∑={a,b}上所有满足下述条件的字符串:
字符串中的每个a都有
至少一个b直接跟在其右边。
解:
已知∑={a,b},根据题意得出相应的的正规式为:
(b*abb*)*
根据正规式画出相应的DFAM,如下图所示
用子集法将其确定化
XX
(b*abb*)*
1
Y
Y
I
Ia
Ib
{X,1,2,3,Y}
{4}
{2,3}
{4}
—
{5,6,1,2,3,Y}
{2,3}
{4}
{2,3}
{5,6,1,2,3,Y}
{4}
{6,1,2,3,Y}
{6,1,2,3,Y}
{4}
{6,1,2,3,Y}
由DFA得状态图
顺序重新命名DFAM’
b
X
2
3
a
b*abb*
1
4
6
5
b
Y
b
I
Ia
Ib
0
1
2
1
—
3
2
1
2
3
1
4
4
1
4
用最小化方法化简得:
{0},{1},{2},{3,4},按
1
b
a
a
3
0aa
a
1b
a
b
b
2
4
b
b
第四章
练习1:
文法G[V]:
0a3
b
2
b
V→N|N[E]E→V|V+EN→i
是否为LL
(1)文法,如不是,如何将其改造成LL
(1)文法。
解:
LL
(1)文法的基本条件是不含左递归和回溯(公共左因子),而G[V]中含有回溯,所以先消
欢迎下载2
精品文库
除回溯得到文法G’[V]:
G’[V]:
V→NV’V’→ε|[E]
E→VE’E’→ε|+E
N→i
由LL
(1)文法的充要条件可证G’[V]是LL
(1)文法
练习2:
有文法G[s]:
S→BAA→BS|dB→aA|bS|c
(1)证明文法G是LL
(1)文法。
(2)构造LL
(1)分析表。
(3)写出句子adccd的分析过程
解:
(1)一个LL
(1)文法的充要条件是:
对每一个非终结符A的任何两个不同产生式A→α|
β,有下面的条件成立:
①FIRST(α)∩FIRST(β)=Φ;
②若β*ε,则有FIRST(α)∩FOLLOW(A)=Φ
对于文法G[s]:
S→BAA→BS|dB→aA|bS|c
其FIRST集如下:
FIRST(B)={a,b,c};FIRST(A)={a,b,c,d};FIRST(S)={a,b,c}。
其FOLLOW集如下:
首先,FOLLOW(S)={#};
对S→BA有:
FIRST(A)\{ε}加入FOLLOW(B),即FOLLOW(B)={a,b,c,d};
对A→BS有:
FIRST(S)\{ε}加入FOLLOW(B),即FOLLOW(B)={a,b,c,d};
对B→aA有:
FOLLOW(B)加入FOLLOW(A),即FOLLOW(A)={a,b,c,d};
对B→bS有:
FOLLOW(B)加入FOLLOW(S),即FOLLOW(S)={#,a,b,c,d};
由A→BS|d得:
FIRST(BS)∩FIRST(d)={a,b,c}∩{d}=Φ;
由B→aA|bS|c得:
FIRST(aA)∩FIRST(bS)∩FIRST(c)={a}∩{b}∩{c}=Φ。
由于文法G[s]不存在形如β→ε的产生式,故无需求解形如FIRST(α)∩FOLLOW(A)的值。
也即,文法G[S]是一个LL
(1)文法。
(2)由G[s]:
S→BAA→BS|dB→aA|bS|c的
FIRST(B)={a,b,c};
FOLLOW(B)={a,b,c,d};
FIRST(A)={a,b,c,d};
FOLLOW(A)={a,b,c,d};
FIRST(S)={a,b,c}
。
FOLLOW(S)={#,a,b,c,d}
可构造LL
(1)预测分析表如下:
a
b
c
d
#
S
S→BA
S→BA
S→BA
A
A→BS
A→BS
A→BS
A→d
B
B→aA
B→bS
B→c
S
S→BA
S→BA
S→BA
A
A→BS
A→BS
A→BS
A→d
B
B→aA
B→bS
B→c
欢迎下载3
精品文库
(3)在分析表的控制下,句子adccd的分析过程如下:
栈
当前输入符号
输入串
说明
#S
a
dccd#
S→BA
#AB
a
dccd#
B→aA
#AAa
a
dccd#
#AA
d
ccd#
A→d
#Ad
d
ccd#
#A
c
cd#
A→BS
#SB
c
cd#
B→c
#Sc
c
cd#
#S
c
d#
S→BA
#AB
c
d#
B→c
#Ac
c
d#
#A
d
#
A→d
#d
d
#
#
#
分析成功
第五章
1已知文法G[S]为:
S→a|∧|(T)
T→T,S|S
(1)计算G[S]的FIRSTVT和LASTVT。
(2)构造G[S]的算符优先关系表并说明G[S]是否为算符优先文法。
(3)给出输入串(a,(a,a))#的算符优先分析过程。
解:
文法:
S→a|∧|(T)T→T,S|S
展开为:
S→aS→∧S→(T)
T→T,ST→S
(1)FIRSTVT--LASTVT表
非终结符FIRSTVT集LASTVT集
S{a∧(}{a∧)}
T{a∧(,}{a∧),}
(2)算符优先关系表如下:
表中无多重入口所以是算符优先(OPG)文法。
a
∧
(
)
#
a
≯
≯≯≯
∧
≯
≮≯≯
(
≮
≮
≮
≒
≯
)
≮
≮
≮
≯
≯
≮
≮
≮
≯
#
≒
欢迎下载4
精品文库
(3)输入串(a,(a,a))#的算符优先分析过程为:
当前字
栈剩余输入串动作
符
#
(
a,(a,a))#
Movein
#(
a
(a,a))#
Movein
#(a
(a,a))#
Reduce:
S→a
#(N
(a,a))#
Movein
#(N,
(
a,a))#
Movein
#(N,(
a
a))#
Movein
#(N,(a
a))#
Reduce:
S→a
#(N,(N
a))#
Movein
#(N,(N,
a
))#
Movein
#(N,(N,a
)
)#
Reduce:
S→a
#(N,(N,N
)
)#
Reduce:
T→T,S
#(N,(N
)
)#
Movein
#(N,(N)
)
#
Reduce:
S→(T)
#(N,N
)
#
Reduce:
T→T,S
#(N
)
#
Movein
#(N)
#
Reduce:
S→(T)
#N
#
第六章
例1:
有文法:
S→(L)|aL→L,S|S
给此文法配上语义动作子程序(或者说为此文法写一个语法制导定义),它输出配对括号
的个数。
如对于句子(a,(a,a)),输出是2。
解:
加入新开始符号S'和产生式S'→S,设num为综合属性,代表值属性,则语法制导定
义如下:
产生式语义规则
S'→Sprint(S.num)
S→(L)S.num:
=L.num+1
S→aS.num:
=0
L→L1,SL.num:
=L1.num+S.num
L→SL.num:
=S.num
例2:
构造属性文法,能对下面的文法,只利用综合属性获得类型信息。
D→L,id|LL→TidT→int|real
解:
属性文法(语法制导)定义:
产生式语义规则
D
→L,id
D.type:
=L.type
addtype(id.entry,L.type)
D
→L
D.type:
=L.type
L
→Tid
L.type:
=T.type
addtype(id.entry,T.type)
T
→int
T.type:
=integer
T
→real
T.type:
=real
欢迎下载5
精品文库
第七章
例1:
给出下面表达式的逆波兰表示(后缀式):
(1)a*(-b+c)
(2)if(x+y)*z=0thens:
=(a+b)*celses:
=a*b*c
解:
(1)ab-c+*
(2)xy+z*0=sab+c*:
=sab*c*:
=¥
(注:
¥表示if-then-else运算)
例2:
请将表达式-(a+b)*(c+d)-(a+b)分别表示成三元式、间接三元式和四元式序列。
解:
三元式
间接三元式
(1)
(+
a,
b)
间接三元式序列
间接码表
(2)
(+
c,
d)
(1)(+
a,
b)
(1)
(3)
(*
(1),
(2))
(2)(+
c,
d)
(2)
(4)
(-
(3),
/)
(3)(*
(1),
(2))
(3)
(5)(+a,b)
(4)(-
(3),
/)
(4)
(6)
(-
(4),(5))
(5)(-
(4),
(1))
(1)
(5)
四元式
(1)
(+,
a,
b,t1)
(2)(+,c,
d,t2)
(3)
(*,t1,t2,t3)
(4)(-,t3,/,t4)
(5)
(+,a,
b,t5)
(6)(-,t4,t5,t6)
例3:
请将下列语句
while(AD)thenX:
=Y+Z
翻译成四元式
解:
假定翻译的四元式序列从(100)开始:
(100)ifA (101)goto(107) (102)ifC>Dgoto (104) (103)goto(100) (104)T∶=Y+Z (105)X∶=T (106)goto(100) (107) 例4: 写出for语句的翻译方案解: 产生式动作 S→forEdoS1S.begin: =newlabel S.first: =newtemp S.last: =newtemp S.curr: =newtemp S.code: =gen(S.first“: =”E.init) ||gen(S.last“: =”E.final) 欢迎下载6 精品文库 ||gen(“if”S.first“>”S.last“goto”S.next) ||gen(S.curr“: =”S.first) ||gen(S.begin“: ”) ||gen(“if”S.curr“>”S.Last“goto”S.next) ||S1.code ||gen(S.curr: =succ(S.curr)) ||gen(“goto”S.begin) E→v: =initialtofinalE.init: =initial.place E.final: =final.place 第八章 例1: C语言中规定变量标识符的定义可分为extern,externstatic,auto,localstatic 和register五种存储类: (1)对五种存储类所定义的每种变量,分别说明其作用域。 (2)试给出适合上述存储类变量的内存分配方式。 (3)符号表中登记的存储类属性,在编译过程中支持什么样的语义检查。 解: (1)extern定义的变量,其作用域是整个C语言程序。 externstatic定义的变量,其作用域是该定义所在的C程序文件。 auto定义的变量,其作用域是该定义所在的例程。 localstatic定义的变量,其作用域是该定义所在的例程。 且在退出该例程时,该变 量的值仍保留。 register定义的变量,其作用域与auto定义的变量一样。 这种变量的值,在寄存器 有条件时,可存放在寄存器中,以提高运行效率。 (2)对extern变量,设置一个全局的静态公共区进行分配。 对externstatic变量,为每个C程序文件,分别设置一个局部静态公共区进行分配。 对auto和register变量,设定它们在该例程的动态区中的相对区头的位移量。 而例 程动态区在运行时再做动态分配。 对localstatic变量,为每个具有这类定义的例程,分别设置一个内部静态区进行分配。 (3)实施标识符变量重复定义合法性检查,及引用变量的作用域范围的合法性检查。 第九章 例1: 下面的程序执行时,输出的a分别是什么? 若参数的传递办法分别为 (1)传名; (2)传地址;(3)得结果;4)传值。 programmain(input,output); procedurep(x,y,z); begin y∶=y+1; z∶=z+x; end; begin a∶=2; b∶=3; p(a+b,a,a); printa 欢迎下载7 精品文库 end. 解: (1) 参数的传递办法为“传名”时, a为9。 (2) 参数的传递办法为“传地址”, a为8。 (3) 参数的传递办法为“得结果”, a为7。 (4) 参数的传递办法为“传值”, a为2。 例2: 过程参数的传递方式有几种? 简述“传地址”和“传值”的实现原理。 解: 参数的传递方式有下述几种: 传值,传地址,传名,得结果 “传值”方式,这是最简单的参数传递方法。 即将实参计算出它的值,然后把它传给被调过程。 具体来讲是这样的: 1.形式参数当作过程的局部变量处理,即在被调过程的活动记录中开辟了形参的存储空间,这些存储位置即是我们所说的实参或形式单元。 2.调用过程计算实参的值,并将它们的右值(r-value)放在为形式单元开辟的空间中。 3.被调用过程执行时,就像使用局部变量一样使用这些形式单元。 “传地址”方式,也称作传地址,或引用调用。 调用过程传给被调过程的是指针,指向实参 存储位置的指针。 1.如实参是一个名字或是具有左值的表达式,则左值本身传递过去。 2.如实参是一个表达式,比方a+b或2,而没有左值,则表达式先求值,并存入某一位置,然后该位置的地址传递过去。 3.被调过程中对形式参数的任何引用和赋值都通过传递到被调过程的指针被处理成间接访问。 例3: 下面是一个Pascal程序 programPP(input,output) varK: integer; functionF(N: integer): integer begin ifN<=0thenF: =1 elseF: =N*F(N-1); end; begin K: =F(10); ... end; 当第二次(递归地)进入F后,DISPLAY的内容是什么? 当时整个运行栈的内容是什么? 解: 欢迎下载8 精品文库 第十章 例1: 何谓代码优化? 进行优化所需要的基础是什么? 解: 对代码进行等价变换,使得变换后的代码运行结果与变换前代码运行结果相同,而运行速度加快或占用存储空间减少,或两者都有。 优化所需要的基础是在中间代码生成之后或目标代码生成之后。 例2: 编译过程中可进行的优化如何分类? 最常用的代码优化技术有哪些? 解: 依据优化所涉及的程序范围,可以分为: 局部优化、循环优化和全局优化。 最常用的代码优化技术有 1.删除多余运算2.代码外提3.强度削弱4.变换循环控制条件5.合并已知量与复写传播6.删除无用赋值 例3: 试对以下基本块B2: B: =3 D : =A+C E: =A*C F : =D+E G: =B*F H : =A+C I: =A*C J : =H+I K: =B*5 L : =K+J M: =L 应用DAG对它们进行优化,并就以下两种情况分别写出优化后的四元式序列: (1)假设只有G、L、M在基本块后面还要被引用。 (2)假设只有L在基本块后面还要被引用。 解: 基本块对应的 DAG如下: B: =3 D : =A+C E: =A*C F : =D+E G: =B*F H : =A+C I: =A*C J : =H+I K: =B*5 L : =K+J M: =L 例1一个编译程序的代码生成要着重考虑 哪 些问题? 解: 代码生成器的设计要着重考虑目标代码的质量问题,而衡量目标代码的质量主要从占 用空间和执行效率两个方面综合考虑。 课后习题答案: P36-6 (1) L(G1)是0~9组成的数字串 (2)最左推导: 欢迎下载9 精品文库 N ND NDD NDDD DDDD0DDD 01DD 012D0127 N ND DD 3D 34 N ND NDD DDD 5DD 56D 568 最右推导: N ND N7 ND7 N27 ND27 N127 D127 0127 N ND N4 D4 34 N ND N8 ND8 N68 D68 568 P36-8 文法: ET|ET|ET TF|T*F|T/FF(E)|i 最左推导: E ET TT FTiT iT*F iF*F ii*F ii*i E T T*F F*F i*F i*(E) i*(ET) i*(TT)i*(FT) i*(i T) i*(i F) i*(i i) 最右推导: E ET ET*F ET*i E F*i Ei*i Ti*i Fi*i ii*i E T F*T F*F F*(E) F*(ET) F*(EF) F*(Ei) F*(T i) F*(F i) F*(i i) i*(i i) 语法树: /******************************** E E E E + T E + T E - T E + T F T T * F E
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 题库