编译原理基础:词法/语法/语义分析

共 38 题
#

1. 构造 LL(1) 分析表时 FIRST 集与 FOLLOW 集如何计算?两者交集非空意味着什么冲突?

A FIRST/FOLLOW 交集非空是正常的
B FIRST 与 FOLLOW 交集非空会导致分析表多重入口,即 LL(1) 冲突 ✓ 正确答案
C 冲突不需要处理
D LL(1) 冲突不影响解析
#

2. 语义分析如何用符号表检查类型匹配、作用域与未声明变量?它与语法分析的职责边界在哪?

A 语义分析不检查作用域
B 语法分析检查类型
C 语义分析用符号表检查类型、作用域与未声明变量,语法分析只验语法结构 ✓ 正确答案
D 两者职责相同
#

3. 词法分析为何通常用正则/有限自动机实现,而语法分析需要上下文无关文法?两者表达能力差异是什么?

A 正则能表达所有嵌套
B 词法分析用正则/DFA,语法分析用 CFG,因 CFG 能表达嵌套结构 ✓ 正确答案
C 词法分析需要 CFG
D 两者表达能力相同
#

4. 词法分析为何通常用 DFA 而非 NFA 直接驱动,最长匹配(maximal munch)规则解决了什么歧义?

A 最长匹配取最短 token
B NFA 直接驱动更高效
C DFA 无回溯、扫描高效,最长匹配规则消除 token 划分歧义 ✓ 正确答案
D DFA 需要回溯
#

5. 静态单赋值(SSA)形式为何要引入 φ 函数,支配边界(dominance frontier)如何决定 φ 的放置?

A φ 函数在控制流汇合点合并多分支值,由支配边界决定放置位置 ✓ 正确答案
B φ 函数用于函数调用
C 支配边界与 φ 无关
D SSA 不需要 φ
#

6. 中间代码为何要设计成与机器无关,它对可移植编译器与多目标优化有什么意义?

A 换目标需重写前端
B IR 与目标机强相关
C 机器无关 IR 解耦前后端,优化可多目标共享,提升可移植性 ✓ 正确答案
D IR 只用于单一语言
#

7. 短路求值(short-circuit)的布尔表达式如何翻译成条件跳转代码,与整体求值的代码有何不同?

A 短路求值用条件跳转按需求值,可提前终止 ✓ 正确答案
B 短路求值总是先求两端
C 短路求值不改变语义
D 整体求值可提前终止
#

8. LL(k) 与 LR(1) 分析器在分析方向(自顶向下 vs 自底向上)与识别能力上有何差异?为什么 LR 能处理更多文法?

A LR 自底向上、归约时决策,识别能力比 LL 强 ✓ 正确答案
B LL 识别能力更强
C LR 是自顶向下
D 两者识别能力相同
#

9. LR 分析中的移进-归约冲突与归约-归约冲突如何产生?SLR、LALR、规范 LR 在解决冲突能力上如何递进?

A 规范 LR(1) 用精确前瞻,LALR 合并同心项,冲突消解能力递增 ✓ 正确答案
B SLR 比规范 LR 更强
C 归约-归约冲突无法解决
D LALR 状态数最多
#

10. 递归下降为每个非终结符写一个函数,它相对表驱动解析在可读性与生成器维护上有何取舍?

A 递归下降不用消除左递归
B 表驱动可读性更强
C 递归下降直观可读,表驱动易维护、处理更广文法 ✓ 正确答案
D 两者都不可维护
#

11. 左递归为何会让自顶向下分析器陷入无限递归?如何改写文法消除左递归?

A 左递归只影响自底向上
B 左递归使自顶向下分析器无限递归,可改写为右递归消除 ✓ 正确答案
C 左递归无需处理
D 改写会改变语言
#

12. DFA 最小化中可区分状态对(table-filling)算法的原理是什么,等价状态如何合并?

A 接受态与普通态可合并
B 所有状态对都可合并
C 最小化不改变识别语言
D table-filling 算法标记可区分状态对,不可区分对合并得最小 DFA ✓ 正确答案
#

13. LR(0)、SLR、LALR(1)、规范 LR(1) 的识别能力如何排序,LALR 通过合并同心项压缩了哪类状态?

A 规范 LR 状态数最少
B LR(0) 能力最强
C LALR 状态数最多
D 识别能力 LR(0)<SLR≤LALR≤规范 LR(1),LALR 合并同心项压缩状态 ✓ 正确答案
#

14. 递归下降解析如何处理直接左递归,提取左公因子为何能消除回溯?

A 左递归可直接递归调用
B 提取左公因子会增加回溯
C 直接左递归改用迭代处理,提取左公因子可消除回溯 ✓ 正确答案
D 左公因子无需处理
#

15. 自顶向下分析的预测分析表与递归下降在实现上的取舍是什么,表驱动有何优势?

A 递归下降更容易维护
B 表驱动更可读
C 表驱动以统一驱动和自动生成换可维护性,递归下降以手写换可读性 ✓ 正确答案
D 两者都需回溯
#

16. SLR 用 FOLLOW 集解决 LR(0) 归约冲突为何有时仍不够,需升级到 LALR(1) 的典型例子是什么?

A 两者前瞻相同
B LALR 的 lookahead 更宽泛
C SLR 比 LALR 更精确
D SLR 用全局 FOLLOW 判断归约,可能过宽导致冲突,LALR(1) 用精确前瞻消解 ✓ 正确答案
#

17. 类型检查中类型相容、类型等价(按名/按结构)与隐式转换的规则差异会带来哪些语义陷阱?

A 类型相容即类型等价
B 按名等价与结构等价相同
C 隐式转换总是安全
D 按名等价与按结构等价各有误报/漏报,隐式转换可能损失精度 ✓ 正确答案
#

18. 数组元素访问 a[i][j] 的地址计算如何在中间代码中展开,行优先与列优先布局有何影响?

A 地址计算与布局无关
B 行优先与列优先布局相同
C 行优先按行连续存储,访问模式与布局匹配可提升缓存命中 ✓ 正确答案
D 列优先按行连续
#

19. Chomsky 文法分层(0/1/2/3 型)分别对应哪类自动机与语言,正则文法为何等价于有限自动机?

A 2 型上下文无关语言对应下推自动机,3 型正则语言对应有限自动机 ✓ 正确答案
B 0 型对应有限自动机
C 1 型对应下推自动机
D 正则文法对应下推自动机
#

20. NFA 与 DFA 在识别能力上为何等价,子集构造法(subset construction)的状态爆炸最坏复杂度是多少?

A 子集构造不需要 ε 闭包
B NFA 识别能力比 DFA 强
C DFA 状态数总是少于 NFA
D 子集构造法把 NFA 转为 DFA,最坏状态数 2^n ✓ 正确答案
#

21. 正则表达式、正则文法与有限自动机三者如何相互转换,Thompson 构造与子集构造各自解决哪一步?

A 子集构造把表达式转 NFA
B Thompson 构造把 NFA 转 DFA
C Thompson 构造把正则表达式转为 NFA,子集构造把 NFA 转为 DFA ✓ 正确答案
D 三者不能互转
#

22. 上下文无关文法的派生树与最左/最右推导有何关系,二义文法为何不存在唯一的最左推导?

A 二义文法总有唯一最左推导
B 二义文法使同一句子有多棵派生树,最左推导不唯一 ✓ 正确答案
C 派生树与推导无关
D 最左/最右推导总生成不同树
#

23. 泵引理(pumping lemma)如何用于证明某语言不是正则语言,它为何只能证伪不能证实?

A 泵引理可证明正则性
B 满足泵引理即正则
C 泵引理是正则语言的必要条件,违反它证明非正则,满足不能证明正则 ✓ 正确答案
D 泵引理与正则无关
#

24. ε-NFA 的 ε-闭包在构造中起什么作用,去除 ε 转移会改变识别的语言吗?

A 消除 ε 转移会改变语言
B ε-闭包计算 ε 可达状态集合,是子集构造的关键,消除 ε 转移不改变语言 ✓ 正确答案
C ε-闭包与子集构造无关
D ε 转移影响识别能力
#

25. 上下文有关语言与图灵机识别的递归可枚举语言在停机性上的根本区别是什么?

A 上下文有关语言可判定,递归可枚举语言半可判定(可能不停机) ✓ 正确答案
B 两者都可判定
C 递归可枚举语言可判定
D 上下文有关语言半可判定
#

26. 正则语言在并、连接、Kleene 星与补运算下的封闭性如何用于构造识别交集的自动机?

A 正则语言对并、交、补封闭,交集可用笛卡尔积构造自动机 ✓ 正确答案
B 正则语言对交不封闭
C 补运算无法构造
D 交集需用下推自动机
#

27. 正则表达式经 Thompson 构造转 NFA 再经子集构造转 DFA 的完整流程中,每一步的产物与开销是什么?

A DFA 状态数总是 O(n)
B NFA 状态数约 O(n),DFA 最坏 2^n,最小化压缩状态 ✓ 正确答案
C 子集构造是线性的
D 最小化会增加状态
#

28. LL(1) 文法的 FIRST 集与 FOLLOW 集如何计算,FIRST/FOLLOW 冲突为何导致 LL(1) 分析表多重入口?

A LL(1) 分析表总是唯一
B 交集非空不影响分析表
C 多重入口是正常的
D FIRST 与 FOLLOW 交集非空使同一分析表项被多个产生式填入,产生多重入口 ✓ 正确答案
#

29. 移进-归约冲突与归约-归约冲突分别在分析表的什么情形下出现,如何定位到具体的项目集?

A 冲突无法定位
B 两类冲突成因相同
C 冲突发生在不同状态
D 移进-归约冲突是同一状态对某前瞻可移进又可归约,归约-归约是两归约竞争 ✓ 正确答案
#

30. S-属性文法只用综合属性、L-属性文法限制继承属性依赖方向,这种限制为何便于边分析边计算语义?

A L-属性允许任意依赖方向
B S-属性只用综合属性,L-属性限制继承依赖方向,均便于边分析边计算 ✓ 正确答案
C S-属性使用继承属性
D 属性计算需多遍扫描
#

31. 二义性文法(悬空 else、运算符优先级)如何用优先级与结合性规则在解析器中消歧?

A 二义性无法用规则消歧
B 优先级与 else 无关
C 悬空 else 用最近匹配消歧,运算符用优先级与结合性声明消歧 ✓ 正确答案
D 必须改写文法才能消歧
#

32. 二义文法中的 dangling else 问题如何用优先级与结合性声明,或改写文法来消除?

A 可用优先级声明或改写文法使 else 与最近 if 配对,消除二义 ✓ 正确答案
B else 与最近 if 配对是错的
C dangling else 无法消除
D 改写文法会改变语言
#

33. 算符优先分析(precedence parsing)适合处理哪类表达式文法,它与 LR 分析在能力上有何差异?

A 算符优先分析能力比 LR 强
B 算符优先分析适合表达式文法、实现简单,能力弱于 LR ✓ 正确答案
C 算符优先处理任意文法
D 算符优先与 LR 能力相同
#

34. LR 分析中活前缀(viable prefix)与项目(item)的关系如何保证分析栈内容始终合法?

A 分析栈内容是活前缀,状态由项目集定义,保证下一步动作合法 ✓ 正确答案
B 栈内容可以是任意前缀
C 项目与活前缀无关
D 非法归约也合法
#

35. 语法制导翻译(SDT)中 S-属性文法与 L-属性文法的区别是什么,为何 L-属性适合自顶向下翻译?

A 两者属性类型相同
B S-属性使用继承属性
C L-属性适合自底向上
D L-属性限制继承属性从左到右继承,适合自顶向下翻译 ✓ 正确答案
#

36. 符号表的作用域链(scope chain)如何支持嵌套块与遮蔽(shadowing),进入/退出作用域如何维护?

A 作用域链只支持一层
B 内层不能遮蔽外层
C 退出作用域不清除符号
D 作用域链支持嵌套作用域,查找自顶向下,内层遮蔽外层 ✓ 正确答案
#

37. 三地址码(TAC)与四元式、三元式在表示临时变量与代码重排上的差异是什么?

A 三元式结果显式
B 四元式结果显式、便于重排,三元式结果靠序号、重排易错 ✓ 正确答案
C 四元式不便于优化
D 两者结果表示相同
#

38. 属性文法中综合属性与继承属性的求值顺序受什么约束,循环依赖为何导致翻译无法进行?

A 循环依赖可正常求值
B 求值顺序由依赖图拓扑序决定,循环依赖无拓扑序导致无法求值 ✓ 正确答案
C 求值顺序任意
D 依赖环不影响翻译