(完整版)编译技术复习题答案

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第一章:编译系统概述
一.单选题
1.编译程序前三个阶段完成的工作是( C )。

A.词法分析、语法分析和代码优化
B.代码生成、代码优化和词法分析
C.词法分析、语法分析、语义分析和中间代码生成
D.词法分析、语法分析和代码优化
2.编译程序绝大多数时间花在(D )上。

A.出错处理B.词法分析C.目标代码生成D.表格管理
3.编译程序是对(C )。

A.汇编程序的翻译B.高级语言程序的解释执行
C.高级语言的翻译D.机器语言的执行
4.在使用高级语言编程时,首先可通过编译程序发现源程序的全部( A )错误。

A.语法B.语义C.语用D.运行
二.填空题
1.编译程序首先要识别出源程序中每个( 单词),然后再分析每个( 句子)并翻译其意义。

2.通常把编译过程分为分析前端与后端两大阶段。

词法、语法和语义分析是对源程序的( 分析),中间代码生成、代码优化与目标代码的生成则是对源程序的(综合)。

3.对编译程序而言,输入数据是( 源程序),输出结果是( 目标程序)。

4.对下列错误信息,请指出可能是编译的哪个阶段(词法分析、语法分析、语义分析、
代码生成)报告的。

(1)else 没有匹配的if (语法分析)
(2)数组下标越界(语义分析)
(3)使用的函数没有定义(语法分析)
(4)在数中出现非数字字符(词法分析)
5.如果编译程序生成的目标程序是机器代码程序,则源程序的执行分为两大阶段:(编译阶段)和(运行阶段)。

如果编译程序生成的目标程序是汇编语言程序,则源程序的执行方式分成三个阶段:(编译阶段)(汇编阶段)和(运行阶段)。

6.编译程序在其工作过程使用最多的数据结构是(表),它记录着源程序中各种信息,以便查询或修改,在这些(表)中,尤以(符号表)最重要,它的生存期最长,使用也最频繁。

三.简述题:
1.编译程序的工作分为那几个阶段?
答:词法分析、语法分析和语义分析是对源程序进行的分析(称为编译程序的前端),
而中间代码生成、代码优化和代码生成三个阶段合称为对源程序进行综合(称为编译程序的后端),它们从源程序的中间表示建立起和源程序等价的目标程序。

第二章词法分析
一.单选题:
1.语言是(A )。

A.句子的集合B.产生式的集合C.符号串的集合D.句型的集合
2.扫描器所完成的任务是从字符串形式的源程序中识别出一个个具有独立含义的最小语法单位即(B )。

A.字符B.单词C.句子D.句型
3.词法分析的任务是(A )。

A.识别单词B.分析句子的含义C.识别句子D.生成目标代码4.DFA(如图所示)接受的字集为(D )。

A.以0 开头的二进制数组成的集合B.以0 结尾的二进制组成的集合
C.含奇数个0 的二进制组成的集合D.含偶数个0 的二进制组成的集合
5.词法分析器的输出结果是(C )。

A.单词的种别编码B.单词在符号表中的位置
C.单词的种别编码和自身的值D.单词自身值
二.填空题:
1.描述程序设计语言的词法的机制是(正则表达式),识别机制是(有穷状态自动机)。

2.最小状态DFA 的含义是(没有多余状态,没有两个状态等价)。

3.确定有限自动机DFA 是(NFA )的一个特例。

4.确定的有穷自动机是一个(五元组),通常表示为(DFA = ( S,∑,f , s0Z ))。

三、简述题:
1.词法分析
答:词法分析的主要任务是从左向右扫描每行源程序的符号,按照词法规则从构成源程序的字符串中识别出一个个具有独立意义的最小语法单位,并转换成统一的内部表示(token),送给语法分析程序。

四.综合应用题:
1.设有非确定的有自限动机NFA M=({A,B,C},{0,1},δ,{A},{C}),其中:δ (A,0)={C} δ (A,1)={A,B} δ (B,1)={C} δ (C,1)={C}。

请画出状态转换距阵和状态转换图。

解:
状态转换距阵为:
a
3 b
a 1
b
a
X Y
a b
2
b
A C A ,
B B ∅
C C

C
状态转换图为:
1
1
2. 有一台自动售货机,接收 1 分和 2 分硬币,出售 3 分钱一块的硬糖。

顾客每次向机器中
投放 ≥3 分的硬币,便可得到一块糖(注意;只给一块并且不找钱)。

(1) 写出售货机售糖的正则表达式; (2) 构造识别上述正则式的最简 DFA 。

解:(1)设 a = 1, b = 2,,则售货机售糖的正则表达式为:a (b | a (a | b)) | b (a | b) 。

(2)画出与正则表达式 a (b | a (a | b)) | b (a | b)对应的 NFA ,如图所示:
3. 设∑={0,1}上的正规集 S 由倒数第二个字符为 1 的所有字符串组成,请给出该字集对应的正规式,并构造一个识别该正规集的 DFA 。

解:构造相应的正规式:(0|1)*1(0|1) NFA:
1 1
确定化:(3 分)
I I 0
I 1
{0,1,2}
{1,2}
{1,2,3}
ε ε 0
ε 1
ε
1
2 3
4
1
A
B
1
C
1 0
1
0 1
1 0 0 2
0 3
4
1 a
a
1
2 3 b
4
5
6
ε
ε
a
ε ε b
b
{1,2} {1,2} {1,2,3} {1,2,3} {1,2,4} {1,2,3,4} {1,2,4} {1,2} {1,2,3} {1,2,3,4}
{1,2,4}
{1,2,3,4}
1
1
4. 构造一个 DFA ,使其接受∑ = {0, 1}上 0 和 1 的个数都是偶数的字符串。

解:
5. 构造一个字母表{0,1}上的 DFA ,其接受的串中所含 0 的数目能被 3 除尽。

解:
6.写出在∑ = {a , b}上不是 a 开头的,以 aa 结尾的的字符串集合的正规表达式,并直接构造与之等价的状态最少的 DFA 。

解:
7. 写一个文法使其语言为 L(G)={a n b n c m | m ,n ≥ 1,n 为奇数,m 为偶数}。

解: 文法 G(S):
S → AC
A → aaAbb | ab C → ccCcc | cc
8. 构造一个 DFA ,它接受∑={a ,b}上所有包含 ab 的字符串。

解:构造相应的正规式:(a|b)*ab(a|b)*
I I 0 I 1 {0,1,2} {1,2,3} {1,2} {1,2,3} {1,2,3} {1,2,4,5,6}
{1,2}
{1,2,3}
{1,2}
a
1
b
3 {1,2,4,5,6} {1,2,3,5,6} {1,2,5,6} {1,2,3,5,6} {1,2,3,5,6} {1,2,4,5,6} {1,2,5,6}
{1,2,3,5,6}
{1,2,5,6}
最小化:{0,1,2} {3,4,5} {0, 2},1, {3,4,5}
b a a
第三章 程序设计语言的语法描述
一.单选题:
1. 如果文法 G 是无二义的,则它的任何句子 α ( A
)。

A .最左推导和最右推导对应的语法树必定相同
B .最左推导和最右推导对应的语法树可能不同
C .最左推导和最右推导必定相同
D .可能存在两个不同的最左推导,但它们对应的语法树相同
2. 正规式 M 1 和 M 2 等价是指( C
)。

A .M1 和 M2 的状态数相等
B .M1 和 M2 的有向边条数相等
C .M1 和 M2 所识别的语言集相等
D .M1 和 M2 状态数和有向边条数相等
3. 文法 G 所描述的语言是(
D )的集合。

A. 文法 G 的字符表 V 中所有符号组成的符号串。

B. 文法 G 的字符表 V 的闭包 V*中的所有符号串。

C .由文法的识别符号推出的所有符号串。

D .由文法的识别符号推出的所有
4. 已知语言 L = { a n bb n | n ≥ 1 } ,则下述文法,(
D )可以产生语言 L 。

A .Z →aZb|aAb|b
B .A →aAb
A →aAb | b
A →b
b b b
a
a
1
a 2
3
a 4
a 5
a b
b
b
C.Z →AbB D.Z →aAb
A →aA | a A →aAb | b
B →bB | b
5.正则表达式的运算符的优先顺序为( C )。

A.| > * >·B.* > | > ·C.* >·>|D.| >·>*
6.ab3的另一种表示方法是()。

A.abbb
B. ababab
C.abbaab
D.aaabbb
二.填空题:
1.如果一个文法存在某个句子对应两棵不同的语法树,则称这个文法是(二义性的)。

2.最右推导亦称为(规范推导),由此得到的句型称为(规范)句型。

3.对于文法 G,仅含终结符号的句型称为 ( 句子)。

4.2 型文法又称为(上下文无关)文法;3 型文法又称为(正则)文法。

5.一个文法 G 是一个四元式( V T,V N,S,P )组成的。

6.文法G 产生的(句子)的全体是该文法描述的语言。

7.L+ 可以写成(LL* )。

三.简述题
1.一个文法是由哪几部分组成的,各部分的功能是什么?
解:一个文法G 是一个四元式(V T, V N ,S, P)其中:
V T 是一个终结符的非空有限集合,终结符通常用小写字母表示;
V N 是一个非终结符的非空有限集合,非终结符通常用大写字母表示;
S 是一个特殊的非终结符(S∈V N),称为开始符号。

P 是一个产生式(规则)的有限集合,每个产生式的形式是A→α ,其中
A∈V N,α∈(V T∪V N)*。

第四章自上而下的语法分析
一.单选题:
1.文法G[S]: S →xSx|y所识别的语言是(C )。

A.xyx
B.(xyx)*
C.x n yx n (n ≥ 0)
D.x*yx*
2.编译过程中,语法分析器的任务是()。

A.分析单词是怎样构成的B.分析单词串是如何构成语句和说明的
C.分析语句和说明是如何构成程序的D.分析程序的结构
3.下列关于标识符和名字的叙述中,正确的为( C )。

A.标识符有一定的含义B.名字是一个没有意义的字符序列
C.名字有确切的属性D.都不对
二.填空题:
1.编译器常用的语法分析方法有( 自底向上)和( 自顶向下)两种。

2.在LL(1)文法,其中的第一个L 代表(从左向右扫描输入),第二个L 表示产生(最
左推导),1 代表在决定分析器的每步动作时(向前看一个输入符号)。

3.一个上下文无关文法所含四个组成部分是(非终结符有限集合、终结符有限集合、产生
式有限集合、开始符)。

4.一个文法G[Z],若存在推导序列Z →+…Z…,则称G[Z]是(递归)文法,这类文法所产生的句子有(无数)个。

5.描述语言L = { a m b n | n ≥ m≥1}的文法是:(Z → aAb、A →Ab | aAb |ε)。

三.简述题
1.简述自顶向下的语法分析方法。

答:所谓自顶向下的语法分析方法就是从文法的开始符开始,根据给定的输入串并按照文法的产生式一步一步的向下进行最左推导,试图推导出文法的,使之与给定的输入串。

四.综合应用题:
1.试验证如下文法 G[E] 是 LL(1)文法:
E→ [F] E′
E’ → E| ε
F→ aF’
F’ → aF’ | ε
其中 E,F,E’,F’为非终结符
解:各非终结符的 FIRST 集和 FOLLOW 集如下:
FIRST(E)= { [ } FOLLOW(E)= {#}
FIRST(E′)= { [ ,ε}FOLLOW(E′)= {#}
FIRST(F)= { a } FOLLOW(F)= { ] }
FIRST(F′)= { a ,ε}FOLLOW(F′)= { ] }
对于E’ → E |εFIRST(E) ∩ FOLLOW(E’)= φ
对于F’ → aF’|εFIRST(aF’)∩ FOLLOW(F’)= φ
所以, 文法G[E]是LL(1)文法。

2.设有文法 G[A]的产生式集为:
A→BaC|CbB
B→Ac|c
C→Bb|b
试消除 G[A]的左递归。

解:不妨以 A、B、C 排序.先将 A 代入 B 中,然后消除 B 中左递归;再将 A、B 代入C 中。

再消除 C 中左递归。

最后结果为:G[A]:
A→BaC|CbB B→CbBcB'|cB'B'→aCcB'|ε
C→cB'bC'|bC'C'→bBcB'bC'|ε
3. 对文法 G[S]:S→a|∧|(T)
T→T,S|S
(1)给出(a,(a,a)的最左推导。

(2)对文法 G,进行改写,消除左递归。

(3)对修改后的文法求 First 和Follow 集。

(4)并给出它的预测分析表。

(5)给出输入串(a,a)#的分析过程,并说明该串是否为 G 的句子。

解:(1)对(a,(a,a)的最左推导为:
S=> (T) => (T,S)=> (S,S) => (a,S) => (a,(T)) => (a,(T,S)) => (a,(S,S))
=> (a,(a,S)) =>(a,(a,a))
(2) 改写文法为:
S→a
S→∧
S→( T )
T→S N
N→, S N
N→ε
(3)
(4) 预测分析表:
(5)对于输入串(a,a)#的分析过程为:
可见输入串(a,a)#是文法的句子。

4.对文法 G(S):
S →S∨aT |aT|∨aT
T →∧aT|∧a
(1)消除该文法的左递归和提取左公因子;
(2)构造各非终结符的 FIRST 和FOLLOW 集合;
(3)构造该文法的 LL(1)分析表,并判断该文法是否是 LL(1)的。

解:(1)消除左递归: S →aTS’|∨aTS’
S’→∨aTS’|ε
T →∧aT|∧a
提取左公因子:
S→aTS’|∨aTS’
S’→∨aTS’|ε
T→∧aT’
T’→T|ε
(2) FIRST(S)={a,∨} FOLLOW(S)={#}
FIRST(S')={∨,ε}FOLLOW(S')={#}
FIRST(T)={∧} FOLLOW(T)={∨,#}
FIRST(T')={∧,ε}FOLLOW(T')={∨,#}
(3)LL(1)分析表如下,该文法是 LL(1)文法。

5.考虑文法 G:
S →a | ^ | ( T )
T →T, S | S
(1)消除文法 G 的左递归。

(2)用类 C++语言写出递归下降分析程序。

假设由单词种别构成的源文件存放于文件 Lex.txt 中,如文件内容。

6.考虑下列文法 G(j 相当与 endif):
S →fCtSj | fCtSes | a
C →i
(1)提取文法的左因子。

(2)构造预测分析表。

(3)判断经改写的文法是否是 LL(1)文法。

解:(1)S →fCtSS’| a
S’→eS | j
C →i
(2) char t;
ifstrem cinf("lex.txt"); void main()
{
cinf >> t;
S();
}
void S()
{
if (t == 'a')
cinf >> t;
else
{
if (t == 'f')
cinf >> t;
C();
if (t == 't')
cinf >> t;
S();
S'();
}
}
void S()
{
if (t == 'e')
{
cinf >> t;
S();
}
else
if (t == 'j')
cinf >> t;
}
void C()
{
if (t == 'i')
cinf >> t;
}
(3)first(S) = {f,a}
first(S') = {e, j}
表不含多重定义,因此该文法是 LL(1)文法。

第五章自下而上的语法分析
一.单选题:
1.一个句型中称为句柄的是该句型的最左(D )
A.非终结符号B.短语C.句子D.直接短语
2.若a 为终结符,则A→α.aβ为(B )项目。

A.归约B.移进C.接受D.待约
3.在规范归约中,用(B )来刻画可归约串。

A.直接短语B.句柄C.最左短语D.短语
4.若项目集I k 含有A→α.,则在状态K 时,仅当面临的输入符号a∈Follow(A)时,才采
用“A→α.”动作的一定是(D )。

A.LALR 文法B.LR(0)文法C.LR(1)文法D.SLR(1)文法5.在LR(0)的ACTION 子表中,如果某一行中存在标记“r j”的栏,则(A )。

A.该行必定填满r j B.该行未填满r j
C.其他行也有r j D.goto 子表中也有r j
二.填空题:
1.一个LR 分析器包括两部分:一个总控程序和(一张分析表)。

2.LR(0)分析法的名字中“L”表示(自左至右分析),“R”表示(采用最右推导的逆过程即最左归约),“0”表示(向右查看0 个字符)。

3.如果文法G 的开始符是S,那么G 的拓广文法G’是在G 的基础上增加一个新的开始符号( S’) 和产生式(S’→ S )。

4.由于存在(规约- 移进)冲突,使得文法不是LR(0),转换LR(0)为SLR(1)
文法,需要计算(非终结符的follow 集)。

三.简述题;
1.简述自下而上的分析方法。

答:所谓自下而上分析法就是从输入串开始,逐步进行“归约”,直至归约到文法的
开始符号;或者说从语法树的末端开始,步步向上“归约”,直到根节点。

四.综合应用题:
1.对于文法G[S]:S→AB,A→Aa|bB,B→a|Sb 求句型baSb 的全部短语、直接短语和句
柄?
答.句型baSb 的语法树如图所示。

S
A B
b B S b
a
图五(2) 句型baSb 的的语法树
短语:baSb、ba、Sb、a
直接短语:Sb 、a
句柄:a
2.证明下述文法G:S→aSbS|aS|d 是二义性文法。

解:一个文法,如果存在某个句子有不只一棵语法分析树与之对应,那么称这个文法是二义性文法。

句子aadbd 有两棵语法树。

如下图:
S S
a S
a S
b S
a S a S
b S
d d d
(1) (2)
由此可知,S→aSbS|aS|d 定义的文法是二义性文法。

3.对于文法G(S):
S → bMb
M → (L | a
L → Ma)
(1)写出句型b(Ma)b 的最右推导并画出语法树。

(2)写出上述句型的短语,直接短语和句柄。

解:
S ⇒bMb ⇒b(Lb ⇒b(Ma)b S
(1)
(2)短语: Ma),(Ma),b(Ma)b b M b
(
直接短语: Ma)
句柄: Ma)
4.已知文法G:A→aAd | aAb | ε
判断该文法是否是SLR(1)文法,若是构造相应分析表,并对输入串ab#给出分析过程。

解::
文法:A→aAd | aAb | ε拓广文法为G′,增加产生式S′→A
若产生式排序为:
(0)S' →A
(1)A →aAd
(2)A →aAb
(3)A →ε
由产生式知:First (S' ) = {ε,a}
First (A ) = {ε,a}
Follow(S' ) = {#}
Follow(A ) = {d,b,#}
G′的LR(0)项目集族及识别活前缀的DFA 如下图所示:
在I0 中:A →.aAd 和A →.aAb 为移进项目,
A→.为归约项目,存在移进-归约冲突,因此所给文法不是LR(0)文法。

在I0、I2 中:
Follow(A) ∩{a}= {d,b,#} ∩{a}= ∅
所以在I0、I2 中的移进-归约冲突,可以由Follow 集解决,所以G 是SLR(1)文法。

state
Action Goto a d b#A
0S2R3R3R31 1acc
2S2R3R3R33 3S4S5
4R1E1R1
5R2R2R2
对于输入ab#分析过程如下;
5.若有定义二进制数的文法如下:
S→L·L|L
L→LB|B
B→0|1
(1)试为该文法构造LR 分析表,并说明属哪类LR 分析表。

(2)给出输入串101.110 的分析过程。

解:文法:S→L.L|L
L→LB|B
B→0|1
拓广文法为G′,增加产生式S′→S
若产生式排序为:
(0)S' →S
(1)S →L.L
(2)S →L
(3)L →LB
(4)L →B
(5)B →0
(6)B →1
由产生式知:Follow(S' ) = {#}
Follow(S ) = {#}
Follow(L ) = {.,0,1,#}
Follow(B ) = {.,0,1,#}
G′的LR(0)项目集族及识别活前缀的DFA 如下图所示:
在I2 中:
B→.0 和 B →.1 为移进项目,S →L.为归约项目,存在移进-归约冲突,因此所给文法不是LR(0)文法。

在I2、I8 中:
Follow(s) ∩{0,1}= { #} ∩{0,1}= ∅
所以在I2 、I8 中的移进-归约冲突可以由Follow 集解决,所以G 是SLR(1)文法。

构造的SLR(1)分析表如下:
分析成功,说明输入串101.110#是文法的句子。

第六章语法制导翻译与中间代码生成
一.单选题:
1.常用的中间代码形式不含(D )。

A.三元式B.四元式C.逆波兰式D.语法树
2.代码生成阶段的主要任务是(C )。

A.把高级语言翻译成汇编语言B.把高级语言翻译成机器语言
C.把中间代码变换成依赖具体机器的目标代码D.把汇编语言翻译成机器语言
3.四元式之间的联系是通过(B )实现的。

A.指示器B.临时变量C.符号表D.程序变量
4.有一语法制导翻译如下所示:
S →bAb {cout <<”1”}
A →(
B {cout <<“2”}
A →a {cout <<”3”}
B →Aa) {cout <<”4”}
若输入序列b(((aa)a)a)b,且采用自下而上的分析方法,则输出序列为(B )
A.32224441 B.34242421 C.12424243 D.34442212
二.填空题:
1.符号表中的信息栏中登记了每个名字的有关的性质,如(类型、种属、所占单元大小、地址)等等。

2.中间代码产生是依据语言的(语义)规则进行的。

3.从功能上说,程序语言的语句大体可分为(执行性)语句和(说明性)语句两大类。

4.
三.简述题:
1.何谓“语法制导翻译”?
解:语法制导翻译直观上说就是为每个产生式配上一个翻译子程序(称语义动作或语义子程序),并且在语法分析的同时执行这些子程序。

也即在语法分析过程中,当一个产生式获得匹配(对于自上而下分析)或用于归约(对于自下而上分析)时,此产生式相应的子
程序进入工作,完成既定的翻译任务。

四.综合应用题:
1.有文法:S →(L)| a
L → L,S | S
给此文法配上语义动作子程序(或者说为此文法写一个语法制导定义),它输出配对括号的个数,如对于句子(a,(a),输出是2。

解:拓展文法:加入新开始符S’和产生式S’→ S.语义动作子程序如下:产生式语义动作
S’→ S cout << S.num
S →(L)S.num = L.num + 1
S → a S.num = 0
L → L,S L.num = L.num + S.num
L → S L.num = S.num
2.在一个移入-归约的分析中采用以下的语法制导的翻译模式,在按一产生式归约时,立即执行括号中的动作。

A→aB { cout << “0”;}
A→c { cout <<“1”;}
B→Ab { cout << “2” ; }
当分析器的输入为 aacbb 时,打印的字符串是什么?画出语法树,给出分析过程。

解:分析器的分析过程如下图所示:
由于分析器采用移入-归约的方式进行分析,符号串 aacbb 的分析过程将如图中所标的归约顺序进行,而在按一产生式归约时,立即执行括号中的动作,所以分析器打印的字符为12020。

3.设源程序为:
begin
if a then b = 10 endif
while c > d do
begin
c = c - 1;
d = d + 1;
end
end
直接写出四元式序列。

解:(1) (jnz, &a, 0, 3)
(2) (jmp, 0, 0, 4)
(3) (= , &10, 0,&b)
(4) (j>, &c, &d, 6)
(5) (jmp, 0, 0, 11)
(6) (-, &c, &1, &T1)
(7) (=, &T1,0, &c)
(8) (+, &d, &1, &T2)
(9) (= , &T2, 0, &d)
(10) (jnp, 0, 0, 4)
(11) (halt, 0, 0, 0)书中习题:171 页。

相关文档
最新文档