编译原理复习题#
一、单项选择题#
1. 构造编译程序应掌握 ( )。D
- A. 源程序
- B. 目标语言
- C. 编译方法
- D. 以上三项都是
2. 编译程序绝大多数时间花在 ( ) 上。D
- A. 出错处理
- B. 词法分析
- C. 目标代码生成
- D. 表格管理
3. DFA M(见图 1-1)接受的字集为 ( )。D
- A. 以 0 开头的二进制数组成的集合
- B. 以 0 结尾的二进制数组成的集合
- C. 含奇数个 0 的二进制数组成的集合
- D. 含偶数个 0 的二进制数组成的集合
4. −a−(b∗c/(c−d)+(−b)∗a) 的逆波兰表示是 ( )。(@代表后缀式中的求负运算符)C
- A. abc∗cd−b@a∗+/−
- B. a@bc∗cd−b@a∗+/−
- C. a@bc∗cd−/b@a∗+−
- D. a@bc∗/cd−b@a∗+−
5. 在规范归约中,用 ( ) 来刻画可归约串。B
- A. 直接短语
- B. 句柄
- C. 最左素短语
- D. 素短语
6. 若 B 为非终结符,则 A→α⋅Bβ 为 ( ) 项目。D
7. 中间代码生成时所依据的是 ( )。C
- A. 语法规则
- B. 词法规则
- C. 语义规则
- D. 等价变换规则
8. 有文法 G 及其语法制导翻译如下所示(语义规则中的 ∗ 和 + 分别是常规意义下的算术运算符):
EETT→E(1)∧T→T→T(1)#n→n{E.val=E(1).val×T.val}{E.val=T.val}{T.val=T(1).val+n.val}{T.val=n.val}
则分析句子 1 ∧ 2 ∧ 3 # 4 其值为 ( )。C
9. 如果文法 G 是无二义的,则它的任何句子 α ( )。A
- A. 最左推导和最右推导对应的语法树必定相同
- B. 最左推导和最右推导对应的语法树可能不同
- C. 最左推导和最右推导必定相同
- D. 可能存在两个不同的最左推导,但它们对应的语法树相同
10. 下列动作中,不是自下而上分析动作的是 ( )。B
11. 编译程序是对 ( )。D
- A. 汇编程序的翻译
- B. 高级语言程序的解释执行
- C. 机器语言的执行
- D. 高级语言的翻译
12. 词法分析器的输出结果是 ( )。C
- A. 单词的种别编码
- B. 单词在符号表中的位置
- C. 单词的种别编码和自身值
- D. 单词自身值
13. 正规式 M1 和 M2 等价是指 ( )。C
- A. M1 和 M2 的状态数相等
- B. M1 和 M2 的有向边条数相等
- C. M1 和 M2 所识别的语言集相等
- D. M1 和 M2 状态数和有向边条数相等
14. 在规范归约中,用 ( ) 来刻画可归约串。B
- A. 直接短语
- B. 句柄
- C. 最左素短语
- D. 素短语
15. 若 a 为终结符,则 A→α⋅aβ 为 ( ) 项目。B
16. 语法分析时所依据的是 ( )。A
- A. 语法规则
- B. 词法规则
- C. 语义规则
- D. 等价变换规则
17. 文法 G:S→xSx∣y 所识别的语言是 ( )。C
- A. xyx
- B. (xyx)∗
- C. xnyxn(n≥0)
- D. x∗yx∗
18. 如果文法 G 是无二义的,则它的任何句子 α ( )。A
- A. 最左推导和最右推导对应的语法树必定相同
- B. 最左推导和最右推导对应的语法树可能不同
- C. 最左推导和最右推导必定相同
- D. 可能存在两个不同的最左推导,但它们对应的语法树相同
19. 下列动作中,不是自上而下分析动作的是 ( )。C
20. 词法分析器的输出结果是 ( )。C
- A. 单词的种别编码
- B. 单词在符号表中的位置
- C. 单词的种别编码和自身值
- D. 单词自身值
21. −a−(b∗c/(c−d)+(−b)∗a) 的逆波兰表示是 ( )。(@代表后缀式中的求负运算符)C
- A. abc∗cd−b@a∗+/−
- B. a@bc∗cd−b@a∗+/−
- C. a@bc∗cd−/b@a∗+−
- D. a@bc∗/cd−b@a∗+−
22. 在规范归约中,用 ( ) 来刻画可归约串。B
- A. 直接短语
- B. 句柄
- C. 最左素短语
- D. 素短语
23. 若 B 为非终结符,则 A→α⋅ 为 ( ) 项目。A
24. 文法 G:S→xSx∣xS∣y 所识别的语言是 ( )。A
- A. xmyxn(m≥n≥0)
- B. (xyx)∗
- C. xnyxn(n≥0)
- D. x∗yx∗
25. 有文法 G 及其语法制导翻译如下所示(语义规则中的 ∗ 和 + 分别是常规意义下的算术运算符):
EETT→E(1)∧T→T→T(1)#n→n{E.val=E(1).val×T.val}{E.val=T.val}{T.val=T(1).val+n.val}{T.val=n.val}
则分析句子 2 ∧ 3 # 4 其值为 ( )。C
26. 间接三元式表示法的优点为 ( )。A
- A. 采用间接码表,便于优化处理
- B. 节省存储空间,不便于表的修改
- C. 便于优化处理,节省存储空间
- D. 节省存储空间,不便于优化处理
27. 下列动作中,不是自上而下分析动作的是 ( )。C
28. 同正规式 (a∣b)+ 等价的正规式是 ( )。B
- A. (a∣b)∗
- B. (a∣b)(a∣b)∗
- C. (ab)∗(ab)
- D. (a∣b)∣(a∣b)∗
29. 称有限自动机 A1 和 A2 等价是指 ( )。D
- A. A1 和 A2 都是定义在一个字母表上的有限自动机
- B. A1 和 A2 状态数和有向边数相等
- C. A1 和 A2 状态数或有向边数相等
- D. A1 和 A2 所能识别的字符串集合相等
30. 由文法的开始符号出发经过若干步(包括 0 步)推导产生的文法符号序列称为 ( )。B
31. 在自上而下的语法分析中,应从 ( ) 开始分析。C
- A. 句型
- B. 句子
- C. 文法开始符号
- D. 句柄
32. 一个文法 G,若 ( ),则称它是 LL(1) 文法。C
- A. G 中不含左递归
- B. G 无二义性
- C. G 的 LL(1) 分析表中不含多重定义的条目
- D. G 中产生式不含左公因子
33. 在规范归约中,用 ( ) 来刻画可归约串。B
- A. 直接短语
- B. 句柄
- C. 素短语
- D. 短语
34. 若 a 为终结符,则 A→α⋅aβ 为 ( ) 项目。B
35. 中间代码生成时所依据的是 ( )。C
- A. 词法规则
- B. 语法规则
- C. 语义规则
- D. 等价变换规则
36. 文法 G[S] 及其语法制导翻译定义如下:
| 产生式 | 语义动作 |
|---|
| S′→S | print(S.num) |
| S→(L) | S.num=L.num+1 |
| S→a | S.num=0 |
| L→L(1),S | L.num=L(1).num+S.num |
| L→S | L.num=S.num |
若输入为 (a,(a)),且采用自底向上的分析方法,则输出为 ( )。C
37. 四元式之间的联系是通过 ( ) 实现的。B
- A. 指示器
- B. 临时变量
- C. 符号表
- D. 程序变量
38. 将编译程序分成若干”遍”,是为了 ( )。B
- A. 提高程序的执行效率
- B. 使程序的结构更为清晰
- C. 利用有限的机器内存并提高机器的执行效率
- D. 利用有限的机器内存但降低了机器的执行效率
39. 一个编译程序在编译时,大多数时间花在 ( ) 上。D
- A. 出错处理
- B. 词法分析
- C. 目标代码生成
- D. 表格管理及处理
40. 下列符号串不可以由符号集 Σ={a,b} 上的正闭包运算产生的是 ( )。A
- A. ε
- B. a
- C. aa
- D. ab
41. 词法分析器的输出是 ( )。C
- A. 单词在符号表中的位置
- B. 单词的自身值
- C. 单词的自身值和单词的种类码
- D. 单词的种类码
42. 两个 DFA 等价是指 ( )。D
- A. 这两个 DFA 的状态数相同
- B. 这两个 DFA 的状态数和有向弧条数都相等
- C. 这两个 DFA 的有向弧条数相等
- D. 这两个 DFA 接受的语言相同
43. 生成中间代码时所依据的是 ( )。C
- A. 语法规则
- B. 词法规则
- C. 语义规则
- D. 等价变换规则
44. 表达式 (¬a∨b)∧(c∨d) 的逆波兰表示为 ( )。B
- A. ¬ab∨∧cd∨
- B. a¬b∨cd∨∧
- C. ab∨¬cd∨∧
- D. a¬b∨∧cd∨
45. 有文法 G 及其语法制导翻译如下所示(语义规则中的 ∗ 和 + 分别是常规意义下的算术运算符):
EETT→E(1)∧T→T→T(1)#n→n{E.val=E(1).val×T.val}{E.val=T.val}{T.val=T(1).val+n.val}{T.val=n.val}
则分析句子 2 ∧ 3 # 4 其值为 ( )。C
46. 表达式 a+b+c+d 的逆波兰表示为 ( )。B
- A. a+bc+d+
- B. ab+c+d+
- C. ab+cd++
- D. abc+d++
47. 文法 G[S] 及其语法制导翻译定义如下:
| 产生式 | 语义动作 |
|---|
| S′→S | print(S.num) |
| S→(L) | S.num=L.num+1 |
| S→a | S.num=0 |
| L→L(1),S | L.num=L(1).num+S.num |
| L→S | L.num=S.num |
若输入为 (a,(a)),且采用自底向上的分析方法,则输出为 ( )。C
48. 若 a 为终结符,则 A→α⋅aβ 为 ( )。B
- A. 归约项目
- B. 移进项目
- C. 待约项目
- D. 接受项目
49. 若 B 为非终结符,则 A→α⋅Bβ 为 ( )。C
- A. 归约项目
- B. 移进项目
- C. 待约项目
- D. 接受项目
50. 项目 A→α⋅ 为 ( )。A
- A. 归约项目
- B. 移进项目
- C. 待约项目
- D. 接受项目
51. 语法分析器的输入是 ( )。A
- A. Token 序列
- B. 源程序
- C. 目标程序
- D. 符号表
52. 在 LR(0) 的 Action 表中,如果某行中存在标记为 “rj” 的栏,则 ( )。A
- A. 该行必定填满 “rj”
- B. 该行未必填满 “rj”
- C. 其他行可能也有 “rj”
- D. goto 表中也可能有 “rj”
53. LR 分析过程中栈内存储的是 ( )。A
- A. 活前缀
- B. 前缀
- C. 归约活前缀
- D. 项目
54. 文法 G:S→xxS∣y 所识别的语言是 ( )。D
- A. xxy∗
- B. (xxy)∗
- C. xx∗yx
- D. (xx)∗y
55. 若状态 k 含有项目 "A→α⋅",对任意非终结符 a,都用规则 "A→α" 归约的语法分析方法是 ( )。B
- A. LALR 分析法
- B. LR(0) 分析法
- C. LR(1) 分析法
- D. SLR(1) 分析法
56. 在编译过程中,如果遇到错误应该 ( )。C
- A. 把错误理解成局部的错误
- B. 对错误在局部范围内进行纠正,继续向下分析
- C. 当发现错误时,跳过错误所在的语法单位继续分析下去
- D. 当发现错误时立即停止编译,待用户改正错误后再继续编译
57. 将编译程序分成若干”遍”,是为了 ( )。B
- A. 提高程序的执行效率
- B. 使程序的结构更为清晰
- C. 利用有限的机器内存并提高机器的执行效率
- D. 利用有限的机器内存但降低了机器的执行效率
58. 下列符号串不可以由符号集 Σ={a,b} 上的正闭包运算产生的是 ( )。A
- A. ε
- B. a
- C. aa
- D. ab
59. 表达式 (¬a∨b)∧(e∨f) 的逆波兰表示为 ( )。B
- A. ¬ab∨∧ef∨
- B. a¬b∨ef∨∧
- C. ab∨¬ef∨∧
- D. a¬b∨∧ef∨
60. 有文法 G 及其语法制导翻译如下所示(语义规则中的 ∗ 和 + 分别是常规意义下的算术运算符):
EETT→E(1)∧T→T→T(1)#n→n{E.val=E(1).val×T.val}{E.val=T.val}{T.val=T(1).val+n.val}{T.val=n.val}
则分析句子 3 ∧ 3 # 4 其值为 ( )。B
61. 表达式 a+b+c 的逆波兰表示为 ( )。B
- A. a+bc+
- B. ab+c+
- C. +abc+
- D. abc++
62. 文法 G[S] 及其语法制导翻译定义如下:
| 产生式 | 语义动作 |
|---|
| S′→S | print(S.num) |
| S→(L) | S.num=L.num+1 |
| S→a | S.num=0 |
| L→L(1),S | L.num=L(1).num+S.num |
| L→S | L.num=S.num |
若输入为 (a, a),且采用自底向上的分析方法,则输出为 ( )。B
63. 在 SLR(1) 的 Action 表中,如果某行中存在标记为 “rj” 的栏,则 ( )。B
- A. 该行必定填满 “rj”
- B. 该行未必填满 “rj”
- C. 其他行可能也有 “rj”
- D. goto 表中也可能有 “rj”
64. 一个 ( ) 指明了在 LR 分析过程中的某个时刻所能看到产生式多大一部分。D
- A. 活前缀
- B. 前缀
- C. 归约活前缀
- D. 项目
65. 文法 G:S→xS∣y 所识别的语言是 ( )。D
- A. xy∗
- B. (xy)∗
- C. xx∗yx
- D. x∗y
66. 若状态 k 含有项目 "A→α⋅",且仅当输入符号 a∈FOLLOW(A) 时,才用规则 "A→α" 归约的语法分析方法是 ( )。D
- A. LALR 分析法
- B. LR(0) 分析法
- C. LR(1) 分析法
- D. SLR(1) 分析法
67. 设有文法 G[T]:
TFP→T∗F∣F→F↑P∣P→(T)∣a
该文法句型 T∗P↑(T∗F) 的句柄是 ( )。C
- A. (T∗F)
- B. T∗F
- C. P
- D. P↑(T∗F)
68. LR 分析表中的转移表(goto)是以 ( ) 作为列标题的。B
- A. 终结符
- B. 非终结符
- C. 终结符或非终结符
- D. 表示状态的整型数
69. 编译程序的语法分析器必须输出的信息是 ( )。A
- A. 语法错误信息
- B. 语法规则信息
- C. 语法分析过程
- D. 语句序列
70. 下列项目中为可移进项目的是 ( )。C
- A. E′→E⋅
- B. L→⋅
- C. L→−⋅L
- D. F→L∗F⋅
71. 有一语法指导定义如下:
SAAB→bAb→(B→a→aA)print "1"print "2"print "3"print "4"
若输入序列为 b(a(a(aa)))b,且采用自底向上的分析方法,则输出序列为 ( )。B
- A. 32224441
- B. 34242421
- C. 12424243
- D. 34442212
72. 同正规式 (a∣b)∗ 等价的正规式为 ( )。D
- A. (a∣b)+
- B. a∗∣b∗
- C. (ab)∗
- D. (a∗∣b∗)+
73. 词法分析器的加工对象是 ( )。C
- A. 中间代码
- B. 单词
- C. 源程序
- D. 元程序
74. 在自下而上的语法分析中,应从 ( ) 开始分析。B
- A. 句型
- B. 句子
- C. 文法开始符号
- D. 句柄
75. 赋值语句 X:=−(a+b)/(c−d)−(a+b∗c) 的逆波兰表示是 ( )。C
- A. Xab+cd−/−bc∗a+−
- B. Xab+/cd−bc∗a+−−=
- C. Xab+−cd−/abc∗+−=
- D. Xab+cd−/abc∗+−−=
76. 设有文法 G[T]:
TFP→T∗F∣F→F↑P∣P→(T)∣a
该文法句型 T∗F↑(T∗F) 的句柄是 ( )。B
- A. (T∗F)
- B. T∗F
- C. P
- D. P↑(T∗F)
77. LR 分析表中的动作表(action)是以 ( ) 作为列标题的。D
- A. 终结符
- B. 非终结符
- C. 终结符或非终结符
- D. 终结符和结束符 $$$
78. 下列项目中为可归约项目的是 ( )。B
- A. E′→⋅E
- B. L→⋅
- C. L→−⋅L
- D. F→L∗⋅F
79. 有一语法指导定义如下,其中 + 表示符号连接运算:
SBBBB→B→a→b→Ba→Bbprint B.versB.vers=aB.vers=bB.vers=a+B.versB.vers=b+B.vers
若输入序列为 abab,且采用自底向上的分析方法,则输出序列为 ( )。D
- A. aabb
- B. abab
- C. bbaa
- D. baba
80. 同正规式 (a∣b)∗ 等价的正规式为 ( )。D
- A. (a∣b)+
- B. a∗∣b∗
- C. (ab)∗
- D. (a∗∣b∗)+
81. 词法分析器的加工对象是 ( )。C
- A. 中间代码
- B. 单词
- C. 源程序
- D. 元程序
82. 在自上而下的语法分析中,应从 ( ) 开始分析。C
- A. 句型
- B. 句子
- C. 文法开始符号
- D. 句柄
83. 赋值语句 X:=−(a+b)/(c−d)−(a+b∗c) 的逆波兰表示是 ( )。C
- A. Xab+cd−/−bc∗a+−
- B. Xab+/cd−bc∗a+−−=
- C. Xab+−cd−/abc∗+−=
- D. Xab+cd−/abc∗+−−=
84. 编译程序不能检查、处理的错误是程序中的 ( )。B
- A. 静态语义检查
- B. 动态语义检查
- C. 语法错误
- D. 词法错误
85. 在 LR(0) 的 ACTION 子表中,如果某一行中有标记为 “rj” 的栏,则 ( )。C
- A. 该行既有 rj 又有 Sj
- B. 其它行也有 rj
- C. 该行一定填满 rj
- D. 该行未填满 rj
86. 同正规式 (a∣b)+ 等价的正规式是 ( )。B
- A. (a∣b)∗
- B. (a∣b)(a∣b)∗
- C. (ab)∗(ab)
- D. (a∣b)∣(a∣b)∗
87. 在规范归约中,用 ( ) 来刻画可归约串。B
- A. 直接短语
- B. 句柄
- C. 素短语
- D. 短语
88. 若 a 为终结符,则 A→α⋅aβ 为 ( ) 项目。B
89. 一个文法 G,若 ( ),则称它是 LL(1) 文法。C
- A. G 中不含左递归
- B. G 无二义性
- C. G 的 LL(1) 分析表中不含多重定义的条目
- D. G 中产生式不含左公因子
90. LR 分析器的核心部分是一张分析表,该表由 ( ) 组成。D
- A. ACTION 表
- B. GOTO 表
- C. 预测分析表
- D. ACTION 表和 GOTO 表
91. 构造编译程序应该掌握 ( )。D
- A. 源程序
- B. 目标语言
- C. 编译方法
- D. 以上三项都是
92. 在递归子程序方法中,若文法存在左递归,则会使分析过程产生 ( )。D
- A. 回溯
- B. 非法调用
- C. 有限次调用
- D. 无限循环
93. 最左简单子树的叶结点,自左至右排列组成句型的 ( )。C
- A. 短语
- B. 句型
- C. 句柄
- D. 间接短语
94. 如果一个正规式所代表的集合是无穷的,则它必含有的运算是 ( )。C
- A. 连接运算 "⋅"
- B. 或运算 "∣"
- C. 闭包运算 "∗"
- D. 括号 ”(” 和 ”)”
95. 同正规式 a∗b∗ 等价的文法是 ( )。C
- A. G1:S→aS∣bS∣ε
- B. G2:S→aSb∣ε
- C. G3:S→aS∣Sb∣ε
- D. G4:S→abS∣ε
96. 由文法的开始符号出发经过若干步(包括 0 步)推导产生的文法符号序列称为 ( )。B
97. 四元式之间的联系是通过 ( ) 实现的。B
- A. 指示器
- B. 临时变量
- C. 符号表
- D. 程序变量
98. 编译程序的语法分析器必须输出的信息是 ( )。A
- A. 语法错误信息
- B. 语法规则信息
- C. 语法分析过程
- D. 语句序列
99. LL(1) 分析法中 “1” 的含义是在输入串中查看一个输入符号,其目的是 ( )。C
- A. 确定最左推导
- B. 确定句柄
- C. 确定使用哪一个产生式进行展开
- D. 确定是否推导
100. 称正规式 R1 和 R2 等价是指 ( )。C
- A. R1 和 R2 都是定义在同一个字母表上的正规式
- B. R1 和 R2 使用的运算符相同
- C. R1 和 R2 代表同一个正规集
- D. R1 和 R2 代表不同的正规集
二、填空题#
概述部分#
1. 编译程序的开发常常采用自编译、交叉编译、自展和移植等技术实现。
2. 解释程序和编译程序的区别在于是否生成目标程序。
3. 如果编译程序生成的目标程序是汇编语言程序,则源程序的执行分为 3 个阶段:编译阶段、汇编阶段和运行阶段。
4. 编译程序工作过程中,第一阶段输入是源程序,最后阶段的输出为目标程序。
5. 编译过程通常可分为 5 个阶段:词法分析阶段、语法分析阶段、语义分析和中间代码生成阶段、优化阶段和目标代码生成阶段。
6. 如果编译阶段生成的目标程序是某特定计算机系统的机器代码程序,则源程序的执行分为两大阶段:编译阶段和运行阶段。
7. 对编译程序而言,输入数据是源程序,输出结果是目标程序。
8. 贯穿于编译程序始终的工作有符号表处理和出错处理。
词法分析部分#
1. 词法分析的工作是将源程序中的字符串变换单词符号流的过程,所遵循的是语言的构词规则。
2. 若两个正规式所表示的正规集相同,则认为二者是等价的。
3. 若两个正规式所表示的正规集相同,则认为二者是等价的。
4. 正规式 R1 和 R2 等价是指表示相同的正规集。
5. 词法分析器的输入是源程序字符串,输出结构是二元式(单词种别,单词自身的值)。词法分析所遵循的是语言的构词规则。
6. 确定的有限自动机是一个五元组,包含的五个元分别是:状态集合、字母表、初态、终态集、状态转换函数集合。
7. 有限自动机是更一般化的状态转换图,它分为确定的有限自动机 DFA 和非确定的有限自动机 NFA 两种。
8. NFA 和 DFA 的区别主要有两点:其一是 NFA 可以有若干个初始状态,而 DFA 仅有一个初始状态;其二是 NFA 的状态转换函数 f 不是单值函数,而是一个多值函数。
语法分析部分#
1. 语法分析的方法通常分为两类:自上而下分析方法和自下而上分析方法。
2. 文法中的终结符集和非终结符集的交集是空集。
3. 一个句型的最左直接短语称为该句型的句柄。
4. 规范归约是最右推导的逆过程。
5. 自下而上语法分析中分析器的动作有移进、归约、接受、报错。
6. 自上而下语法分析中分析器的动作有匹配终结符、展开非终结符、分析成功、报错。
7. 常用的自上而下语法分析方法有递归下降子程序方法和预测分析表方法(LL(1) 方法)。
8. 常用的自下而上语法分析方法有算符优先分析法和 LR 分析法。
9. 一个 LL(1) 分析器由一张 LL(1) 分析表(预测分析表)、一个先进后出分析栈和一个控制程序(表驱动程序)组成。
10. 一个 LR 分析器由分析栈、分析表和总控程序三个部分组成。
11. LR(0) 分析法的名字中,“L” 表示自左至右分析输入串,“R” 表示采用最右推导的逆过程即最左归约,“0” 表示向右查看 0 个字符。
12. LL(1) 分析法中,第一个 L 的含义是从左到右扫描输入串;第二个 L 的含义是分析过程中采用最左推导;“1” 的含义是只需向右查看一个符号就可以决定如何推导。
13. LR(1) 文法的含义是:L 表明自左至右扫描输入串,R 表明采用最右推导的逆过程(最左归约)方法进行分析。
14. 一个上下文无关文法是 LL(1) 文法的充分必要条件是:对每一个非终结符 A 的任何两个不同产生式 A→α∣β,有下面的条件成立:(1)FIRST(α)∩FIRST(β)=∅;(2)假若 β⇒∗ε,则有 FIRST(α)∩FOLLOW(A)=∅。
15. 对于 LL(1) 文法中的任何产生式 A→α∣β,则需要满足 FIRST(α)∩FIRST(β)=∅,若 β⇒∗ε,则 FIRST(α)∩FOLLOW(A)=∅。
16. LR 分析器的核心部分是一张分析表,该表包括动作(ACTION)表和状态转换(GOTO)表等两个子表。
17. 关于非终结符 A 的直接左递归产生式:A→Aα∣β,其中 α、β 是任意的符号串且 β 不以 A 开头,则可以将 A 的产生式改写为右递归的形式为:A→βA′,A′→αA′∣ε。
18. 在消除回溯,提取公共左因子时,关于 A 的产生式 A→δβ1∣δβ2∣…∣δβi∣βi+1∣…∣βj,可以改写为:A→δA′∣βi+1∣…∣βj,A′→β1∣…∣βi。
19. 设 G[S] 是一文法,如果符号串 x 是从识别符号推导出来的,即有 S⇒∗x,则称 x 是文法 G[S] 的句型,若 x 仅由终结符号组成,则称 x 为文法 G[S] 的句子。
20. 已知文法 G[S]:S→eT∣RT,T→DR∣ε,R→dR∣ε,D→a∣bd。求 FIRST(S)={e,d,a,b,ε};FOLLOW(D)={d,#}。
语义处理部分#
1. 文法符号的属性有两种,一种称为继承属性,另一种称为综合属性。
2. 编译过程中,常见的中间语言形式有逆波兰表示法、抽象语法树、三元式、四元式。
3. 语法制导翻译的方法就是为每个产生式配上一个翻译子程序(语义动作或语义子程序),并在语法分析的同时执行它们。
4. 编译过程中,常见的中间语言形式有逆波兰表示法、抽象语法树、三元式、四元式。
5. 词法分析器的输入是源程序字符串,输出结构是二元式(单词种别,单词自身的值)。
6. 文法符号的属性有两种,一种称为继承属性,另一种称为综合属性。
7. 四元式之间的联系是通过临时变量实现的。
8. 在属性文法中,终结符只有综合属性。
9. 编译过程中,常见的中间语言形式有逆波兰式、抽象语法树、三元式、四元式。
10. 语法制导翻译的方法就是为每个产生式配上一个翻译子程序(语义动作或语义子程序),并在语法分析的同时执行它们。
11. 目前较常见的语言语义的描述形式是属性文法,并使用语法制导翻译方法完成对语法成分的翻译。
三、判断题#
1. 设 r 和 s 分别为正规式,则有 L(r∣s)=L(r)∣L(s)。( × )
2. 一个文法的所有句型的集合形成该文法所能接受的语言。( × )
3. 语法分析之所以采用上下文无关文法是因为它的描述能力最强。( × )
4. 由于 LR(0) 分析表构造简单,所以它的描述能力强,适用面宽;LR(1) 分析表因构造复杂而描述能力弱,适用面窄。( × )
5. 逆波兰表示法表示表达式时无需使用括号。( √ )
6. 自动机 M 和 M′ 的状态个数不同,则二者必不等价。( × )
7. LL(1) 文法一定不含左递归和二义性。( √ )
8. 所有 LR 分析器的总控程序都是一样的,只是分析表各有不同。( √ )
9. 无论是三元式表示还是间接三元式表示的中间代码,其三元式在三元式表中的位置一旦确定就很难改变。( √ )
10. 三地址语句类似于汇编语言代码,可以看成中间代码的一种抽象形式。( √ )
11. 最左推导也被称为规范推导。( × )
12. 运算对象排列的先后顺序在后缀式和中缀式中不同。( × )
13. 出现在移进-归约分析器栈中的内容被称为文法 G 的活前缀。( √ )
14. LR 方法可以分析含有左递归的文法。( √ )
15. 三元式的编号具有双重含义,既代表此三元式,又代表三元式存放的结果。( √ )
16. 语义规则中的属性有两种:综合属性与继承属性。( √ )
17. 移进-归约分析器的格局中栈的内容一般是文法符号与状态。( √ )
18. 由于递归下降子程序方法较 LL(1) 方法简单,因此它要求文法不必是 LL(1) 文法。( × )
19. 四元式的编号具有双重含义,既代表此四元式,又代表四元式存放的结果。( × )
20. 用高级语言编写的源程序必须经过编译,产生目标程序后才能运行。( × )
21. 源程序到目标程序的变换是等价变换,即两者结构不同,但语义是一致的。( √ )
22. 对于任何一个正规式 e,都存在一个 DFA A,使得 L(e)=L(A)。( √ )
23. 最小化的 DFA,它的状态数最小。( √ )
24. NFA 的确定化算法具有消除 ε 边的功能。( √ )
25. 每个非终结符产生的终结符号串都是该语言的子集。( × )
26. 一个语言的文法是不唯一的。( √ )
27. 语法错误校正的目的是为了把错误改正过来。( × )
28. 源程序和目标程序是等价关系。( √ )
29. 编译程序中错误处理的任务是对检查出的错误进行修改。( × )
30. 使用有限自动机可以实现单词的识别。( √ )
31. 一个非确定的有限自动机 NFA 可以通过多条路径识别同一个符号串。( √ )
32. 最小化的 DFA 所识别接受的正规集最小。( × )
33. 一个语言(如 C 语言)的句子是有穷的。( × )
34. LL(1) 方法又称为预测分析方法。( √ )
35. 一个 LL(1) 文法是无二义和无回溯方法。( √ )
36. 语法分析器可以检查出程序中的所有错误。( × )
37. LR 分析法是自上而下的语法分析方法。( × )
四、多项选择题#
1. 编译器的各个阶段的工作都涉及到 ( )。AE
- A. 表格处理
- B. 词法分析
- C. 语法分析
- D. 语义分析
- E. 出错处理
2. 令 Σ={a,b},则 Σ 上的符号串的全体可用下面的正规式表示 ( )。ABE
- A. (a∣b)∗
- B. (a∗∣b∗)∗
- C. (a∣b)+
- D. (ab)∗
- E. (a∗b∗)∗
3. 自上而下的分析方法有 ( )。AD
- A. 递归下降分析法
- B. LR(0) 分析法
- C. LALR(1) 分析法
- D. LL(1) 分析法
- E. SLR(1) 分析法
4. 文法 G:G[S]:S→CD,C→aCA,C→bCB,AD→aD,BD→bD,Aa→bD,Ab→bA,Ba→aB,Bb→bB,C→ε,D→ε 是 ( )。ABE
- A. 0 型文法
- B. 1 型文法
- C. 2 型文法
- D. 3 型文法
- E. 上下文有关文法
5. 对 LR 分析表的构造,有可能存在的动作冲突有 ( )。AD
- A. 移进/归约冲突
- B. 移进/移进冲突
- C. 归约冲突
- D. 归约/归约冲突
- E. 移进冲突
6. 一个编译器可能有的阶段为 ( )。ABCDE
- A. 词法分析
- B. 语法分析
- C. 语义分析
- D. 中间代码生成
- E. 目标代码生成
7. 令 Σ={a,b},则 Σ 上的所有以 b 开头,后跟若干个(可为 0 个)ab 的符号串的全体可用下面的正规式表示 ( )。AB
- A. b(ab)∗
- B. (ba)∗b
- C. b(a∣b)+
- D. (ba)+b
- E. b(a∣b)∗
8. 自下而上的分析方法有 ( )。BCE
- A. 递归下降分析法
- B. LR(0) 分析法
- C. LALR(1) 分析法
- D. LL(1) 分析法
- E. SLR(1) 分析法
9. 一般来说,编译器可分为前端和后端,下列编译阶段可被划分为编译的前端的有 ( )。ABCDE
- A. 词法分析
- B. 语法分析
- C. 语义分析
- D. 中间代码生成
- E. 中间代码优化
10. 令 Σ={a,b},则 Σ 上的符号串的全体可用下面的正规式表示 ( )。ABE
- A. (a∣b)∗
- B. (a∗∣b∗)∗
- C. (a∣b)+
- D. (ab)∗
- E. (a∗b∗)∗
11. 下列符号串是符号集 Σ={a,b} 上的正规式的有 ( )。ABCDE
- A. ε
- B. a
- C. ab
- D. (ab∣a)(ab∣a)
- E. ab∣ab
12. 正规式服从的代数规律有 ( )。ABDE
- A. “或” 运算服从交换律
- B. “或” 运算服从结合律
- C. “连接” 运算服从交换律
- D. “连接” 运算服从结合律
- E. “连接” 运算可对 “或” 运算进行分配
13. 令 Σ={a,b},则 Σ 上的所有以 b 开头,后跟若干个(可为 0 个)ab 的符号串的全体可用下面的正规式表示 ( )。AB
- A. b(ab)∗
- B. (ba)∗b
- C. b(a∣b)+
- D. (ba)+b
- E. b(a∣b)∗
14. 一个 LR 分析器包括 ( )。ADE
- A. 一个总控程序
- B. 一个项目集
- C. 一个活前缀
- D. 一个分析栈
- E. 一张分析表
15. LR 分析器的核心部分是一张分析表,该表包括 ( ) 等子表。DE
- A. LL(1) 分析表
- B. LR(1) 分析表
- C. SLR(1) 分析表
- D. Action 表
- E. goto 表
16. Action 表中的每一项 Action[S,a] 所表示的动作可能为 ( )。ABCD
- A. 移进
- B. 接受
- C. 归约
- D. 出错
- E. 待约
五、简答题#
1. 构造正规表达式 a(aa)∗bb(bb)∗a(aa)∗ 的 NFA。
解:
2. 构造正规表达式 ((a∣b)∗∣aa)∗b 的 NFA。
解:
3. 令文法 G[N] 为 G[N]:N→D∣ND,D→0∣1∣2∣3∣4∣5∣6∣7∣8∣9。给出句子 568 的最左、最右推导。
解:
最左推导:N⇒ND⇒NDD⇒DDD⇒5DD⇒56D⇒568
最右推导:N⇒ND⇒N8⇒ND8⇒N68⇒D68⇒568
4. 给出字母表 Σ={a,b} 上的同时只有奇数个 a 和奇数个 b 的所有串的集合的正规文法。
解:G[S]:S→aA∣bB,A→aS∣bC∣b,B→bS∣aC∣a,C→bA∣aB∣ε
5. 给定文法:S→(L)∣a,L→L,S∣S。请书写语义规则,求输出句子中每一个 a 的括号嵌套深度。
解:
用继承属性 depth 表示嵌套深度,则:
| 产生式 | 语义规则 |
|---|
| S′→S | S.depth=0 |
| S→(L) | L.depth=S.depth+1 |
| S→a | print(S.depth) |
| L→L(1),S | L(1).depth=L.depth;S.depth=L.depth |
| L→S | S.depth=L.depth |
6. 表达式 a*b-c-d\e$f-g-hi中,运算符的优先级由高到低依次为-、、$$,且均为右结合,请写出相应的后缀式。
解:$abcd—efgh—i$$$
7. 判断文法 G[S]:S→BA,A→BS∣d,B→aA∣bS∣c 是否为 LL(1) 文法。
解:对于该文法求其 FIRST 集如下:
FIRST(S)={a,b,c};FIRST(A)={a,b,c,d};FIRST(B)={a,b,c}。
求其 FOLLOW 集如下:
FOLLOW(S)={a,b,c,d,#};FOLLOW(A)={a,b,c,d,#};FOLLOW(B)={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) 文法。
8. 对于文法 G[E]:E→E+T∣T,T→T+P∣P,P→(E)∣i,写出句型 P+T+(E+i) 的所有短语、直接短语、句柄。
解:
短语:P、P+T、i、E+i、(E+i)、P+T+(E+i)
直接短语:P、i
句柄:P
9. 已知文法 G[A]:A→aABl∣a,B→Bb∣d,试给出与 G[A] 等价的 LL(1) 文法 G[A′]。
解:G[A′]:A→aA′,A′→ABl∣ε,B→dB′,B′→bB′∣ε
10. 将下面的语句翻译成四元式序列:if (x > y) m = 1; else m = 0;
解:
| 序号 | 四元式 |
|---|
| 1 | (j>,x,y,3) |
| 2 | (j,_,_,5) |
| 3 | (=,1,_,m) |
| 4 | (j,_,_,6) |
| 5 | (=,0,_,m) |
| 6 | |
11. 将以下 DFA 最小化。(8 分)
解:
12. 设 M=({x,y},{a,b},f,x,{y}) 为一非确定的有限自动机,其中 f 定义如下:f(x,a)={x,y},f(x,b)={y},f(y,a)=∅,f(y,b)={x,y}。试构造相应的确定有限自动机 M′。(12 分)
解:对照自动机的定义 M=(S,Σ,f,S0,Z),由 f 的定义可知 f(x,a)、f(y,b) 均为多值函数,因此 M 是一非确定有限自动机。先画出 NFA M 相应的状态图,如下图所示。
用子集法构造状态转换矩阵,如下表所示。将转换矩阵中的所有子集重新命名,形成下表所示的状态转换矩阵,即得到 M′=({0,1,2},{a,b},f,0,{1,2})。
M′ 状态转换图如下图所示。
(注意:本题由于集合的命名和先后顺序不同,可能最终结果不同。)
13. 试构造下述文法的 SLR(1) 分析表。(13 分)
G[A]:A→aABl∣a,B→Bb∣d
解:拓广文法
- (0) S→A
- (1) A→aABl
- (2) A→a
- (3) B→Bb
- (4) B→d
FIRST(A)={a},FOLLOW(A)={#,d}
FIRST(B)={d},FOLLOW(B)={l}
SLR(1) 分析表如下:
| 状态 | a | b | d | l | # | A | B |
|---|
| 0 | S2 | | | | | 1 | |
| 1 | | | | | ACC | | |
| 2 | S2 | | R2 | | R2 | 3 | |
| 3 | | | S4 | | | | 5 |
| 4 | | | R4 | | | | |
| 5 | | S7 | | S6 | | | |
| 6 | | R1 | | R1 | | | |
| 7 | | | R3 | | | | |
14. 将下面的语句翻译成四元式序列:if (x > y) m = 1; else m = x + y;(7 分)
解:
| 序号 | 四元式 |
|---|
| 1 | (j>,x,y,3) |
| 2 | (j,_,_,5) |
| 3 | (=,1,_,m) |
| 4 | (j,_,_,7) |
| 5 | (+,x,y,T1) |
| 6 | (=,T1,_,m) |
| 7 | |
15. 试构造下述文法的 LL(1) 分析表。(15 分)
G[S]:S→(L)∣a,L→L,S∣S
解:消除左递归:
G(S):S→(L)∣a,L→SL′,L′→,SL′∣ε
构造 FIRST 集如下:
- (1) FIRST(S)={(,a}
- (2) FIRST(L)={(,a}
- (3) FIRST(L′)={,,ε}
构造 FOLLOW 集如下:
- (1) FOLLOW(S)={#,,,)}
- (2) FOLLOW(L)={)}
- (3) FOLLOW(L′)={)}
LL(1) 分析表:
| ( | ) | a | , | # |
|---|
| S | S→(L) | | S→a | | |
| L | L→SL′ | | L→SL′ | | |
| L′ | | L′→ε | | L′→,SL′ | |
16. 判断文法 G[S]:S→BA,A→BS∣d,B→aA∣bS∣c 是否为 LL(1) 文法。
解:对于该文法求其 FIRST 集如下:
FIRST(S)={a,b,c};FIRST(A)={a,b,c,d};FIRST(B)={a,b,c}。
求其 FOLLOW 集如下:
FOLLOW(S)={a,b,c,d,#};FOLLOW(A)={a,b,c,d,#};FOLLOW(B)={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) 文法。
17. 对于文法 G[E]:E→E+T∣T,T→T+P∣P,P→(E)∣i,写出句型 P+T+(E+i) 的所有短语、直接短语、句柄。
解:
短语:P、i、E+i、(E+i)、T+(E+i)、P+T+(E+i)
直接短语:P、i
句柄:P
18. 已知文法 G[S]:S→aSbS∣bSaS∣ε,试证明 G[S] 是二义文法。
证明:该文法产生的语言是 a 的个数和 b 的个数相等的串的集合。该文法二义,例如句子 abab 有两种不同的最左推导:
S⇒aSbS⇒abS⇒abaSbS⇒ababS⇒abab
S⇒aSbS⇒abSaSbS⇒abaSbS⇒ababS⇒abab
19. 将下面的语句翻译成四元式序列:while (a < b) if (c > d) x = y + z
解:
| 序号 | 四元式 |
|---|
| 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 | |
20. 构造正规表达式 a(aa)∗bb(bb)∗a 的最小化的确定有限自动机 M′。
解:先画出正规式相应的 NFA M 状态图,如下图所示。
用子集法构造状态转换矩阵,如下表所示。
| I | Ia | Ib |
|---|
| {X} | {1} | − |
| {1} | {2} | {3} |
| {2} | {1} | − |
| {3} | − | {4} |
| {4} | {Y} | {5} |
| {5} | − | {4} |
| {Y} | − | − |
将状态分为终态集 {Y} 和非终态集 {X,1,2,3,4,5}。
因为 {X,1,2,3,4,5} 对 a={1,2,1,_,Y,_},所以非终态集分为 {X,1,2}、{3,5}、{4}。
因为 {X,1,2} 对 b={_,3,_},所以继续划分。
最后得到集合 {X,2}、{1}、{3,5}、{4}、{Y},重新命名为 1, 2, 3, 4, 5 得到最小化的 DFA M′ 状态转换矩阵和状态转换图如下图所示。
| I | Ia | Ib |
|---|
| 1 | 2 | − |
| 2 | 1 | 3 |
| 3 | − | 4 |
| 4 | 5 | 3 |
| 5 | − | − |
(注意:本题由于集合的命名和先后顺序不同,可能最终结果不同。)
21. 试构造下述文法的 SLR(1) 分析表。
G[A]:A→aABl∣a,B→Bb∣d
解:拓广文法
- (0) S→A
- (1) A→aABl
- (2) A→a
- (3) B→Bb
- (4) B→d
FIRST(A)={a},FOLLOW(A)={#,d}
FIRST(B)={d},FOLLOW(B)={l}
SLR(1) 分析表如下:
| 状态 | ACTION | | | | | GOTO | |
|---|
| a | b | d | l | # | A | B |
| 0 | S2 | | | | | 1 | |
| 1 | | | | | ACC | | |
| 2 | S2 | | R2 | | R2 | 3 | |
| 3 | | | S4 | | | | 5 |
| 4 | | | R4 | | | | |
| 5 | | S7 | | S6 | | | |
| 6 | | R1 | | R1 | | | |
| 7 | | | R3 | | | | |
22. 画出编译程序的总体结构图,简述各部分的主要功能。
解:编译程序的总体框图如下所示:
- (1) 词法分析器,又称扫描器,它接受输入的源程序,对源程序进行词法分析,识别出一个个单词符号,其输出结果是二元式(单词种别,单词自身的值)流。
- (2) 语法分析器,对单词符号串进行语法分析(根据语法规则进行推导或归约),识别出程序中的各类语法单位,最终判断输入串是否构成语法上正确的句子。
- (3) 语义分析及中间代码生成器,按照语义规则对语法分析器归约出(或推导出)的语法单位进行语义分析并把它们翻译成一定形式的中间代码。编译程序可以根据不同的需要选择不同的中间代码形式,有的编译程序甚至没有中间代码形式,而直接生成目标代码。
- (4) 优化器对中间代码进行优化处理。一般最初生成的中间代码执行效率都比较低,因此要做中间代码的优化,其过程实际上是对中间代码进行等价替换,使程序在执行时能更快,并占用更小的空间。
- (5) 目标代码生成器,把中间代码翻译成目标程序。中间代码一般是一种与机器无关的表示形式,只有把它再翻译成与机器硬件直接相关的机器能识别的语言,即目标程序,才能在机器上运行。
- (6) 表格管理模块保持一系列的表格,登记源程序的各类信息和编译各阶段的进展状况。编译程序各个阶段所产生的中间结果都记录在表格中,所需要的信息也大多从表格中获取,整个编译过程都在不断和表格打交道。
- (7) 出错处理程序对出现在源程序中的错误进行处理。如果源程序有错误,编译程序应设法发现错误,把有关错误信息报告给用户。编译程序的各个阶段都有可能发现错误,出错处理程序要对发现的错误进行处理、记录,并反映给用户。
23. 对于文法 G(S):S→(L)∣aS∣a,L→L,S∣S。
(1) 画出句型 (S,(a)) 的语法树。
(2) 写出上述句型的所有短语、直接短语和句柄。
解:
(1) 句型 (S,(a)) 的语法树如下图所示。
(2) 从语法树中可以找到:
短语:a;(a);S;S,(a);(S,(a))
直接短语:a;S
句柄:S
24. 构造一文法,使其描述的语言 L={ω∣ω∈(a,b)∗,且ω中含有相同个数的 a 和 b}。
解:S→ε∣aA∣bB,A→b∣bS∣aAA,B→a∣aS∣bBB
25. 分别给出表达式 −(a∗(b−c))+d 的逆波兰表示和四元式表示。
解:
(1) 逆波兰式:abc−∗@d+(其中使用 @ 代表一目减运算)
(2) 四元式:
| 序号 | 四元式 |
|---|
| ① | (−,b,c,T1) |
| ② | (∗,a,T1,T2) |
| ③ | (@,T2,_,T3) |
| ④ | (+,T3,d,T4) |
26. 把下列语句翻译为四元式序列:
while (A > B)
if (C > D)
X = Y * Z
else
X = Y + Z
解:
| 序号 | 四元式 |
|---|
| (1) | (j>,A,B,3) |
| (2) | (j,_,_,11) |
| (3) | (j>,C,D,5) |
| (4) | (j,_,_,8) |
| (5) | (∗,Y,Z,T1) |
| (6) | (=,T1,_,X) |
| (7) | (j,_,_,1) |
| (8) | (+,Y,Z,T2) |
| (9) | (=,T2,_,X) |
| (10) | (j,_,_,1) |
| (11) | |
27. 构造一个 DFA,它接受 Σ={0,1} 上所有满足如下条件的字符串:每个 1 后面都有 0 直接跟在右边。
解:
(1) 正规式:0∗(0∣10)∗0∗ 或者 (0∣10)∗
(2) ① NFA
② 子集法确定化
| I | I0 | I1 |
|---|
| {X,0,1,3,Y} | {0,1,3,Y} | {2} |
| {0,1,3,Y} | {0,1,3,Y} | {2} |
| {2} | {1,3,Y} | − |
| {1,3,Y} | {1,3,Y} | {2} |
重新命名状态,即得:
③ 最小化
首先分为终态集和非终态集 {3} {1,2,4}。因为 10=2,20=2,40=4,状态均属于集合 {1,2,4},所以对于输入符号 0 不能区分开 1, 2, 4 三个状态;11=3,21=3,41=3,状态均属于集合 {3},所以对于输入符号 1 也不能区分开 1, 2, 4 三个状态。因此最终的状态划分即为:{3} {1,2,4},其对应的 DFA 如下图所示。
28. 已知文法 G(S):S→S∗aP∣aP∣∗aP,P→+aP∣+a。
(1) 将文法 G(S) 改写为 LL(1) 文法 G′(S);
(2) 写出文法 G′(S) 的预测分析表。
解:
(1) 消除左递归,文法变为:
S→aPS′∣∗aPS′,S′→∗aPS′∣ε,P→+aP∣+a
提取公共左因子,文法变为 G′(S):
S→aPS′∣∗aPS′,S′→∗aPS′∣ε,P→+aP′,P′→P∣ε
(2) 计算每个非终结符的 FIRST 集和 FOLLOW 集:
FIRST(S)={a,∗},FOLLOW(S)={#}
FIRST(S′)={∗,ε},FOLLOW(S′)={#}
FIRST(P)={+},FOLLOW(P)={∗,#}
FIRST(P′)={+,ε},FOLLOW(P′)={∗,#}
构造该文法的预测分析表如下:
| ∗ | + | a | # |
|---|
| S | S→∗aPS′ | | S→aPS′ | |
| S′ | S′→∗aPS′ | | | S′→ε |
| P | | P→+aP′ | | |
| P′ | P′→ε | P′→P | | P′→ε |
29. 已知文法 G(S):S→aS∣bS∣a。
(1) 构造识别该文法所产生的活前缀的 DFA;
(2) 判断该文法是 LR(0) 还是 SLR(1),并构造所属文法的 LR 分析表。
解:
(1) 将文法 G(S) 拓广为 G′(S′):
- (0) S′→S
- (1) S→aS
- (2) S→bS
- (3) S→a
识别该文法所产生的活前缀的 DFA。
(2) 在状态 I2 存在 “移进-归约” 冲突,因此该文法不是 LR(0) 文法。
计算 S 的 FOLLOW 集合:FOLLOW(S)={#}
I2 中的冲突用 FOLLOW 集合可以解决,所以该文法是 SLR(1) 文法。
构造 SLR(1) 分析表如下:
| 状态 | ACTION | | | GOTO |
|---|
| a | b | # | S |
| 0 | s2 | s3 | | 1 |
| 1 | | | acc | |
| 2 | s2 | s3 | r3 | 4 |
| 3 | s2 | s3 | | 5 |
| 4 | | | r1 | |
| 5 | | | r2 | |
30. 将下图所示的非确定有限自动机(NFA)变换成等价的确定有限自动机(DFA)。其中,X 为初态,Y 为终态。
【解】用子集法将 NFA 确定化,如图所示。确定化的 DFA 如下图所示。
31. 对正规式 (a∣b)∗abb 构造其等价的 NFA。
【解】
32. 下面的文法产生 0 和 1 的串,即二进制的正整数,请给出决定每个二进制数的值(十进制形式)的语法制导定义。
【解】定义值属性为 .val,翻译方案如下:
| 产生式 | 语义规则 |
|---|
| B→B10 | B.val=B1.val×2 |
| B→B11 | B.val=B1.val×2+1 |
| B→1 | B.val=1 |
| B→0 | B.val=0 |
33. 把算术表达式 ((a+b)∗(c+d)+(e+f)) 翻译成等价的四元式序列(序号从 0 开始)。
【解】
| 序号 | 四元式 |
|---|
| 0 | (+,a,b,T1) |
| 1 | (uminus,T1,_,T2) |
| 2 | (+,c,d,T3) |
| 3 | (∗,T2,T3,T4) |
| 4 | (+,e,f,T5) |
| 5 | (+,T4,T5,T6) |
34. 设有文法 G[S]:S→a∣(T)∣(,T→T,S∣S。试给出句子 (a,a,a) 的最左推导。
【解】(a,a,a) 的最左推导:
S⇒(T)⇒(T,S)⇒(T,S,S)⇒(S,S,S)⇒(a,S,S)⇒(a,a,S)⇒(a,a,a)
35. 已知文法 G:S→(L∣a,L→S,L∣)。判断是不是 LL(1) 文法,如果是请构造文法 G 的预测分析表,如果不是请说明理由。
【解】
(1) 求各非终结符的 FIRST 集和 FOLLOW 集:
FIRST(S)={(,a},FIRST(L)={(,a,)}
FOLLOW(S)={,,#},FOLLOW(L)={,,#}
FIRST((L)∩{a}=∅
FIRST(S,L)∩{)}=∅
所以是 LL(1) 文法。
(2) 预测分析表:
| ( | a | , | ) | # |
|---|
| S | S→(L | S→a | | | |
| L | L→S,L | L→S,L | | L→) | |
36. 文法 S→Aa∣bAc∣dc∣bda,A→d。构造识别活前缀的 DFA。请根据这个 DFA 来判断该文法是不是 SLR(1) 文法并说明理由。
【解】
FOLLOW(S)={#}
FOLLOW(A)={a,c}
I4 存在冲突且 FOLLOW(A)∩{c}={c}
I7 存在冲突且 FOLLOW(A)∩{a}={a}
所以不是 SLR(1) 文法。
37. 将下图所示的确定有限自动机(DFA)最小化。其中,X 为初态,Y 为终态。
【解】先划分为终态集 {Y} 和非终态集 I={X,1,2,3}。
X 面对输入符号 b 时下一状态属于 I,而 1, 2, 3 面对输入符号 b 时下一状态属于 {Y},故划分为 {X}、{1,2,3}。
非终态 2 和非终态 3 面对输入符号 a 的下一状态相同,而 1 不同,即最简状态 {X}、{1}、{2,3}、{Y}。按顺序重新命名为 0, 1, 2, 3,则得到最简 DFA。
38. 请画出识别无符号十进制整数的状态转换图。
【解】
39. 设有文法 G[S]:S→S∗S∣S+S∣(S)∣i。该文法是否为二义文法,并说明理由?
【解】该文法是二义文法,因为该文法存在句子 i∗i+i,该句子有两棵不同的语法树,如图所示。
40. 程序的文法如下:P→D,D→D;D∣id:T∣proc id;D;S。写一语法制导定义,打印该程序一共声明了多少个 id。
【解】属性 num 表示 id 个数。
| 产生式 | 语义规则 |
|---|
| P→D | print(D.num) |
| D→D(1);D(2) | D.num=D(1).num+D(2).num |
| D→id:T | D.num=1 |
| D→proc id;D(1);S | D.num=D(1).num+1 |
例:proc id; proc id; id : T; S; S(从语法树分析入手)
(注意:本例只是帮助学生理解题意,不是答案部分)
41. 把下列语句翻译为四元式序列(四元式序号从 1 开始):
while (A > B)
if (C > D)
X = Y * Z
else
X = Y + Z
【解】
| 序号 | 四元式 |
|---|
| (1) | (j>,A,B,3) |
| (2) | (j,_,_,11) |
| (3) | (j>,C,D,5) |
| (4) | (j,_,_,8) |
| (5) | (∗,Y,Z,T1) |
| (6) | (=,T1,_,X) |
| (7) | (j,_,_,1) |
| (8) | (+,Y,Z,T2) |
| (9) | (=,T2,_,X) |
| (10) | (j,_,_,1) |
| (11) | |
42. 构造下面文法的 LL(1) 分析表。
G[D]:D→TL,T→int∣real,L→id R,R→,id R∣ε
【解】
FIRST(T)={int,real},FOLLOW(T)={id}
FIRST(L)={id},FOLLOW(L)={#}
FIRST(R)={,,ε},FOLLOW(R)={#}
FIRST(D)={int,real},FOLLOW(D)={#}
因为 FIRST(int)∩FIRST(real)=∅,FIRST(,id R)∩FOLLOW(R)=∅,所以是 LL(1) 文法。LL(1) 分析表如下:
| int | real | id | , | # |
|---|
| D | D→TL | D→TL | | | |
| T | T→int | T→real | | | |
| L | | | L→id R | | |
| R | | | | R→,id R | R→ε |
43. 给定文法 S→aS∣bS∣a,下面是拓广文法和识别该文法所产生的活前缀的 DFA。判断该文法是否是 SLR(1) 文法:如果是构造其 SLR(1) 分析表,如果不是请说明理由。
(1) 将文法 G(S) 拓广为 G(S′):
- (0) S′→S
- (1) S→aS
- (2) S→bS
- (3) S→a
(2) 识别该文法所产生的活前缀的 DFA 如图 1 所示。
【解】注意到状态 I1 存在 “移进-归约” 冲突,计算 S 的 FOLLOW 集合:
FOLLOW(S)={#}
{a}∩{b}∩FOLLOW(R)=∅
可以采用 SLR 冲突消解法,得到如下的 SLR 分析表。从分析表可以看出,表中没有冲突项,所以该文法是 SLR(1) 文法。
表 1 SLR 分析表
| 状态 | ACTION | | | GOTO |
|---|
| a | b | # | S |
| 0 | S1 | S2 | | 3 |
| 1 | S1 | S2 | r3 | 4 |
| 2 | S1 | S2 | | 5 |
| 3 | | | acc | |
| 4 | | | r1 | |
| 5 | | | r2 | |
44. 给出表达式 −a∗b+b∗c+d/e 的语法树和三元式序列。
答:语法树(见图)。三元式序列:
| 序号 | 三元式 |
|---|
| (1) | (−,a,_) |
| (2) | (∗,(1),b) |
| (3) | (∗,b,c) |
| (4) | (+,(2),(3)) |
| (5) | (/,d,e) |
| (6) | (+,(4),(5)) |
45. 证明下面文法 S→AaAb∣BbBa,A→ε,B→ε,是 LL(1) 文法,但不是 SLR(1) 文法。
证明:
(1) FIRST(AaAb)={a},FIRST(BbBa)={b},有 FIRST(AaAb)∩FIRST(BbBa)=∅,所以根据 LL(1) 文法的定义,该文法是 LL(1) 文法。
(2) 为了构造识别活前缀的 DFA,初态集包含如下四个项目:S→⋅AaAb,S→⋅BbBa,A→⋅,B→⋅。但该项目中有两个可归约项目:A→⋅,B→⋅,产生归约-归约冲突,而 FOLLOW(A)={a,b},FOLLOW(B)={a,b},有 FOLLOW(A)∩FOLLOW(B)=∅,所以使用向前看一个终结符的方法不能解决此冲突,所以该文法不是 SLR(1) 文法。
46. 现有文法 G[S]:S→a∣ε∣(T),T→T,S∣S。请给出句子 (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))
最右推导:S⇒(T)⇒(T,S)⇒(T,(T))⇒(T,(T,S))⇒(T,(T,a))⇒(T,(S,a))⇒(T,(a,a))⇒(S,(a,a))⇒(a,(a,a))
句型的句柄为加下划线的部分。
47. 将下图的 DFA 最小化。
答:
初始划分:II={{0,1,2},{3,4}}
(1) 考查 {0,1,2},1 和 2 接受 a, b 后都转向相同的状态,且接受 b 后转向终态,而 0 接受 b 后转向非终态 2,所以 0 与 1, 2 可分,IInew={{0},{1,2},{3,4}}。
(2) 考查 {3,4},接受 a, b 后都转向相同的状态,所以 3, 4 不可分。IInew={{0},{1,2},{3,4}}。
将 1, 2 合并用 1 代表,3, 4 合并用 3 代表,最终的最小化 DFA 如下。
48. 设有如下文法:P→D,D→D;D∣id:T∣proc id;D;,T→real∣integer。给出一个语法制导定义,打印该程序一共声明了多少个 id。
答:
| 产生式 | 语义规则 |
|---|
| P→D | print(D.num) |
| D→D1;D2 | D.num=D1.num+D2.num |
| D→id:T | D.num=1 |
| D→proc id;D1; | D.num=D1.num+1 |
| T→real | |
| T→integer | |
49. 识别文法 G 的活前缀的 DFA 如下图所示,补充完成状态 I2 和 I5,然后根据该图构造 SLR(1) 分析表。
G:(0) P′→P,(1) P→aPb,(2) P→Q,(3) Q→bQc,(4) Q→bSc,(5) S→Sa,(6) S→a
答:I2,I5 分别如下图所示。
\text{FOLLOW}(P) = \{b, \}$
\text{FOLLOW}(Q) = \{b, c, \}$
FOLLOW(S)={c,a}
SLR(1) 分析表:
| 状态 | Action | | | | GOTO | | |
|---|
| a | b | c | $$$ | P | Q | S |
| 0 | S2 | S5 | | | 1 | 3 | |
| 1 | | | | Acc | | | |
| 2 | S2 | S5 | | | 4 | 3 | |
| 3 | | R2 | | R2 | | | |
| 4 | | | S7 | | | | |
| 5 | S6 | S5 | | | | 9 | 10 |
| 6 | R6 | | R6 | | | | |
| 7 | | R1 | | R1 | | | |
| 8 | | R3 | R3 | R3 | | | |
| 9 | | | S8 | | | | |
| 10 | S12 | | S11 | | | | |
| 11 | | R4 | R4 | R4 | | | |
| 12 | R5 | | R5 | | | | |
50. 给出表达式 (a+b)∗(c+d/e) 的语法树和四元式序列。
答:语法树如下。四元式序列:
| 序号 | 四元式 |
|---|
| (0) | (+,a,b,T1) |
| (1) | (/,d,e,T2) |
| (2) | (+,c,T2,T3) |
| (3) | (∗,T1,T3,T4) |
51. 构造文法 S→AaAb∣BbBa,A→ε,B→ε 的预测分析表。
答:FIRST(S)={a,b},FIRST(AaAb)={a},FIRST(BbBa)={b}
FOLLOW(A)={a,b},FOLLOW(B)={a,b}
| a | b | $$$ |
|---|
| S | S→AaAb | S→BbBa | |
| A | A→ε | A→ε | |
| B | B→ε | B→ε | |
52. 写出 C 语言标识符集(字母或下划线开头的由字母、数字、下划线构成的串)的正规式。
解答:用 D 表示数字 0-9,用 L 表示字母 a-z∣A-Z,则 C 语言标识符的正规式为:
(L∣_)(L∣D∣_)∗
53. 有一语法制导定义如下,其中 + 表示符号连接运算:
SBBBB→B→a→b→Ba→Bbprint B.versB.vers=aB.vers=bB.vers=a+B.versB.vers=b+B.vers
若输入序列为 abab,且采用自底向上的分析方法,则输出序列为(baba)。用分析树表示求解过程。
54. 假设第一个四元式的序号是 100,写出布尔表达式 a<b∨c∧d>e 的四元式序列。
| 序号 | 四元式 |
|---|
| 100 | (j<,a,b,106) |
| 101 | (j,_,_,102) |
| 102 | (jnz,c,_,104) |
| 103 | (j,_,_,q) |
| 104 | (j>,d,e,106) |
| 105 | (j,_,_,q) |
| T: 106 | |
| … | |
| F: q | |
| … | |
55. 设有如下文法:G[E]:E→EWT∣T,T→T/F∣F,F→(E)∣a∣b∣c,W→+∣−。证明符号串 a/(b−c) 是句子。
解答:有推导 E⇒T⇒T/F⇒F/F⇒a/F⇒a/(E)⇒a/(EWT)⇒a/(TWT)⇒a/(FWT)⇒a/(bWT)⇒a/(b−T)⇒a/(b−c),即从文法开始符号 E 能够推导出 a/(b−c),所以 a/(b−c) 是文法 G[E] 的句子。
56. 对于下列文法 G[S]:S→Sb∣bA,A→aA∣a。
(1) 构造一个与 G 等价的 LL(1) 文法 G′。
(2) 对于文法 G′,构造相应的 LL(1) 分析表。
解:
(1) G′:S→bAS′,S′→bS′∣ε,A→aA′,A′→A∣ε
(2)
FIRST(S)={b},FIRST(S′)={b,ε},FIRST(A)={a},FIRST(A′)={a,ε}
FOLLOW(S)={#},FOLLOW(S′)={#},FOLLOW(A)={b,#},FOLLOW(A′)={b,#}
LL(1) 分析表:
| a | b | # |
|---|
| S | | S→bAS′ | |
| S′ | | S′→bS′ | S′→ε |
| A | A→aA′ | | |
| A′ | A′→A | A′→ε | A′→ε |
57. 构造下述文法的 SLR(1) 分析表。
G[S]:S→(A),A→ABB∣B,B→b
解:拓广文法:
- (0) S′→S
- (1) S→(A)
- (2) A→ABB
- (3) A→B
- (4) B→b
FIRST 集和 FOLLOW 集:
FIRST(S)={(,c},FOLLOW(S)={#}
FIRST(A)={b},FOLLOW(A)={b,)}
FIRST(B)={b},FOLLOW(B)={b,)}
SLR(1) 分析表:
| 状态 | ACTION | | | | GOTO | | |
|---|
| ( | ) | b | # | S | A | B |
| 0 | S2 | | | | 1 | | |
| 1 | | | | Acc | | | |
| 2 | | | S4 | | | 3 | 5 |
| 3 | | S6 | S4 | | | | 7 |
| 4 | | R4 | R4 | | | | |
| 5 | | R3 | R3 | | | | |
| 6 | | | | R1 | | | |
| 7 | | | S4 | | | | 8 |
| 8 | | R2 | R2 | | | | |
58. 有一语法制导定义如下:
SAAB→bAb→(B→a→aA)print "1"print "2"print "3"print "4"
若输入序列为 b(a(a(aa)))b,且采用自下而上的分析方法,则输出序列为(34242421)。
59. 写出赋值语句 X:=−(a+b)/(c−d)−(a+b∗c) 的逆波兰表示。
Xab+cd−/−bc∗a+−:=
60. 为文法 G[S]:S→(L)∣a,L→L,S∣S 写一语法制导定义,它输出句子中括号嵌套的最大层次数。
解:使用 num 属性描述括号的嵌套最大层次数。
| 产生式 | 语义规则 |
|---|
| S′→S | print(S.num) |
| S→(L) | S.num=L.num+1 |
| S→a | S.num=0 |
| L→L(1),S | L.num=if L(1).num>S.num then L(1).num else S.num |
| L→S | L.num=S.num |
61. 设有文法 G[S]:S→aAcB∣Bd,A→AaB∣c,B→bScA∣b。该文法句型 aAcbBdcc 的句柄是 Bd。
62. 已知文法 G[S] 如下:构造该文法的 LR(0) 分析表。
G[S]:S→BB,B→aB∣b
解:拓广文法:
- (0) S′→S
- (1) S→BB
- (2) B→aB
- (3) B→b
识别活前缀的 DFA 如下。
LR(0) 分析表如下:
| 状态 | Action | | | Goto | |
|---|
| a | b | # | S | B |
| 0 | S3 | S4 | | 1 | 2 |
| 1 | | | acc | | |
| 2 | S3 | S4 | | | 5 |
| 3 | S3 | S4 | | | 6 |
| 4 | R3 | R3 | R3 | | |
| 5 | R1 | R1 | R1 | | |
| 6 | R2 | R2 | R2 | | |
状态产生式:
I0:
S' → .S
S → .A a
S → .b A c
S → .d c
S → .b d a
A → .d
I1:
S' → S .
I2:
S → A .a
I3:
S → b .A c
S → b .d a
A → .d
I4:
S → d .c
A → d .
I5:
S → A a .
I6:
S → b A .c
I7:
S → b d .a
A → d .
I8:
S → d c .
I9:
S → b A c .
I10:
S → b d a .
I2:
P → a.Pb
P → .aPb
P → .Q
Q → .bQc
Q → .bSc
I5:
Q → b.Qc
Q → b.Sc
Q → .bQc
Q → .bSc
S → .Sa
S → .a