编译原理期末考试试卷#
满分:100分
一、 单项选择题(本题共10小题,每小题2分,共20分)#
1. 编译程序绝大多数时间花在 ______ 上。
A. 出错处理
B. 词法分析
C. 目标代码生成
D. 表格管理
2. 用高级语言编写的程序经编译后产生的程序叫 ______。
A. 解释程序
B. 目标程序
C. 源程序
D. 连接程序
3. 词法分析的任务是( )。
A. 识别单词
B. 分析句子的含义
C. 识别句子
D. 生成目标代码
4. 若文法 G 是无二义的,则它的任何句子 α ( )。
A. 最左推导和最右推导对应的语法树必定相同
B. 最左推导和最右推导对应的语法树可能不同
C. 最左推导和最右推导必定相同
D. 可能存在两个不同的最左推导,但它们对应的语法树相同
5. 在规范归约中,用( )来刻画可归约串。
A. 直接短语
B. 句柄
C. 最左素短语
D. 素短语
6. 乔姆斯基 (Chomsky) 把文法分为四种类型,即0型、1型、2型、3型,其中3型文法是( )。
A. 非限制文法
B. 正则文法
C. 上下文有关文法
D. 上下文无关文法
7. 以下不属于中间代码形式的是 ______。
A. 后缀式
B. DFA
C. 三地址代码
D. 抽象语法树
8. 代码优化的目的是( )。
A. 节省时间
B. 节省空间
C. 节省时间和空间
D. 把编译程序进行等价交换
9. LR分析器的核心部分是一张分析表,该表由( )组成。
A. ACTION表
B. GOTO表
C. 预测分析表
D. ACTION表和GOTO表
10. 词法分析器的输出结果是( )。
A. 单词自身值
B. 单词在符号表中的位置
C. 单词的种别编码
D. 单词的种别编码和自身值
二、 填空题(本题共5小题,每小题2分,共10分)#
1. 编译过程通常可分为5个阶段:词法分析阶段、语法分析阶段、语义分析和中间代码生成阶段、______ 和 ______。
2. 解释程序和编译程序的区别在于 。
3. 语法分析最常用的两类方法是 ______ 和 ______ 分析法。
4. 属性通常分为两类: 和 ______。
5. 规范归约中的可归约串是 ______,算符优先分析中的可归约串是 ______。
三、 求解题(本题共3小题,每小题10分,共30分)#
1. 消除左递归和提取公共左因子。
将文法 G[S] 改写为等价的 G′[S],使 G′[S] 不含左递归和左公共因子:
S→SAe∣Ae
A→dAbA∣dA∣d
2. 写出表达式的逆波兰表示及三元式序列。
表达式:(a+b∗c)/(a+b)−d
3. 求短语、直接短语、句柄和最左素短语。
对于文法 G[E]:
E→E+T∣T
T→T∗F∣F
F→(E)∣i
写出句型 (E+F)∗i 的所有短语、直接(简单)短语、句柄和最左素短语。
四、 综合题(本题共4小题,每小题10分,共40分)#
1. 判断 LL(1) 文法并构造分析表。
已知文法:
S→aD
D→STe∣ε
T→bH∣H
H→d∣ε
请计算各非终结符的 FIRST 集和 FOLLOW 集,判断其是否为 LL(1) 文法,并构造相应的 LL(1) 预测分析表。
2. 证明 SLR(1) 文法并构造分析表。
某语言的拓广文法 G′ 为:
(0) S′→S
(1) S→Db∣B
(2) D→d∣ε
(3) B→Ba∣ε
证明 G 不是 LR(0) 文法而是 SLR(1) 文法,并给出 SLR(1) 分析表。
3. 中间代码生成。
将下面的控制语句翻译成四元式序列(假设语句标号从 100 开始):
while (a < b) if (c > d) x = y + z
4. 语法制导翻译。
有定义二进制整数的文法如下:
L→LB∣B
B→0∣1
请构造一个翻译模式,计算该二进制数的值(即将其转换为十进制的值)。
参考答案及解析#
一、 单项选择题(每小题2分,共20分)#
- D。编译程序绝大多数时间花在表格管理上。
- B。用高级语言编写的程序经编译后产生的程序叫目标程序。
- A。词法分析的任务是识别单词。
- A。如果文法 G 是无二义的,则它的任何句子最左推导和最右推导对应的语法树必定相同。
- B。在规范归约中,用句柄来刻画可归约串。
- B。乔姆斯基把文法分为四种类型,其中3型文法是正则文法。
- B。DFA属于词法分析的识别工具,不属于中间代码形式(中间代码包含后缀式、三地址代码、语法树等)。
- C。代码优化的目的是节省时间和空间,生成更高效的目标代码。
- D。LR分析器的核心部分是一张分析表,该表由ACTION表和GOTO表(即动作表和状态转换表)组成。
- D。词法分析器的输出结果是单词的种别编码和自身值(属性值)。
二、 填空题(每小题2分,共10分)#
- 优化阶段、目标代码生成阶段
- 是否生成目标代码(或程序)
- 自上而下、自下而上
- 综合属性、继承属性
- 句柄、最左素短语
三、 求解题(每小题10分,共30分)#
1. 解:
文法 G[S] 改写为等价的不含左递归和左公共因子的 G′[S] 如下:
S→AeS′
S′→AeS′∣ε
A→dA′
A′→AB∣ε
B→bA∣ε
2. 解:
(1)逆波兰表示:abc∗+ab+/d−
(2)三元式序列:
① (∗,b,c)
② (+,a,①)
③ (+,a,b)
④ (/,②,③)
⑤ (−,④,d)
3. 解:
通过对句型 (E+F)∗i 画出语法树进行分析可知:
- 短语:(E+F)∗i , (E+F) , E+F , F , i
- 简单(直接)短语:F , i
- 句柄:F
- 最左素短语:E+F
四、 综合题(每小题10分,共40分)#
1. 解:
首先计算文法的 FIRST 集和 FOLLOW 集如下表:
| 非终结符 | FIRST 集 | FOLLOW 集 |
|---|
| S | {a} | {#,b,d,e} |
| D | {a,ε} | {#,b,d,e} |
| T | {b,d,ε} | {e} |
| H | {d,ε} | {e} |
由于:
predict(D→STe)∩predict(D→ε)={a}∩{#,b,d,e}=∅
predict(T→bH)∩predict(T→H)={b}∩{e}=∅
predict(H→d)∩predict(H→ε)={d}∩{e}=∅
验证 LL(1) 条件均满足,所以该文法是 LL(1) 文法。
构造的 LL(1) 分析表如下表:
| a | b | d | e | # |
|---|
| S | →aD | | | | |
| D | →STe | →ε | →ε | →ε | →ε |
| T | | →bH | →H | | |
| H | | | →d | →ε | |
2. 解:
**证明:**在项目集 I0 中,存在移进项目 D→⋅d,以及归约项目 D→⋅ 和 B→⋅。由于同一状态中存在移进-归约和归约-归约冲突,所以 G 不是 LR(0) 文法。
由产生式可知:
FOLLOW(S)={#}
FOLLOW(D)={b}
FOLLOW(B)={a,#}
在 I0 状态下面临的冲突可通过 FOLLOW 集解决:
FOLLOW(D)∩{d}={b}∩{d}=∅
FOLLOW(B)∩{d}={a,#}∩{d}=∅
FOLLOW(D)∩FOLLOW(B)={b}∩{a,#}=∅
在 I3 状态中:
FOLLOW(S)∩{a}={#}∩{a}=∅
因为冲突均可以由 FOLLOW 集解决,所以 G 是 SLR(1) 文法。
SLR(1) 分析表如下(假设产生式分别为:(1)S→Db, (2)S→B, (3)D→d, (4)D→ε, (5)B→Ba, (6)B→ε):
| 状态 | a | b | d | # | S | D | B |
|---|
| 0 | r6 | r4 | S4 | r6 | 1 | 2 | 3 |
| 1 | | | | acc | | | |
| 2 | | S5 | | | | | |
| 3 | r2 | | S6 | | | | |
| 4 | | r3 | | | | | |
| 5 | r1 | | | | | | |
| 6 | r5 | | | r5 | | | |
(注:不同产生式标号产生的表项 rx 具体数字可能略有不同,按等价逻辑给分)
3. 解:
将控制结构翻译成四元式序列如下:
| 序号 | 四元式 |
|---|
| 100 | (j<,a,b,102) |
| 101 | (j,_,_,107) |
| 102 | (j>,c,d,104) |
| 103 | (j,_,_,106) |
| 104 | (+,y,z,t) |
| 105 | (=,t,_,x) |
| 106 | (j,_,_,100) |
| 107 | |
4. 解:
引入 L、B 的综合属性 val,可以得到如下语法制导翻译模式:
S→L {print(L.val)}
L→L1B {L.val=L1.val×2+B.val}
L→B {L.val=B.val}
B→0 {B.val=0}
B→1 {B.val=1}