视频加载失败

课程

2881 字
约 9 分钟

学堂在线测试 —— 编译原理

编译原理exercises/xuetangx_2026·更新于 2026-09-15

学堂在线测试 —— 编译原理

语义分析和中间代码产生 习题


一、 单项选择题(本题共 11 小题,每小题 1 分,共 11 分)

1. 中间代码生成所依据的是语言的 ( C )。

  • A. 词法规则
  • B. 语法规则
  • C. 语义规则
  • D. 产生规则

【解析】 中间代码生成阶段的任务是根据语义规则,将语法分析产生的语法树(或其他中间表示)转换为中间代码。词法规则用于词法分析,语法规则用于语法分析,而中间代码生成依据的是语义规则。

2. 下面哪些属于程序语言的语义定义?( C )

  • A. 表达式中圆括号必须匹配
  • B. 类的声明必须以 class 开头
  • C. 关于函数调用时参数传递方法的描述
  • D. 函数体必须用 return 语句结尾

【解析】 选项 A(圆括号匹配)和 B(以 class 开头)属于语法规则的范畴,描述的是程序的结构形式。选项 D(return 结尾)也偏向语法约束。而选项 C 关于函数调用时参数传递方法的描述,涉及的是程序运行时的含义和行为,属于语义定义。

3. (a+b)/(c-d) 对应的逆波兰式(后缀式)是 ( B )。

  • A. abcd-/+
  • B. ab+cd-/
  • C. abcd+/-
  • D. ab+cd/-

【解析】 后缀式的转换规则:操作符紧跟在其操作数之后。(a+b) 转为 ab+(c-d) 转为 cd-,两者做除法得到 ab+cd-/

4. 下列 中间代码形式有益于优化处理。( A )

  • A. 四元式、间接三元式
  • B. 三元式、间接三元式
  • C. 二元式、间接三元式
  • D. 四元式、三元式

【解析】 四元式由于使用了临时变量,各四元式之间没有直接的引用关系,便于调整顺序进行优化。间接三元式通过间接码表间接引用三元式,调整优化时只需修改间接码表而不影响三元式本身。三元式之间存在直接引用关系,调整顺序会导致引用失效,不利于优化。

5. 目标代码的高效性体现在 ( D )

  • A. 运行时间较短
  • B. 占用存储空间较小
  • C. 运行时间短但占用内存空间大
  • D. 运行时间短且占用存储空间小

【解析】 目标代码的高效性需要同时兼顾时间和空间两个维度,即运行时间短且占用存储空间小。只满足其中一个方面不能称为全面的高效。

6. 经过编译以后得到的目标代码是 ( D )

  • A. 四元式序列
  • B. 间接三元式序列
  • C. 三元式序列
  • D. 机器语言程序或者汇编语言程序

【解析】 四元式、三元式、间接三元式都是中间代码的表示形式,不是最终的目标代码。编译的最终目标代码是机器语言程序或汇编语言程序(也包括可重定位的机器代码)。

7. 中间代码生成时所遵循的是 ( C )

  • A. 语法规则
  • B. 词法规则
  • C. 语义规则
  • D. 等价变换规则

【解析】 中间代码生成是在语法分析的基础上,根据语义规则将源程序翻译为中间代码表示。等价变换规则是代码优化阶段所遵循的。

8. 中间代码的表示形式不包括 ( D )

  • A. 三元式
  • B. 四元式
  • C. 抽象语法树
  • D. 正规式

【解析】 常见的中间代码形式包括:后缀式(逆波兰式)、三元式、四元式、间接三元式、抽象语法树、三地址代码等。正规式(正则表达式)是用于描述词法规则(正规集)的工具,不是中间代码的表示形式。

9. 下列哪种不是常见的目标代码形式 ( C )

  • A. 汇编语言代码
  • B. 机器语言代码
  • C. 四元式
  • D. 可重定位二进制代码

【解析】 常见的目标代码形式有三种:汇编指令代码、绝对指令代码(机器语言代码)、可重定位指令代码(可重定位二进制代码)。四元式是中间代码的表示形式,而非目标代码。

10. 以下不属于中间代码形式的是 ( B )。

  • A. 后缀式
  • B. DFA
  • C. 三地址代码
  • D. 抽象语法树

【解析】 后缀式、三地址代码(四元式、三元式等)、抽象语法树都是常见的中间代码形式。DFA(确定有限自动机)是词法分析阶段用于识别单词的工具,不属于中间代码形式。

11. 下列各项不可能是目标代码的是 ( D )

  • A. 汇编指令代码
  • B. 可重定位指令代码
  • C. 绝对指令代码
  • D. 三地址代码

【解析】 目标代码的三种常见形式为:汇编指令代码、可重定位指令代码、绝对指令代码。三地址代码(如四元式)属于中间代码形式,不是目标代码。


二、 填空题(本题共 2 小题,每小题 1 分,共 2 分)

1. 语义分析和中间代码生成阶段,用 ______ 属性文法(语法制导定义) 描述语义规则。

2. 表达式 (a+b)c(a+b)*c 的后缀式形式是 ______ ab+cab+c*


三、 主观题(本题共 1 小题,每小题 10 分,共 10 分)

1. 把程序段:

while a < b do
    if c < d then
        x := y + z;

翻译成四元式代码,假设语句标号从 100 开始。

【参考答案】

根据 while-doif-then 的翻译模式,生成的四元式如下:

序号四元式说明
(100)(j<, a, b, 102)a<ba < b 则跳转到 (102)
(101)(j, -, -, 107)否则跳转到出口 (107),即 while 循环结束
(102)(j<, c, d, 104)c<dc < d 则跳转到 (104)
(103)(j, -, -, 100)否则跳转回 while 循环开始 (100)
(104)(+, y, z, t1)t1=y+zt_1 = y + z
(105)(:=, t1, -, x)x=t1x = t_1
(106)(j, -, -, 100)无条件跳转回 while 循环开始 (100)

执行流程分析:

  • (100)-(101)while 条件判断,若 a<ba < b 成立则进入循环体 (102),否则跳出循环到 (107)
  • (102)-(103)if 条件判断,若 c<dc < d 成立则执行赋值语句 (104),否则跳回 while 循环起始 (100)
  • (104)-(105):执行 x := y + z 赋值操作
  • (106):赋值完成后无条件跳回 while 循环起始 (100),继续下一轮迭代
Profile Image of the Author
Sonder
好想要技术
这是公告标题
这只是一个公告
分类
标签
站点信息
构建平台
GitHub Actions
博客版本
Firefly v6.16.7
文章许可
CC BY-NC-SA 4.0
文章目录