编译原理复习题及答案#
一、选择题#
1. 一个正规语言只能对应 (B)。
2. 文法 G[A]:A→ε,A→aB,B→Ab,B→a 是 (A)。
3. 下面说法正确的是 (A)。
- A. 一个 SLR(1) 文法一定也是 LALR(1) 文法
- B. 一个 LR(1) 文法一定也是 LALR(1) 文法
4. 一个上下文无关文法消除了左递归,提取了左公共因子后是满足 LL(1) 文法的 (A)。
5. 下面说法正确的是 (B)。
- A. 一个正规式只能对应一个确定的有限状态自动机
- B. 一个正规语言可能对应多个正规文法
6. 算符优先分析与规范归约相比的优点是 (A)。
7. 一个 LR(1) 文法合并同心集后若不是 LALR(1) 文法 (B)。
- A. 则可能存在移进/归约冲突
- B. 则可能存在归约/归约冲突
- C. 则可能存在移进/归约冲突和归约/归约冲突
8. 下面说法正确的是 (A)。
- A. Lex 是一个词法分析器的生成器
- B. Yacc 是一个语法分析器
9. 下面说法正确的是 (A)。
- A. 一个正规文法也一定是二型文法
- B. 一个二型文法也一定能有一个等价的正规文法
10. 编译原理是对 (C)。
- A. 机器语言的执行
- B. 汇编语言的翻译
- C. 高级语言的翻译
- D. 高级语言程序的解释执行
11. (A) 是一种典型的解释型语言。
- A. BASIC
- B. C
- C. FORTRAN
- D. PASCAL
12. 把汇编语言程序翻译成机器可执行的目标程序的工作是由 (B) 完成的。
- A. 编译器
- B. 汇编器
- C. 解释器
- D. 预处理器
13. 用高级语言编写的程序经编译后产生的程序叫 (B)。
- A. 源程序
- B. 目标程序
- C. 连接程序
- D. 解释程序
14. (C) 不是编译程序的组成部分。
- A. 词法分析程序
- B. 代码生成程序
- C. 设备管理程序
- D. 语法分析程序
15. 通常一个编译程序中,不仅包含词法分析,语法分析,语义分析,中间代码生成,代码优化,目标代码生成等六个部分,还应包括 (C)。
- A. 模拟执行器
- B. 解释器
- C. 表格处理和出错处理
- D. 符号执行器
16. 编译程序绝大多数时间花在 (D) 上。
- A. 出错处理
- B. 词法分析
- C. 目标代码生成
- D. 表格管理
17. 源程序是句子的集合,(B) 可以较好地反映句子的结构。
18. 词法分析器的输出结果是 (D)。
- A. 单词自身值
- B. 单词在符号表中的位置
- C. 单词的种别编码
- D. 单词的种别编码和自身值
19. 词法分析器不能 (D)。
- A. 识别出数值常量
- B. 过滤源程序中的注释
- C. 扫描源程序并识别记号
- D. 发现括号不匹配
20. 文法 G:S→xSx∣y 所识别的语言是 (D)。
- A. xyx
- B. (xyx)∗
- C. x∗yx∗
- D. xnyxn(n≥0)
21. 如果文法 G 是无二义的,则它的任何句子 α (A)。
- A. 最左推导和最右推导对应的语法树必定相同
- B. 最左推导和最右推导对应的语法树可能不同
- C. 最左推导和最右推导必定相同
- D. 可能存在两个不同的最左推导,但它们对应的语法树相同
22. 正则文法 (A) 二义性的。
23. (B) 这样一些语言,它们能被确定的有穷自动机识别,但不能用正则表达式表示。
24. 给定文法 A→bA∣ca,为该文法句子的是 (C)。
- A. bba
- B. cab
- C. bca
- D. cba
25. 设有文法 G[S]:S→S1∣S0∣Sa∣Sc∣a∣b∣c,下列符号串中是该文法的句子有 (D)。
- A. ab0
- B. a0c01
- C. a0b0a
- D. bc10
26. 文法 G 产生的 (D) 的全体是该文法描述的语言。
- A. 句型
- B. 终结符集
- C. 非终结符集
- D. 句子
27. 若文法 G 定义的语言是无限集,则文法必然是 (A)。
- A. 递归的
- B. 上下文无关的
- C. 二义性的
- D. 无二义性的
28. 描述一个语言的文法是 (B)。
29. 一个文法所描述的语言是 (A)。
30. 采用自上而下分析,必须 (A)。
- A. 消除回溯
- B. 消除左递归
- C. 消除右递归
- D. 提取公共左因子
31. 编译过程中,语法分析器的任务是 (A)。
① 分析单词的构成
② 分析单词串如何构成语句
③ 分析语句是如何构成程序
④ 分析程序的结构
- A. ②③
- B. ④
- C. ①②③④
- D. ②③④
32. 词法分析器的输入是 (A)。
- A. 符号串
- B. 源程序
- C. 语法单位
- D. 目标程序
33. 两个有穷自动机等价是指它们的 (C)。
- A. 状态数相等
- B. 有向弧数相等
- C. 所识别的语言相等
- D. 状态数和有向弧数相等
34. 若状态 k 含有项目 "A→α⋅",且仅当输入符号 a∈FOLLOW(A) 时,才用规则 "A→α" 归约的语法分析方法是 (D)。
- A. LALR 分析法
- B. LR(0) 分析法
- C. LR(1) 分析法
- D. SLR(1) 分析法
35. 若 a 为终结符,则 A→α⋅aβ 为 (B) 项目。
36. 在使用高级语言编程时,首先可通过编译程序发现源程序的全部和部分 (A) 错误。
37. 乔姆斯基 (Chomsky) 把文法分为四种类型,即 0 型、1 型、2 型、3 型。其中 3 型文法是 (B)。
- A. 非限制文法
- B. 正则文法
- C. 上下文有关文法
- D. 上下文无关文法
38. 一个句型中的 (A) 称为该句型的句柄。
- A. 最左直接短语
- B. 最右直接短语
- C. 终结符
- D. 非终结符
39. 在自底向上的语法分析方法中,分析的关键是 (D)。
- A. 寻找句柄
- B. 寻找句型
- C. 消除递归
- D. 选择候选式
40. 在自顶向下的语法分析方法中,分析的关键是 (C)。
- A. 寻找句柄
- B. 寻找句型
- C. 消除递归
- D. 选择候选式
41. 在 LR 分析法中,分析栈中存放的状态是识别规范句型 (C) 的 DFA 状态。
- A. 句柄
- B. 前缀
- C. 活前缀
- D. LR(0) 项目
42. 一个上下文无关文法 G 包括四个组成部分,它们是一组非终结符号,一组终结符号,一个开始符号,以及一组 (B)。
43. 词法分析器用于识别 (C)。
44. 编译程序是一种 (B)。
- A. 汇编程序
- B. 翻译程序
- C. 解释程序
- D. 目标程序
45. 按逻辑上划分,编译程序第三步工作是 (A)。
- A. 语义分析
- B. 词法分析
- C. 语法分析
- D. 代码生成
46. 在语法分析处理中,FIRST 集合、FOLLOW 集合均是 (B)。
- A. 非终结符集
- B. 终结符集
- C. 字母表
- D. 状态集
47. 编译程序中语法分析器接收以 (A) 为单位的输入。
- A. 单词
- B. 表达式
- C. 产生式
- D. 句子
48. 编译过程中,语法分析器的任务就是 (B)。
- A. 分析单词是怎样构成的
- B. 分析单词串是如何构成语句和说明的
- C. 分析语句和说明是如何构成程序的
- D. 分析程序的结构
49. 若一个文法是递归的,则它所产生的语言的句子 (A)。
- A. 是无穷多个
- B. 是有穷多个
- C. 是可枚举的
- D. 个数是常量
50. 识别上下文无关语言的自动机是 (C)。
- A. 下推自动机
- B. NFA
- C. DFA
- D. 图灵机
51. 编译原理各阶段工作都涉及 (B)。
- A. 词法分析
- B. 表格管理
- C. 语法分析
- D. 语义分析
52. 正则表达式 R1 和 R2 等价是指 (C)。
- A. R1 和 R2 都是定义在一个字母表上的正则表达式
- B. R1 和 R2 中使用的运算符相同
- C. R1 和 R2 代表同一正则集
- D. R1 和 R2 代表不同正则集
53. 已知文法 G[S]:S→A1,A→A1∣S0∣0。与 G 等价的正规式是 (C)。
- A. 0(0∣1)∗
- B. 1∗∣0∗1
- C. 0(1∣10)∗1
- D. 1(10∣01)∗0
54. 与 (a∣b)∗(a∣b) 等价的正规式是 (C)。
- A. a∗∣b∗
- B. (ab)∗(a∣b)
- C. (a∣b)(a∣b)∗
- D. (a∣b)∗
55. (D) 文法不是 LL(1) 的。
- A. 递归
- B. 右递归
- C. 2 型
- D. 含有公共左因子的
56. 给定文法 A→bA∣cc,则符号串 ① cc ② bcbc ③ bcbcc ④ bccbcc ⑤ bbbcc 中,是该文法句子的是 (D)。
57. LR(1) 文法都是 (A)。
- A. 无二义性且无左递归
- B. 可能有二义性但无左递归
- C. 无二义性但可能是左递归
- D. 可以既有二义性又有左递归
58. 文法 E→E+E∣E∗E∣i 的句子 i∗i+i∗i 有 (C) 棵不同的语法树。
59. 文法 S→aaS∣abc 定义的语言是 (C)。
- A. {a2kbc∣k>0}
- B. {akbc∣k>0}
- C. {a2k−1bc∣k>0}
- D. {akakbc∣k>0}
60. 若 B 为非终结符,则 A→(⋅B( 为 (D)。
- A. 移进项目
- B. 归约项目
- C. 接受项目
- D. 待约项目
61. 同心集合并可能会产生新的 (D) 冲突。
- A. 二义
- B. 移进/移进
- C. 移进/归约
- D. 归约/归约
62. 就文法的描述能力来说,有 (C)。
- A. SLR(1)⊂LR(0)
- B. LR(1)⊂LR(0)
- C. SLR(1)⊂LR(1)
- D. 无二义文法 ⊂LR(1)
63. 如图所示自动机 M,请问下列哪个字符串不是 M 所能识别的 (D)。
图 63.1 自动机 M 的状态转换图
- A. bbaa
- B. abba
- C. abab
- D. aabb
64. 有限状态自动机能识别 (C)。
- A. 上下文无关语言
- B. 上下文有关语言
- C. 正规语言
- D. 0 型文法定义的语言
65. 已知文法 G 是无二义的,则对 G 的任意句型 α (A)。
- A. 最左推导和最右推导对应的语法树必定相同
- B. 最左推导和最右推导对应的语法树可能相同
- C. 最左推导和最右推导必定相同
- D. 可能存在两个不同的最左推导,但他们对应的语法树相同
66. (B) 不是 DFA 的成分。
- A. 有穷字母表
- B. 多个初始状态的集合
- C. 多个终态的集合
- D. 转换函数
67. 与逆波兰式(后缀表达式)ab+c∗d+ 对应的中缀表达式是 (B)。
- A. a+b+c∗d
- B. (a+b)∗c+d
- C. (a+b)∗(c+d)
- D. a+b∗c+d
68. 后缀式 abc−+−d+ 可用表达式 (B) 来表示。
- A. (−(a+b)−c)+d
- B. −(a+(b−c))+d
- C. −(a−(b+c))+d
- D. (a−(−b+c))+d
69. 表达式 A∗(B−C∗(C/D)) 的后缀式为 (B)。
- A. ABC−CD/∗∗
- B. ABCCD/∗−∗
- C. ABC−∗CD/∗
- D. 以上都不对
70. (D) 不是 NFA 的成分。
- A. 有穷字母表
- B. 初始状态集合
- C. 终止状态集合
- D. 有限状态集合
二、问答题#
1. 将文法 G[S] 改写为等价的 G′[S],使 G′[S] 不含左递归和左公共因子。
G[S]:S→bSAe∣bA,A→Ab∣d
答:
文法 G[S] 改写为等价的不含左递归和左公共因子的 G′[S] 为:
SBAA′→bB→SAe∣A→dA′→bA′∣ε
2. 将文法 G[S] 改写为等价的 G′[S],使 G′[S] 不含左递归和左公共因子。
G[S]:S→SAe∣Ae,A→dAbA∣dA∣d
答:
文法 G[S] 改写为等价的不含左递归和左公共因子的 G′[S] 为:
SS′AA′B→AeS′→AeS′∣ε→dA′→AB∣ε→bA∣ε
3. 将文法 G[S] 改写为等价的 G′[S],使 G′[S] 不含左递归和左公共因子。
G[S]:S→[A,A→B]∣AS,B→aB∣a
答:
文法 G[S] 改写为等价的不含左递归和左公共因子的 G′[S] 为:
SAA′BB′→[A→B]A′→SA′∣ε→aB′→B∣ε
4. 判断下面文法是否为 LL(1) 文法,若是,请构造相应的 LL(1) 分析表。
S→aH,H→aMd∣d,M→Ab∣ε,A→aM∣e
答:
首先计算文法的 FIRST 集和 FOLLOW 集如下表。
| 非终结符 | FIRST 集 | FOLLOW 集 |
|---|
| S | {a} | {#} |
| H | {a,d} | {#} |
| M | {a,e,ε} | {d,b} |
| A | {a,e} | {b} |
由于:
predict(H→aMd)∩predict(H→d)={a}∩{d}=∅
predict(M→Ab)∩predict(M→ε)={a,e}∩{d,b}=∅
predict(A→aM)∩predict(A→e)={a}∩{e}=∅
所以该文法是 LL(1) 文法,LL(1) 分析表如下表。
| a | d | b | e | # |
|---|
| S | →aH | | | | |
| H | →aMd | →d | | | |
| M | →Ab | →ε | →ε | →Ab | |
| A | →aM | | | →e | |
5. 判断下面文法是否为 LL(1) 文法,若是,请构造相应的 LL(1) 分析表。
S→aD,D→STe∣ε,T→bH∣H,H→d∣ε
答:
首先计算文法的 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) 分析表如下表:
| a | b | d | e | # |
|---|
| S | →aD | | | | |
| D | →STe | →ε | →ε | →ε | →ε |
| T | | →bH | →H | | |
| H | | | →d | →ε | |
6. 判断下面文法是否为 LL(1) 文法,若是,请构造相应的 LL(1) 分析表。
S→aD,D→STe∣ε,T→bM,M→bH,H→M∣ε
答:
文法的 FIRST 集和 FOLLOW 集如下表。
| 非终结符 | FIRST 集 | FOLLOW 集 |
|---|
| S | {a} | {#,b} |
| D | {a,ε} | {#,b} |
| T | {b} | {e} |
| M | {b} | {e} |
| H | {b,ε} | {e} |
由于:
predict(D→STe)∩predict(D→ε)={a}∩{#,b}=∅
predict(H→M)∩predict(H→ε)={b}∩{e}=∅
所以该文法是 LL(1) 文法,LL(1) 分析表如下表:
| a | b | e | # |
|---|
| S | →aD | | | |
| D | →STe | →ε | | →ε |
| T | | →bM | | |
| M | | →bH | | |
| H | | →M | →ε | |
7. 某语言的拓广文法 G′ 为:
(0)S′(1)S(2)D(3)B→S→Db∣B→d∣ε→Ba∣ε
证明 G 不是 LR(0) 文法而是 SLR(1) 文法,请给出 SLR(1) 分析表。
答:
拓广文法 G′,增加产生式 S′→S。
在项目集 I0 中:有移进项目 D→⋅d,归约项目 D→⋅ 和 B→⋅。存在移进-归约和归约-归约冲突,所以 G 不是 LR(0) 文法。
图 7.1 Q7 的 LR(0) 项目集 I₀
若产生式排序为:
(0)S′(1)S(2)S(3)D(4)D(5)B(6)B→S→Db→B→d→ε→Ba→ε
G′ 的 LR(0) 项目集族及识别活前缀的 DFA 如下图:
图 7.2 Q7 的 LR(0) 项目集族及 DFA
由产生式知:
FOLLOW(S)={#}
FOLLOW(D)={b}
FOLLOW(B)={a,#}
在 I0 中:
FOLLOW(D)∩{d}={b}∩{d}=∅
FOLLOW(B)∩{d}={a,#}∩{d}=∅
FOLLOW(D)∩FOLLOW(B)={b}∩{a,#}=∅
在 I3 中:
FOLLOW(S)∩{a}={#}∩{a}=∅
所以在 I0、I3 中的移进-归约和归约-归约冲突可以由 FOLLOW 集解决,所以 G 是 SLR(1) 文法。
构造的 SLR(1) 分析表如下表:
| 状态 | b | d | a | # | S | D | B |
|---|
| 0 | r4 | S4 | r6 | r6 | 1 | 2 | 3 |
| 1 | | | | acc | | | |
| 2 | S5 | | | | | | |
| 3 | | S6 | r2 | | | | |
| 4 | r3 | | | | | | |
| 5 | | | r1 | | | | |
| 6 | | | r5 | r5 | | | |
8. 给出与正规式 R=(ab)∗(a∣b∗)ba 等价的 NFA。
答:
与正规式 R 等价的 NFA 如下图:
图 8.1 与正规式 $R=(ab)^*(a \mid b^*)ba$ 等价的 NFA
9. 给出与正规式 R=((ab)∗∣b)∗(a∣(ba)∗)a 等价的 NFA。
答:
与正规式 R 等价的 NFA 如下图:
图 9.1 与正规式 $R=((ab)^* \mid b)^*(a \mid (ba)^*)a$ 等价的 NFA
10. 给出与正规式 R=(aba)∗((ba)∗∣b)b 等价的 NFA。
答:
与正规式 R 等价的 NFA 如下图:
图 10.1 与正规式 $R=(aba)^*((ba)^* \mid b)b$ 等价的 NFA
11. 将下图的 NFA 确定化为 DFA。
图 11.1 Q11 的输入 NFA
答:
用子集法确定化如下表:
| I | Ia | Ib | 状态 |
|---|
| {X,1,2} | {1,2} | {1,2,3} | X |
| {1,2} | {1,2} | {1,2,3} | 1 |
| {1,2,3} | {1,2,Y} | {1,2,3} | 2 |
| {1,2,Y} | {1,2} | {1,2,3} | 3 |
确定化后如下图:
图 11.2 Q11 确定化后的 DFA
12. 将下图的 NFA 确定化为 DFA。
图 12.1 Q12 的输入 NFA
答:
用子集法确定化如下表:
| I | Ia | Ib | 状态 |
|---|
| {X,0,1,3} | {0,1,3} | {2,3,Y} | X |
| {0,1,3} | {0,1,3} | {2,3,Y} | 1 |
| {2,3,Y} | {1,3} | ∅ | 2 |
| {1,3} | {1,3} | {2,Y} | 3 |
| {2,Y} | ∅ | {Y} | 4 |
| {Y} | ∅ | ∅ | Y |
确定化后如下图:
图 12.2 Q12 确定化后的 DFA
13. 某语言的拓广文法 G′ 为:
(0)S′(1)T(2)B→T→aBd∣ε→Tb∣ε
证明 G 不是 LR(0) 文法而是 SLR(1) 文法,请给出 SLR(1) 分析表。
答:
拓广文法 G′,增加产生式 S′→T。
在项目集 I0 中:有移进项目 T→⋅aBd 和归约项目 T→⋅。存在移进-归约冲突,所以 G 不是 LR(0) 文法。
图 13.1 Q13 的 LR(0) 项目集 I₀
若产生式排序为:
(0)S′(1)T(2)T(3)B(4)B→T→aBd→ε→Tb→ε
G′ 的 LR(0) 项目集族及识别活前缀的 DFA 如下图所示:
图 13.2 Q13 的 LR(0) 项目集族及 DFA
由产生式知:
FOLLOW(T)={#,b}
FOLLOW(B)={d}
在 I0 中:
FOLLOW(T)∩{a}={#,b}∩{a}=∅
在 I2 中:
FOLLOW(B)∩{a}={d}∩{a}=∅
FOLLOW(T)∩{a}={#,b}∩{a}=∅
FOLLOW(B)∩FOLLOW(T)={d}∩{#,b}=∅
所以在 I0、I2 中的移进-归约和归约-归约冲突可以由 FOLLOW 集解决,所以 G 是 SLR(1) 文法。
构造的 SLR(1) 分析表如下表:
| 状态 | a | b | d | # | T | B |
|---|
| 0 | S2 | r2 | | r2 | 1 | |
| 1 | | | | acc | | |
| 2 | S2 | r2 | r4 | r2 | 4 | 3 |
| 3 | | | S5 | | | |
| 4 | | S6 | | | | |
| 5 | | r1 | | r1 | | |
| 6 | | | r3 | | | |
14. 某语言的文法 G 为:E→aTd∣ε,T→Eb∣a。证明 G 不是 LR(0) 文法而是 SLR(1) 文法,请给出该文法的 SLR(1) 分析表。
答:
拓广文法 G′,增加产生式 S′→E。
在项目集 I0 中:有移进项目 E→⋅aTd 和归约项目 E→⋅。存在移进-归约冲突,所以 G 不是 LR(0) 文法。
图 14.1 Q14 的 LR(0) 项目集 I₀
若产生式排序为:
(0)S′(1)E(2)E(3)T(4)T→E→aTd→ε→Eb→a
G′ 的 LR(0) 项目集族及识别活前缀的 DFA 如下图:
图 14.2 Q14 的 LR(0) 项目集族及 DFA
由产生式知:
FOLLOW(E)={#,b}
FOLLOW(T)={d}
在 I0、I2 中:
FOLLOW(E)∩{a}={#,b}∩{a}=∅
在 I5 中:
FOLLOW(E)∩{a}={#,b}∩{a}=∅
FOLLOW(T)∩{a}={d}∩{a}=∅
FOLLOW(T)∩FOLLOW(E)={d}∩{#,b}=∅
所以在 I0、I2、I5 中的移进-归约和归约-归约冲突可以由 FOLLOW 集解决,所以 G′ 是 SLR(1) 文法。
构造的 SLR(1) 分析表如下表:
| 状态 | a | b | d | # | E | T |
|---|
| 0 | S2 | r2 | | r2 | 1 | |
| 1 | | | | acc | | |
| 2 | S5 | r2 | | r2 | 4 | 3 |
| 3 | | | S6 | | | |
| 4 | | S7 | | | | |
| 5 | S5 | r2 | r4 | r2 | 4 | 3 |
| 6 | | r1 | | r1 | | |
| 7 | | | r3 | | | |
15. 给出文法 G[S] 的 LR(1) 项目集规范族中 I0 项目集的全体项目。
G[S]:S→BD∣D,B→aD∣b,D→B
I0:
[S′→⋅S,#]
[S→⋅BD,#]
[S→⋅D,#]
[D→⋅B,a/b/#]
[B→⋅aD,a/b/#]
[B→⋅b,a/b/#]
[D→B⋅,a/b/#]
答:
I0:
[S′→⋅S,#]
[S→⋅BD,#]
[S→⋅D,#]
[D→⋅B,a/b/#]
[B→⋅aD,a/b/#]
[B→⋅b,a/b/#]
[D→B⋅,a/b/#]
图 15.1 Q15 的 LR(1) 项目集 I₀
16. 给出文法 G[S] 的 LR(1) 项目集规范族中 I0 项目集的全体项目。
G[S]:S→D;D∣D,D→DB∣B,B→a∣b
I0:
[S′→⋅S,#]
[S→⋅D;D,#]
[S→⋅D,#]
[D→⋅DB,;/#]
[D→⋅B,;/#]
[B→⋅a,;/#]
[B→⋅b,;/#]
[D→B⋅,;/#]
[B→⋅a,a/b]
[B→⋅b,a/b]
答:
I0:
[S′→⋅S,#]
[S→⋅D;D,#]
[S→⋅D,#]
[D→⋅DB,;/#]
[D→⋅B,;/#]
[B→⋅a,;/#]
[B→⋅b,;/#]
[D→B⋅,;/#]
[B→⋅a,a/b]
[B→⋅b,a/b]
图 16.1 Q16 的 LR(1) 项目集 I₀
17. 给出文法 G[S] 的 LR(1) 项目集规范族中 I0 项目集的全体项目。
G[S]:S→S;V∣V,V→VaA∣A,A→b(S)∣ε
I0:
[S′→⋅S,#]
[S→⋅S;V,#]
[S→⋅V,#]
[S→⋅a,#]
[V→⋅VaA,#]
[V→⋅A,#]
[A→⋅b(S),#]
[A→⋅,#]
[V→A⋅,#]
[S→⋅S;V,;]
[S→⋅V,;]
[S→⋅a,;]
[V→⋅VaA,;]
[V→⋅A,;]
[A→⋅b(S),;]
[A→⋅,;]
[V→A⋅,;]
[V→⋅VaA,a]
[V→⋅A,a]
[A→⋅b(S),a]
[A→⋅,a]
[V→A⋅,a]
[A→⋅b(S),(]
[A→⋅,(]
答:
I0:
[S′→⋅S,#]
[S→⋅S;V,#]
[S→⋅V,#]
[S→⋅a,#]
[V→⋅VaA,#]
[V→⋅A,#]
[A→⋅b(S),#]
[A→⋅,#]
[V→A⋅,#]
[S→⋅S;V,;]
[S→⋅V,;]
[S→⋅a,;]
[V→⋅VaA,;]
[V→⋅A,;]
[A→⋅b(S),;]
[A→⋅,;]
[V→A⋅,;]
[V→⋅VaA,a]
[V→⋅A,a]
[A→⋅b(S),a]
[A→⋅,a]
[V→A⋅,a]
[A→⋅b(S),(]
[A→⋅,(]
图 17.1 Q17 的 LR(1) 项目集 I₀
18. 文法 G[M] 及其 LR 分析表如下,请给出对串 dbba# 的分析过程。
G[M]:(1) M→VbA(2) V→d(3) V→ε(4) A→a(5) A→Aba(6) A→ε
| 状态 | b | d | a | # | M | A | V |
|---|
| 0 | r3 | | S3 | | | 1 | 2 |
| 1 | | | | acc | | | |
| 2 | S4 | | | | | | |
| 3 | r2 | | | | | | |
| 4 | r6 | | S5 | r6 | | 6 | |
| 5 | r4 | | | r4 | | | |
| 6 | S7 | | | r1 | | | |
| 7 | | | S8 | | | | |
| 8 | r5 | | | r5 | | | |
答:
对串 dbba# 的分析过程如下表:
| 步骤 | 状态栈 | 文法符号栈 | 剩余输入符号 | 动作 |
|---|
| 1 | 0 | # | dbba# | 移进 |
| 2 | 0 3 | #d | bba# | 用V→d 归约 |
| 3 | 0 2 | #V | bba# | 移进 |
| 4 | 0 2 4 | #Vb | ba# | 用A→ε 归约 |
| 5 | 0 2 4 6 | #VbA | ba# | 移进 |
| 6 | 0 2 4 6 7 | #VbAb | a# | 移进 |
| 7 | 0 2 4 6 7 8 | #VbAba | # | 用A→Aba 归约 |
| 8 | 0 2 4 6 | #VbA | # | 用M→VbA 归约 |
| 9 | 0 1 | #M | # | 接受 |
19. 文法 G[S] 及其 LR 分析表如下,请给出对输入串 da;aoa# 的分析过程。
G[S]:(0) S′→S(1) S→dSoS(2) S→dS(3) S→S;S(4) S→a
| 状态 | d | a | ; | o | # | S |
|---|
| 0 | S2 | S3 | | S3 | | 1 |
| 1 | | | S4 | | acc | |
| 2 | S2 | | | S3 | | 5 |
| 3 | | r4 | r4 | | r4 | |
| 4 | S2 | | | S3 | | 6 |
| 5 | | S7 | S4 | | r2 | |
| 6 | | r3 | r3 | | r3 | |
| 7 | S2 | | | S3 | | 8 |
| 8 | | r1 | S4 | | r1 | |
答:
输入串 da;aoa# 的分析过程如下表:
| 步骤 | 状态栈 | 文法符号栈 | 剩余输入符号 | 动作 |
|---|
| 1 | 0 | # | da;aoa# | 移进 |
| 2 | 0 2 | #d | a;aoa# | 移进 |
| 3 | 0 2 3 | #da | ;aoa# | 用S→a 归约 |
| 4 | 0 2 5 | #dS | ;aoa# | 移进 |
| 5 | 0 2 5 4 | #dS; | aoa# | 移进 |
| 6 | 0 2 5 4 3 | #dS;a | oa# | 用S→a 归约 |
| 7 | 0 2 5 4 6 | #dS;S | oa# | 用S→S;S 归约 |
| 8 | 0 2 5 | #dS | oa# | 移进 |
| 9 | 0 2 5 7 | #dSo | a# | 移进 |
| 10 | 0 2 5 7 3 | #dSoa | # | 用S→a 归约 |
| 11 | 0 2 5 7 8 | #dSoS | # | 用S→dSoS 归约 |
| 12 | 0 1 | #S | # | 接受 |
20. 文法 G[M] 及其 LR 分析表如下,请给出对串 dada# 的分析过程。
G[M]:(1) S→VdB(2) V→e(3) V→ε(4) B→a(5) B→Bda(6) B→ε
| 状态 | d | e | a | # | S | B | V |
|---|
| 0 | r3 | S3 | | | 1 | | 2 |
| 1 | | | | acc | | | |
| 2 | S4 | | | | | | |
| 3 | r2 | | | | | | |
| 4 | r6 | | S5 | r6 | | 6 | |
| 5 | r4 | | | r4 | | | |
| 6 | S7 | | | r1 | | | |
| 7 | | | S8 | | | | |
| 8 | r5 | | | r5 | | | |
答:
对串 dada# 的分析过程如下表:
| 步骤 | 状态栈 | 文法符号栈 | 剩余输入符号 | 动作 |
|---|
| 1 | 0 | # | dada# | 用V→ε 归约 |
| 2 | 0 2 | #V | dada# | 移进 |
| 3 | 0 2 4 | #Vd | ada# | 移进 |
| 4 | 0 2 4 5 | #Vda | da# | 用B→a 归约 |
| 5 | 0 2 4 6 | #VdB | da# | 移进 |
| 6 | 0 2 4 6 7 | #VdBd | a# | 移进 |
| 7 | 0 2 4 6 7 8 | #VdBda | # | 用B→Bda 归约 |
| 8 | 0 2 4 6 | #VdB | # | 用S→VdB 归约 |
| 9 | 0 1 | #S | # | 接受 |
21. 文法 G[E] 为:E→E+T∣T,T→T∗F∣F,F→(E)∣i。试给出句型 (E+F)∗i 的短语,简单(直接)短语,句柄和最左素短语。
答:
短语有:(E+F)∗i,(E+F),E+F,F,i
简单(直接)短语有:F,i
句柄是:F
最左素短语是:E+F
22. 文法 G[S] 为:S→V,V→T∣ViT,T→F∣T+F,F→)V∗∣(。试给出句型 ViFi( 的短语,简单(直接)短语,句柄和最左素短语。
答:
短语有:ViFi(,ViF,F,(
简单(直接)短语有:F,(
句柄是:F
最左素短语是:ViF
23. 文法 G[S] 为:S→SdT∣T,T→T<G∣G,G→(S)∣a。试给出句型 (SdG)<a 的短语、简单(直接)短语、句柄和最左素短语。
答:
句型 (SdG)<a 的:
短语:(SdG)<a、(SdG)、SdG、G、a
简单(直接)短语:G、a
句柄:G
最左素短语:SdG
24. 按指定类型给出下列语言的文法。
(1) L1={anbmc∣n≥0,m>0},用正规文法。
(2) L2={a0n1nbdm∣n>0,m>0},用二型文法。
答:
(1) 描述 L1 语言的正规文法如下:
S→aS∣A,A→bA∣bB,B→c
(2) 描述 L2 语言的二型文法如下:
S→AB,A→aT,T→0T1∣01,B→bD,D→dD∣d
25. 下列语言或文法确切属于按乔姆斯基(Chomsky)分类的哪种类型,请填在( )内。
(1) L1={a0n1nbdm∣n>0,m>0}( )
(2) L2={anbncnbm∣n≥0,m>0}( )
(3) L3={anbmc∣n≥0,m>0}( )
(4) G[A]:A→aB∣ε,B→Ab∣a( )
(5) G[E]:E→E+E∣E∗E∣(E)∣i( )
答:
(1) L1={a0n1nbdm∣n>0,m>0}(2 型)
(2) L2={anbncnbm∣n≥0,m>0}(1 型)
(3) L3={anbmc∣n≥0,m>0}(3 型)
(4) G[A]:A→aB∣ε,B→Ab∣a(2 型)
(5) G[E]:E→E+E∣E∗E∣(E)∣i(2 型)
26. 按指定类型给出下列语言的文法。
(1) L1={canbdm∣n≥0,m>0},用正规文法。
(2) L2={0na1nbmcm∣n>0,m≥0},用二型文法。
答:
(1) 描述 L1 语言的正规文法如下:
S→cA,A→aA∣B,B→dD,D→bD∣ε
(2) 描述 L2 语言的二型文法如下:
S→AB,A→0A1∣0a1,B→bBc∣ε
27. 写出表达式 (a+b)/(a−b)−a(a+b∗c) 的三元式序列。
答:
⑴ (+,a,b)
⑵ (−,a,b)
⑶ (/,⑴,⑵)
⑷ (∗,b,c)
⑸ (+,a,⑷)
⑹ (−,⑶,⑸)
28. 写出表达式 (a+b∗c)/(a+b)−d 的逆波兰表示及三元式序列。
答:
逆波兰表示:abc∗+ab+/d−
三元式序列:
① (∗,b,c)
② (+,a,①)
③ (+,a,b)
④ (/,②,③)
⑤ (−,④,d)
29. 将下面的条件语句表示成四元式序列:
if a>b then x:=a+b*c else x:=b-a;
答:
(1) (j>,a,b,3)
(2) (j,_,_,7)
(3) (∗,b,c,T1)
(4) (+,a,T1,T2)
(5) (:=,T2,_,x)
(6) (j,_,_,9)
(7) (−,b,a,T3)
(8) (:=,T3,_,x)
(9) (j,_,_,10)
(10) (nop)
30. 翻译成四元式序列。
While a>0 ∨ b<0 do
Begin
X:=X+1;
if a>0 then a:=a-1
else b:=b+1
End;
答:
(1) (j>,a,0,5)
(2) (j<,b,0,5)
(3) (j,−,−,16)
(4) (+,X,1,T1)
(5) (:=,T1,−,X)
(6) (j>,a,0,8)
(7) (j,−,−,11)
(8) (−,a,1,T2)
(9) (:=,T2,−,a)
(10) (j,−,−,15)
(11) (+,b,1,T3)
(12) (:=,T3,−,b)
(13) (j,−,−,15)
(14) (+,X,1,T1)
(15) (j,−,−,1)
(16) (nop)
31. 已知文法 G(S):S→a∣∧∣(T),T→T,S∣S。写出句子 ((a,a),a) 的规范归约过程及每一步的句柄。
答:
| 句型 | 归约规则 | 句柄 |
|---|
| ((a,a),a) | S→a | a |
| ((S,a),a) | T→S | S |
| ((T,a),a) | S→a | a |
| ((T,S),a) | T→T,S | T,S |
| ((S),a) | T→S | S |
| ((T),a) | S→(T) | (T) |
| (S,a) | T→S | S |
| (T,a) | S→a | a |
| (T,S) | T→T,S | T,S |
| (T) | S→(T) | (T) |
| S | | |