编译原理 nfa的确定化用子集法确定化写通字闭包集合,求DFA最简化的题怎么做,有没有相关例题求解。

您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
编译原理(第二版)清华大学.docx 41页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
需要金币:100 &&
编译原理(第二版)清华大学
你可能关注的文档:
··········
··········
第1 章引论第1 题答案:编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语言,则此翻译程序称为编译程序。(2)源程序:源语言编写的程序称为源程序。(3)目标程序:目标语言书写的程序称为目标程序。(4)编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与目标机无关。通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符号表管理等工作。(5)后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,即目标代码生成,以及相关出错处理和符号表操作。(6)遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。第2 题答案:一个典型的编译程序通常包含 8 个组成部分,它们是词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和错误处理程序。其各部分的主要功能简述如下。词法分析程序:输人源程序,拼单词、检查单词和分析单词,输出单词的机内表达形式。语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。语义分析程序:进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表中。中间代码生成程序:按照语义规则,将语法分析程序分析出的语法单位转换成一定形式的中间语言代码,如三元式或四元式。中间代码优化程序:为了产生高质量的目标代码,对中间代码进行等价变换处理。目标代码生成程序:将优化后的中间代码程序转换成目标代码程序。表格管理程序:负责建立、填写和查找等一系列表格工作。表格的作用是记录源程序的各类信息和编译各阶段的进展情况,编译的每个阶段所需信息多数都从表格中读取,产生的中间结果都记录在相应的表格中。可以说整个编译过程就是造表、查表的工作过程。需要指出的是,这里的“表格管理程序”并不意味着它就是一个独立的表格管理模块,而是指编译程序具有的表格管理功能。错误处理程序:处理和校正源程序中存在的词法、语法和语义错误。当编译程序发现源程序中的错误时,错误处理程序负责报告出错的位置和错误性质等信息,同时对发现的错误进行适当的校正(修复),目的是使编译程序能够继续向下进行分析和处理。注意:如果问编译程序有哪些主要构成成分,只要回答六部分就可以。如果搞不清楚,就回答八部分。第3 题答案:翻译程序是指将用某种语言编写的程序转换成另一种语言形式的程序的程序,如编译程序和汇编程序等。编译程序是把用高级语言编写的源程序转换(加工)成与之等价的另一种用低级语言编写的目标程序的翻译程序。解释程序是解释、执行高级语言源程序的程序。解释方式一般分为两种:一种方式是,源程序功能的实现完全由解释程序承担和完成,即每读出源程序的一条语句的第一个单词,则依据这个单词把控制转移到实现这条语句功能的程序部分,该部分负责完成这条语句的功能的实现,完成后返回到解释程序的总控部分再读人下一条语句继续进行解释、执行,如此反复;另一种方式是,一边翻译一边执行,即每读出源程序的一条语句,解释程序就将其翻译成一段机器指令并执行之,然后再读人下一条语句继续进行解释、执行,如此反复。无论是哪种方式,其加工结果都是源程序的执行结果。目前很多解释程序采取上述两种方式的综合实现方案,即先把源程序翻译成较容易解释执行的某种中间代码程序,然后集中解释执行中间代码程序,最后得到运行结果。广义上讲,编译程序和解释程序都属于翻译程序,但它们的翻译方式不同,解释程序是边翻译(解释)边执行,不产生目标代码,输出源程序的运行结果。而编译程序只负责把源程序翻译成目标程序,输出与源程序等价的目标程序,而目标程序的执行任务由操作系统来完成,即只翻译不执行。第4 题答案:(1)语法分析(2)语义分析(3)语法分析(4)词法分析第 2 章 PL/0 编译程序的实现第 1 题答案:PL/0 语言允许过程嵌套定义和递归调用,它的编译程序在运行时采用了栈式动态存储管理。(数组CODE 存放的只读目标程序,它在运行时不改变。)运行时的数据区S 是由解释程序定义的一维整型数组,解释执行时对数据空间S 的管理遵循后进先出规则,当每个过程(包括主程序)被调用时,才分配数据空间,退出过程时,则所分配的数据空间被释放。应用动态链和静态链的方式分别解决递归调用和非局部变量的引用问题。第 2 题答案:程序执行到赋值语句 b∶=10 时运行栈的布局示意图为:第 3 题答案:题 2 中当程序编译到r 的过程体时的名字表table 的内容为:注意:q 和s 是并列的过程,所以q 定义的变量b 被覆盖。第 4 题答案:栈顶指针 T,最新活动记录基地址指针B,动态链指针DL,静态链指针SL 与返回地址RA 的用途说明如下:T:栈顶寄存器T 指出了当前栈
正在加载中,请稍后...当前位置: >>
编译原理复习题-给学生
《编译原理》复习题丨杨海振整理丨 一、单项选择题 1.构造编译程序应掌握 a. 源程序 c. 编译方法 2.编译程序绝大多数时间花在 a. 出错处理 c. 目标代码生成 3.DFA M(见图 1-1)接受的字集为 。D0 X 0 Y 1。D b. 目标语言 d. 以上三项都是 上。D b. 词法分析 d.
表格管理a. 以 0 开头的二进制数组成的集合 b. 以 0 结尾的二进制数组成的集合 c. 含奇数个 0 的二进制数组成的集合 d. 含偶数个 0 的二进制数组成的集合 4. -a-(b*c/(c-d)+(-b)*a)的逆波兰表示是 a. abc*cd-b@a*+/-@ c. a@bc*cd-/b@a*+5.在规范归约中,用 a. 直接短语 c. 最左素短语 6.若 B 为非终结符,则 A→α ? Bβ 为 a. 归约 c. 接受 7.中间代码生成时所依据的是 a. 语法规则 c. 语义规则 。C b. 词法规则 d. 等价变换规则图 1-1。(@代表后缀式中的求负运算符) C b. a@bc*cd-b@a*+/d. a@bc*/cd-b@a*+-来刻画可归约串。Bb. 句柄 d. 素短语 项目。D b. 移进 d. 待约8.有文法 G 及其语法制导翻译如下所示(语义规则中的*和+分别是常规意义下的算术运算符) : E→E E→T T→T # n T→ n(1) (1)∧ T {E.val = E .val * T.val} {E.val = T.val} {T.val = T .val + n.val } {T.val = n.val} 。 C d.541 / 44(1)(1)则分析句子 1 ∧ 2 ∧ 3 # 4 其值为 a. 10 b. 34 c. 14 《编译原理》复习题丨杨海振整理丨 9.如果文法 G 是无二义的,则它的任何句子α。Aa. 最左推导和最右推导对应的语法树必定相同 b. 最左推导和最右推导对应的语法树可能不同 c. 最左推导和最右推导必定相同 d. 可能存在两个不同的最左推导,但它们对应的语法树相同 10.下列动作中,不是自下而上分析动作的是: a. 移进 c. 接受 11.编译程序是对 。D b. 高级语言程序的解释执行 d. 高级语言的翻译 。C b. 单词在符号表中的位置 d. 单词自身值 。C b. 展开 d. 报错 。Ba. 汇编程序的翻译 c. 机器语言的执行 12.词法分析器的输出结果是 a. 单词的种别编码 c. 单词的种别编码和自身值 13.正规式 M1 和 M2 等价是指 a. M1 和 M2 的状态数相等 b. M1 和 M2 的有向边条数相等 c. M1 和 M2 所识别的语言集相等 d. M1 和 M2 状态数和有向边条数相等 14.在规范归约中,用 a. 直接短语 c. 最左素短语 15.若 a 为终结符,则 A→α ? aβ 为 a. 归约 c. 接受 16.语法分析时所依据的是 a. 语法规则 c. 语义规则 17.文法 G:S→xSx|y 所识别的语言是 a. xyx c. xnyxn (n≥0) 。A来刻画可归约串。B b. 句柄 d. 素短语 项目。B b. 移进 d. 待约 b. 词法规则 d. 等价变换规则 。C b. (xyx)* d. x*yx* 。 A18.如果文法 G 是无二义的,则它的任何句子α a. 最左推导和最右推导对应的语法树必定相同 b. 最左推导和最右推导对应的语法树可能不同 c. 最左推导和最右推导必定相同2 / 44 《编译原理》复习题丨杨海振整理丨 d. 可能存在两个不同的最左推导,但它们对应的语法树相同 19.下列动作中,不是自上而下分析动作的是: a. 匹配 c. 移进 20.词法分析器的输出结果是 a. 单词的种别编码 c. 单词的种别编码和自身值 21. -a-(b*c/(c-d)+(-b)*a)的逆波兰表示是 a. abc*cd-b@a*+/-@ c. a@bc*cd-/b@a*+22.在规范归约中,用 a. 直接短语 c. 最左素短语 23.若 B 为非终结符,则 A→α ? 为 a. 归约 c. 接受 来刻画可归约串。 。C b. 单词在符号表中的位置 d. 单词自身值 。(@代表后缀式中的求负运算符) C b. a@bc*cd-b@a*+/d. a@bc*/cd-b@a*+B b. 展开 d. 报错 。Cb. 句柄 d. 素短语 项目。A b. 移进 d. 待约 。 A b. (xyx)* d. x*yx*24.文法 G:S→xSx| xS|y 所识别的语言是 a. xmyxn(m≥n≥0) c. xnyxn(n≥0)25.有文法 G 及其语法制导翻译如下所示(语义规则中的*和+分别是常规意义下的算术运算符) : E→E E→T T→T # n T→ n(1) (1)∧ T {E.val = E .val * T.val} {E.val = T.val} {T.val = T .val + n.val } {T.val = n.val} 。 C b. 21 d. 24 。 A(1)(1)则分析句子 2 ∧ 3 # 4 其值为 a. 10 c. 14 26.间接三元式表示法的优点为 a. 采用间接码表,便于优化处理 b. 节省存储空间,不便于表的修改 c. 便于优化处理,节省存储空间3 / 44 《编译原理》复习题丨杨海振整理丨 d. 节省存储空间,不便于优化处理 27.下列动作中,不是自上而下分析动作的是: a. 匹配 c. 接受 b. 展开 d. 报错 。C28.同正规式(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________。 A.语言 B.句型 C.句子 C D.句柄 开始分析。 D.句柄31.在自上而下的语法分析中,应从 A.句型 B.句子C.文法开始符号32.一个文法 G,若________C____________,则称它是 LL(1)文法。 A.G 中不含左递归 C.G 的 LL(1)分析表中不含多重定义的条目 B.G 无二义性 D.G 中产生式不含左公因子33.在规范归约中,用______B______来刻画可归约串。 A.直接短语 B.句柄 C.素短语 D.短语34.若 a 为终结符,则 A→α ?aβ 为_______B______项目。 A.归约 B.移进 C.接受 C 。 D.等价变换规则 D.待约35.中间代码生成时所依据的是 A.词法规则 B.语法规则C.语义规则36.文法 G[S]及其语法制导翻译定义如下: 产生式 S’ → S S → (L) S→a L →L(1), S 语义动作 print(S.num) S.num = L.num +1 S.num = 0 L.num = L(1).num + S.num4 / 44 《编译原理》复习题丨杨海振整理丨 L →SL.num = S.num C 。 D.4若输入为(a,(a)),且采用自底向上的分析方法,则输出为 A.0 B .1 C .237.四元式之间的联系是通过 _______B____________实现的。 A.指示器 B.临时变量 C.符号表 D.程序变量38.将编译程序分成若干“遍” ,是为了( B ) 。 A.提高程序的执行效率 B.使程序的结构更为清晰C.利用有限的机器内存并提高机器的执行效率 D.利用有限的机器内存但降低了机器的执行效率 39.一个编译程序在编译时,大多数时间花在( D )上。 A.出错处理 C.目标代码生成 B.词法分析 D.表格管理及处理40. 下列符号串不可以由符号集 ?={a,b}上的正闭包运算产生的是: (A ) A. ε C. aa 41.词法分析器的输出是: ( C ) A.单词在符号表中的位置 C.单词的自身值和单词的种类码 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 及其语法制导翻译如下所示(语义规则中的*和+分别是常规意义下的算术运算符) : E→E(1) ∧ T {E.val = E(1).val * T.val} E→T { E.val = T.val} T→T(1)# n {T.val = T(1).val + n.val } T→ n {T.val = n.val}5 / 44B. a D. abB.单词的自身值 D.单词的种类码 《编译原理》复习题丨杨海振整理丨 则分析句子 2 ∧ 3 # 4 其值为( C ) 。 A. 10 B. 21 C. 14 D. 24 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 ) 。 A.0 B.1 C.2 D.4 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 → x xS | 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 )6 / 44 《编译原理》复习题丨杨海振整理丨 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 及其语法制导翻译如下所示(语义规则中的*和+分别是常规意义下的算术运算符) : E→E(1) ∧ T {E.val = E(1).val * T.val} E→T {E.val = T.val} T→T(1)# n {T.val = T(1).val + n.val } T→ n {T.val = n.val} 则分析句子 3 ∧ 3 # 4 其值为( B ) 。 A. 10 B. 21 C. 14 D. 24 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 ) 。 A.0 B.1 C.2 D.4 63. 在 SLR(1)的 Action 表中,如果某行中存在标记为“rj”的栏,则: ( B ) A. 该行必定填满“rj” B. 该行未必填满“rj” C. 其他行可能也有“rj” D. goto 表中也可能有“rj” 64. 一个( D )指明了在 LR 分析过程中的某个时刻所能看到产生式多大一部分。 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]: T→T*F|F7 / 44 《编译原理》复习题丨杨海振整理丨 F→F↑P|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.有一语法指导定义如下: S→bAb print “1” A→(B print “2” A→a print “3” B→aA) print “4” 若输入序列为 b(a(a(aa) ) )b,且采用自底向上的分析方法,则输出序列为( B A. B. C. D..同正规式(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-/ a bc* +-:= D. Xab+cd-/abc* +--:= 76.设有文法 G[T]: T→T*F|F F→F↑P|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.有一语法指导定义如下,其中+表示符号连接运算: S→B print B.vers B→a B.vers=a B→b B.vers=b B→Ba B.vers=a+B.vers B→Bb B.vers=b+B.vers)8 / 44 《编译原理》复习题丨杨海振整理丨 若输入序列为 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*)+ 共 4 页 第 1 页 81.词法分析器的加工对象是( C ) A.中间代码 B.单词 C.源程序 D.元程序 82.在自上而下的语法分析中,应从( C )开始分析。 A.句型 B.句子 C.文法开始符号 D.句柄 83.赋值语句 X:=-(a+b)/(c-d)-(a+b*c)的逆波兰表示是( C ) E. Xab+cd-/-bc*a+-:= F. Xab+/cd-bc*a+--:= G. Xab+-cd-/ a bc* +-:= H. Xab+cd-/abc* +--:= 84.编译程序不能检查、处理的错误是程序中的_______B_________。 A.静态语义检查 B.动态语义检查 C.语法错误)D.词法错误85.在 LR(0)的 ACTION 子表中,如果某一行中有标记为“rj”的栏,则_______C__________。 A.该行既有 rj 又有 Sj C.该行一定填满 rj B.其它行也有 rj D.该行未填满 rj86.同正规式(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______项目。 A.归约 B.移进 C.接受 D.待约89.一个文法 G,若________C____________,则称它是 LL(1)文法。 A.G 中不含左递归 C.G 的 LL(1)分析表中不含多重定义的条目 B.G 无二义性 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____________。9 / 44 《编译原理》复习题丨杨海振整理丨 A.短语B.句型C.句柄D.间接短语94.如果一个正规式所代表的集合是无穷的,则它必含有的运算是__________C___________。 A.连接运算“? ” B.或运算“|” C.闭包运算“* ” 95.同正规式 a*b*等价的文法是________C___________。 A.G1:S→aS|bS|ε B.G2:S→aSb|ε C.G3:S→ aS|Sb|ε D.G4: S→ abS|ε D.括号“ (”和“) ”96.由文法的开始符号出发经过若干步(包括 0 步)推导产生的文法符号序列称为______B________。 A.语言 B.句型 C.句子 D.句柄97.四元式之间的联系是通过 _______B____________实现的。 A.指示器 B.临时变量 C.符号表 D.程序变量98.编译程序的语法分析器必须输出的信息是________A____________。 A.语法错误信息 B.语法规则信息 C.语法分析过程 D.语句序列99.LL(1)分析法中“1”的含义是在输入串中查看一个输入符号,其目的是_______C___________。 A.确定最左推导 C.确定使用哪一个产生式进行展开 B.确定句柄 D.确定是否推导100.称正规式 R1 和 R2 等价是指__________C_______________。 A.R1 和 R2 都是定义在同一个字母表上的正规式 B.R1 和 R2 使用的运算符相同 C.R1 和 R2 代表同一个正规集 D.R1 和 R2 代表不同的正规集二、填空题 概述部分: 1.编译程序的开发常常采用自编译、 交叉编译 、 2.解释程序和编译程序的区别在于 是否生成目标程序 自展 和移植等技术实现。 。3.如果编译程序生成的目标程序是汇编语言程序,则源程序的执行分为 3 个阶段: 编译阶段 、 汇 编阶段 和 运行阶段 。 4.编译程序工作过程中,第一阶段输入是 源程序 ,最后阶段的输出为 目标程序 。5.编译过程通常可分为 5 个阶段 词法分析阶段 、 语法分析阶段 、 语义分析和中间代码生成阶段 、10 / 44 《编译原理》复习题丨杨海振整理丨 优化阶段和目标代码生成阶段。 6.如果编译阶段生成的目标程序是某特定计算机系统的机器代码程序,则源程序的执行分为两大阶段: 编译阶段 和 运行阶段 。 7.对编译程序而言,输入数据是 8.贯穿于编译程始终的工作有 源程序 符号表处理 ,输出结果是 和出错处理。 目标程序 。词法分析部分: 1.词法分析的工作是将源程序中的 字符串 变换成 单词符号流 的过程,所遵循的是语言的 构词 规则 。 2.若两个正规式所表示的 正规集 相同,则认为二者是等价的。 3.若两个正规式所表示的正规集相同,则认为二者是 4.正规式 R1 和 R2 等价是指_______表示相同的正规集 等价 的。 。5.词法分析器的输入是源程序字符串,输出结构是 二元式(单词种别, 单词自身的值) 。词法分析 所遵循的是语言的 构词 规则。 6.确定的有限自动机是一个五元组,包含的五个元分别是:状态集合、 字母表、初态、终态集、状态转 换函数集合 。 7. 有限自动机是更一般化的状态转换图, 它分为 确定的有限自动机 DFA 和 非确定的有限自动机 NFA 两种。 8.NFA 和 DFA 的区别主要有两点:其一是 NFA 可以有若干个初始状态,而 DFA 仅有一个初始状态 ; 其二是 NFA 的状态转换函数 f 不是单值函数,而是一个多值函数 。 语法分析部分: (基本概念、LL(1) 、LR(0) 、SLR(1) 、递归下降子程序) 1. 语法分析的方法通常分为两类: 自上而下分析方法 2.文法中的终结符集和非终结符集的交集是 空集 。 3.一个句型的最左直接短语称为该句型的___句柄________________。11 / 44和 自下而上分析方法。 《编译原理》复习题丨杨海振整理丨 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) ∩ FOLLOW(A) = ? 。 、 FIRST(α)∩FIRST(β) = ? ; (2) 假若 ? ? ? , 则有 FIRST(α)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 。12 / 44 《编译原理》复习题丨杨海振整理丨 19.设 G[S] 是一文法,如果符号串 x 是从识别符号推导出来的,即有 S ? x,则称 x 是文法 G[S]的____* 句型__,若 x 仅由终结符号组成,即 S ? x, x ? VT ,则称 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.逆波兰表示法表示表达式时无需使用括号。( √ )13 / 44 《编译原理》复习题丨杨海振整理丨 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)方法又称为预测分析方法。 ( √ × )√)× ) )14 / 44 《编译原理》复习题丨杨海振整理丨 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 Ab→bA C→aCA Ba→aB C→bCB Bb→bB AD→aD C→ε BD→bD D→ε Aa→bD 是(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 )15 / 44 《编译原理》复习题丨杨海振整理丨 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 5 6a X a 1a b 3 bb 4b aa Ya2.构造正规表达式((a|b)*|aa)*b 的 NFA。 解:16 / 44 《编译原理》复习题丨杨海振整理丨 3a X ? 1 ?a ? 2 b Y?a4b2.令文法 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 3.给出字母表Σ ={a,b}上的同时只有奇数个 a 和奇数个 b 的所有串的集合的正规文法; 解: G[S]:S→aA|bB A→aS|bC|b B→bS|aC|a C→bA|aB|ε 4.给定文法: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) (1) L→ L ,S L(1).depth = L. S.depth = L.depth L→S S.depth = L.depth5. 表达式 a*b-c-d$e$f-g-h*i 中,运算符的优先级由高到低依次为-、*、$,且均为右结合,请写出相应的后 缀式。 解: abcd- -*efgh- - i*$$ 6.判断文法 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, #}。17 / 44 《编译原理》复习题丨杨海振整理丨 由 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)文法。7.对于文法 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 );//T+(E+i ) 直接短语:P、i; 句柄:P; 8.已知文法 G[A]: A→aABl|a B→Bb|d 试给出与 G[A]等价的 LL(1)文法 G[A′]; 解:G[A′]:A→aA′ A′→ABl | ε B→dB′ B′→bB′| ε 9.将下面的语句翻译成四元式序列: 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: 10.将以下 DFA 最小化。 (8 分)2b X a 1a ? Y解:18 / 44 《编译原理》复习题丨杨海振整理丨 a 0 b 111.设 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,So,Z),由 f 的定义可知 f(x,a)、f(y,b)均为多值函数,因此 M 是一非确定 有限自动机。 先画出 NFA M 相应的状态图,如下图所示。a a b bXYb用子集法构造状态转换矩阵,如下表所示。I {x} {y} {x,y} Ia {x,y} ― {x,y} Ib {y} {x,y} {x,y}将转换矩阵中的所有子集重新命名,形成下表所示的状态转换矩阵,即得到f 状态 0 1 2 字符 a 2 ― 2 b 1 2 2M′=({0,1,2},{a,b},f,0,{1,2}), M′状态转换图如下图所示。a 0 b 1 b 2 a, b19 / 44 《编译原理》复习题丨杨海振整理丨 (注意:本题由于集合的命名和先后顺序不同,可能最终结果不同。 ) 12.试构造下述文法的 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→dI0:S→.A A→.aABl A→.a I1: S→A. a I2:A→a.ABl A A→a. A→.aABl A→.aI3: A→aA.Bl B→.Bb B→.d BdI4: B→d.aI5: A→aAB.l B→B.b b I7: B→Bb.lI6: A→aABl.First(A)={a}follow(A)={#,d} First(B)={d}follow(B)={l} SLR(1)分析表如下: a 0 1 2 3 4 5 6 7 S7 R1 R3 S2 R2 S4 R4 S6 R1 S2 ACC R2 3 5 b d l # A 1 B13.将下面的语句翻译成四元式序列: (7 分) if (x>y) m= 1; else m=x+y;20 / 44 《编译原理》复习题丨杨海振整理丨 解:1 (j>,x,y,3) 2 (j,_,_,5) 3 (=,1,_,m) 4 (j,_,_,7) 5 (+,x,y,T1) 6 (=, T1,_,m) 7:14. 试构造下述文法的 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)分析表 ( S L L’ S ? (L) L ? SL’ L’ ? ε ) a S?a L ? SL’ L’ ? ,SL’ , #15.判断文法 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 得:21 / 44 《编译原理》复习题丨杨海振整理丨 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)文法。 16.对于文法 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; 17.已知文法 G[S]: S→aSbS|bSaS|ε 试证明 G[S]是二义文法 证明: 该文法产生的语言是 a 的个数和 b 的个数相等的串的集合。该文法二义,例如句子 abab 有两种不 同的最左推导。 S ? aSbS ? abS ? abaSbS ? ababS ? abab S ? aSbS ? abSaSbS ? abaSbS ? ababS ? abab 18.将下面的语句翻译成四元式序列: 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: 19.构造正规表达式 a(aa)*bb(bb)*a 的最小化的确定有限自动机 M′。 解: 先画出正规式相应的 NFA M 状态图,如下图所示。2 5a X a 1a b 3 bb 4b a Y用子集法构造状态转换矩阵,如下表所示。22 / 44 《编译原理》复习题丨杨海振整理丨 I {x} {1} {2} {3} {4} {5} {Y}Ia {1} {2} {1} {Y} -Ib {3} {4} {5} {4} -将状态分为终态集{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 1 2 3 4 5 Ia 2 1 5 Ib _ 3 4 3 _ 1a a2b3b4a5b(注意:本题由于集合的命名和先后顺序不同,可能最终结果不同。 ) 20.试构造下述文法的 SLR(1)分析表。 G[A]: A→aABl|a B→Bb|d 解:拓广文法 (0)S→A (1)A→aABl (2)A→a (3)B→Bb (4)B→d23 / 44 《编译原理》复习题丨杨海振整理丨 I0:S→.A A→.aABl A→.aA aI1: S→A.I2:A→a.ABl A→a. A→.aABl A→.aAI3: A→aA. Bl B→.Bb B→.d BdI4: B→d.aI5: A→aAB.l B→B.b b I7: B→Bb.lI6: A→aABl.First(A)={a}follow(A)={#,d} First(B)={d}follow(B)={l} SLR(1)分析表如下:ACTION a 0 1 2 3 4 5 6 7 S7 R1 R3 21.画出编译程序的总体结构图,简述各部分的主要功能。 解:编译程序的总体框图如下所示: S2 R2 S4 R4 S6 R1 S2 ACC R2 b d l #GOTO A 1 3 5 B24 / 44 《编译原理》复习题丨杨海振整理丨 表词法分析器 单词符号 语法分析器 语法单位语义分析与中间代码 生成器出格错管四元式 优化段 四元式 目标代码生成器 目标代码处理理(1)词法分析器,又称扫描器,它接受输入的源程序,对源程序进行词法分析,识别出一个个单词符 号,其输出结果是二元式(单词种别,单词自身的值)流。 (2)语法分析器,对单词符号串进行语法分析(根据语法规则进行推导或归约) ,识别出程序中的各类 语法单位,最终判断输入串是否构成语法上正确的句子。 (3)语义分析及中间代码生成器,按照语义规则对语法分析器归约出(或推导出)的语法单位进行语 义分析并把它们翻译成一定形式的中间代码。编译程序可以根据不同的需要选择不同的中间代码形式,有 的编译程序甚至没有中间代码形式,而直接生成目标代码。 (4)优化器对中间代码进行优化处理。一般最初生成的中间代码执行效率都比较低,因此要做中间代 码的优化,其过程实际上是对中间代码进行等价替换,使程序在执行时能更快,并占用更小的空间。 (5)目标代码生成器,把中间代码翻译成目标程序。中间代码一般是一种与机器无关的表示形式,只 有把它再翻译成与机器硬件直接相关的机器能识别的语言,即目标程序,才能在机器上运行。 (6)表格管理模块保持一系列的表格,登记源程序的各类信息和编译各阶段的进展状况。编译程序各 个阶段所产生的中间结果都记录在表格中,所需要的信息也大多从表格中获取,整个编译过程都在不断和 表格打交道。 (7)出错处理程序对出现在源程序中的错误进行处理。如果源程序有错误,编译程序应设法发现错误, 把有关错误信息报告给用户。编译程序的各个阶段都有可能发现错误,出错处理程序要对发现的错误进行 处理、记录,并反映给用户。 22.对于文法 G(S): S → (L) | aS | a L → L, S | S (1) 画出句型(S, (a))的语法树。 (2) 写出上述句型的所有短语、直接短语和句柄。 解:25 / 44 《编译原理》复习题丨杨海振整理丨 (1) 句型(S, (a))的语法树如下图所示:S(L)L,SS(L)Sa(2) 从语法树中可以找到(3 分)短语:a; (a); S; S,(a); 直接短语: S 句柄: S(S, (a))23.构造一文法,使其描述的语言 L = {ω |ω ∈ (a, b)*,且 ω 中含有相同个数的 a 和 b}。 解: S→ ε| aA|bB A→ b| bS| aAA B→ a| aS| bBB 24.分别给出表达式 C(a*(b-c))+d 的逆波兰表示和四元式表示。 解: (1)逆波兰式: abc-*@d+ 其中使用@代表一目减运算 (2)四元式: ① (-, b, c, T1) ② (*, a, T1, T2) ③ (@, T2, _, T3) ④ (+, T3, d, T4) 25.把下列语句翻译为四元式序列: while (A & B) if (C & D) X=Y*Z else X=Y+Z26 / 44 《编译原理》复习题丨杨海振整理丨 解: (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) 26. 构造一个 DFA, 它接受Σ = {0, 1}上所有满足如下条件的字符串: 每个 1 后面都有 0 直接跟在右边。 解: (1)0*(0|10)*0* 或者 (0|10)* (2) ①NFA (2 分)0 X ε 0 ε 1 1 2 ②子集法确定化 I {X, 0, 1, 3, Y} {0, 1, 3, Y} {2} {1, 3, Y} 重新命名状态,即得: S 0 I0 {0, 1, 3, Y} {0, 1, 3, Y} {1, 3, Y} {1, 3, Y}0 ε 30 ε Y0I1 {2} {2} {2}127 / 44 《编译原理》复习题丨杨海振整理丨 1 2 3 4 ③ 最小化2 2 4 43 3 3首先分为终态集和非终态集 {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 如下图所示: 0 1 0 0 127.已知文法 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 集:28 / 44 《编译原理》复习题丨杨海振整理丨 FIRST(S) = {a, *} FIRST(S’) = {*, ε} FIRST(P) = {+} FIRST(P’) = {+, ε}FOLLOW(S) = {#} FOLLOW(S’) = {#} FOLLOW(P) = {*, #} FOLLOW(P’) = {*, #}构造该文法的预测分析表如下: (5 分) * S S’ P P’ P’→ε S→*aPS’ S’→ *aP P→+aP’ P’→P P’→ε + a S→aPS’ S’→ ε #28.已知文法 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:29 / 44 《编译原理》复习题丨杨海振整理丨 I4: S’→ aS?SI2: S→ a?S S→ ?aS S→ ?bS S→ ?a S→ a?aa I0: S’→ ?S S→ ?aS S→ ?bS S→ ?a b S I1: S’→ S?baI3: S→ b?S S→ ?aS S→ ?bS S→ ?a S’→ bS? SbI5:(2)在状态 I2 存在“移近-归约”冲突,因此该文法不是 LR(0)文法。 计算 S 的 FOLLOW 集合: FOLLOW(S)= {#} I2 中的冲突用 FOLLOW 集合可以解决,所以该文法是 SLR(1)文法。 构造 SLR(1)分析表如下: 状态 0 1 2 3 4 5 s2 s2 s3 s3 r1 r2 ACTION a s2 b s3 acc r3 4 5 # GOTO S 129.将下图所示的非确定有限自动机(NFA)变换成等价的确定有限自动机(DFA)。其中,X 为初态,Y 为终 态。30 / 44 《编译原理》复习题丨杨海振整理丨 b 2 b a b 3 ? a ? b 4 b a Ya a X 1?【解】 用子集法将 NFA 确定化,如图所示。I {X} {1} {3} {2,3,Y} {3,Y} {3,4} {2,3,4,Y} {3,4,Y}Ia {1} {2,3,Y} ― {2,3,Y} {2,3,Y] {3,4} {2,3,4,Y} {2,3,4,Y}Ib {3} {3,Y} {3,4} {2,3,4,Y} {3,4} {3,4,Y} {2,3,4,Y} {3,4,Y} 重新命名S 0 1 2 3 4 5 6 7a 1 3 ― 3 3 5 6 6b 2 4 5 6 5 7 6 7确定化的 DFA 如下图所示:a 3 a 4 b 2 b b 5 a b 7 a aa a 0 1 bb6bb30. 对正规式(a|b)*abb 构造其等价的 NFA。 【解】31 / 44 《编译原理》复习题丨杨海振整理丨 31. 下面的文法产生 0 和 1 的串,即二进制的正整数,请给出决定每个二进制数的值(十进制形式)的 语法制导定义。 【解】定义值属性为.val,翻译方案如下: B ? B1 0 { B.val = B1.val ? 2 } B ? B1 1 { B.val = B1.val ? 2 + 1 } B ? 1 { B.val = 1 } B ? 0 { B.val = 0 }32.把算术表达式?(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) 33.设有文法 G[S]: S→a|(T)|? T→T,S|S 试给出句子(a,a,a)的最左推导。 【解】(1) (a,a,a)的最左推导 S=&(T) =&(T,S) =&( T,S,S) =&( S,S,S) =&(a,S,S) =&(a,a,S) =&(a,a,a) 34.已知文法G: S → ( L | a L → S , L | ) 判断是不是 LL(1)文法,如果是请构造文法 G 的预测分析表,如果不是请说明理由。 【解】 1)求各非终结符的 FISRT 集和 FOLLOW 集: = { (, a ) FIRST(L) = { a }? FIRST(S) = { (, ), a } FOLLOW(S) = {, # } FOLLOW(L) = FOLLOW(S) ={ , # } FIRST(( L)∩{a}=Φ FIRST(S , L)∩{)}=Φ32 / 44 《编译原理》复习题丨杨海振整理丨 所以是 LL(1)文法 2)预测分析表: ( S L 35.文法 S ?Aa |bAc |d c |b d a A?d 构造识别活前缀的 DFA。请根据这个 DFA 来判断该文法是不是 SLR(1)文法并说明理由。 【解】 S’ ? S . S’ ? .S S I1 S ? .A a S ? .b A c A a S ? A .a S ?Aa . S ? .d c I I5 2 S ? .b d a A ? .d c S ? b A .c S ? bAc . A S ? b .A c b I0 I6 I9 S ? b .d a A ? .d d S ? b d .a I3 S?bda. a d A?d. I10 S ? d .c I7 A?d. c S?dc. I4 I8 S→ ( L L→ S , L a S→ a L→ S , L L → ) , } #Follow(S)={#} Follow(A)={a,c} I4 存在冲突且 Follow(A)∩{c}={ c} I7 存在冲突且 Follow(A)∩{a}={ a} 所以不是 SLR(1)文法 36. 将下图所示的确定有限自动机(DFA)最小化。其中,X 为初态,Y 为终态。a a X b 2 1 b a b 3 a Y b【解】 先划分为终态集{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,33 / 44 《编译原理》复习题丨杨海振整理丨 a 0 a b1 a 2b 3b37.请画出识别无符号十进制整数的状态转换图 【解】1-9 10-9 2 0?(其它)338.设有文法 G[S]: S→S*S|S+S|(S)|i 该文法是否为二义文法,并说明理由? 【解】该文法是二义文法,因为该文法存在句子 i*i+i,该句子有两棵不同的语法树如图所示。S S i(1)S S S i + S i S i S * S i(2)*+S i39.程序的文法如下: P → D D → D;D | id : T | 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 → D(1); S D.num = D(1).num + 1 例: id : T; S; S(从语法树分析入手) (注意:本例只是帮助学生理解题意,不是答案部分)34 / 44 《编译原理》复习题丨杨海振整理丨 PDproc ocid;D;Sproc ocid;D;Sid:T40.把下列语句翻译为四元式序列(四元式序号从 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) 41.构造下面文法的 LL(1)分析表。 G[D]: D ? TL T ? int | real L ? id R35 / 44 《编译原理》复习题丨杨海振整理丨 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 D T L R D ? TL T ? int real D ? TL T ? real L ? id R R ? , id R R ? ? id , #42. 给定文法 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 所示。图1【解】注意到状态 I1 存在“移进-归纳”冲突,计算 S 的 FOLLOW 集合: FOLLOW(S)={#} {a}∩{b}∩FOLLOW(R)=Φ 可以采用 SLR 冲突消解法,得到如下的 SLR 分析表。36 / 44 《编译原理》复习题丨杨海振整理丨 从分析表可以看出,表中没有冲突项,所以该文法是 SLR(1)文法。 表 1 SLR 分析表 ACTION 状态 0 1 2 3 4 5 43.给出表达式-a*b+b*c+d/e 的语法树和三元式序列。 答:语法树+GOTO b S2 S2 S2 acc r1 r2 r3 # S 3 4 5a S1 S1 S1三元式+ * * b c d b/①(-,a,-) ②(*,①,b) ③(*,b,c) ④(+,②,③) ⑤(/,d,e) ⑥(+,④,⑤)e-a44.证明下面文法 S→AaAb|BbBa A→εB→ε,是 LL(1)文法,但不是 SLR(1)文法。证明: (1)first(AaAb)={a} first(BbBb)={b} ,有 first(AaAb)∩first(BbBb)=Φ 所以根据 LL(1)文法的定义,该文法是 LL(1)文法。 (2 分) (2)为了构造识别活前缀的 DFA,初态集包含如下四个项目:S→.AaAb S→.BbBa A→. B→. 但该项目中有两个可归约项目:A→. B→.,产生归约-归约冲突,而 follow(A)={a,b},follow(B) ={a,b},有 follow(A)∩follow(B)≠Φ ,所以使用向前看一个终结符的方法不能解决此冲突,所以 该文法不是 SLR(1)文法。 (3 分)45.现有文法 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) ) 最右推导:37 / 44 《编译原理》复习题丨杨海振整理丨 S=〉 (T)=〉 (T,S)=〉 (T, (T) )=〉 (T , (T,S) )=〉 (T, (T,a) )=〉 (T, (S,a) )=〉 (T, (a, a) )=〉 (S, (a,a) )=〉 (a, (a,a) ) 句型的句柄是为加下划线的部分 46.将下图的 DFA 最小化。1 a 3 a b 2 a b b a 4ab b0答:初始划分:II={{0,1,2},{3,4}}(1 分) (1)考查{0,1,2},1 和 2 接受 a,b 后都转向相同的状态,且接受 b 后转向终态,而 0 接受 b 后转 向非终态 2,所以 0 与 1,2 可分,IInew={{0},{1,2},{3,4}}(1 分) (2)考查{3,4},接受 a,b 后都转向相同的状态,所以 3,4 不可分。IInew={{0},{1,2},{3,4}} (1 分) 将 1,2 合并用 1 代表,3,4 合并用 3 代表,最终的最小化 DFA 如下:a 0 b 1 b a b 347.设有如下文法:P→D D→D;D|id:T|proc id;D; T→real|integer 给出一个语法制导定义,打印该程序一共声明了多少个 id。 答: 文法 P→D D→D1;D2 D→id:T D→proc id;D1; T→real T→integer 48.识别文法 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 语法制导定义 Print(D.num) D.num=D1.num+D2.num D.num=1 D.num=D1.num+138 / 44 《编译原理》复习题丨杨海振整理丨 P I2 : aI1 :P'→P. I4 :P→aP.b P a b Q b Q b S a a c I9 :Q→bQ.c I10 :Q→bS.c S→S.a c I11 :Q→bSc. b I7 :P→aPb. I8 :Q→bQc. I5 :I0 :P'→.P P→.aPb P→.Q Q→.bQc Q→.bScQ I3 :P→Q.I6 : S→a.I12 : S→Sa.答:I2,I5 分别如下图所示:Follow(P)={b,$} 1 分 Follow(Q)={ b,c,$} 1 分 Follow(S)={c,a} 1 分 SLR(1)分析表: Action 表 a 0 1 2 3 4 5 6 7 8 9 10 11 12 R5 S12 R4 S6 R6 R1 R3 R3 S8 S11 R4 R5 S2 S5 R2 S7 S5 R6 S2 b S5 c $I2 :P→a.Pb P→.aPb P→.Q Q→.bQc Q→.bScI5 :Q→b.Qc Q→b.Sc Q→.bQc Q→.bSc S→.Sa S→.aGOTO 表 P 1 Acc 4 R2 9 R1 R3 10 3 Q 3 SR449.给出表达式(a+b)*(c+d/e)的语法树和四元式序列。39 / 44 《编译原理》复习题丨杨海振整理丨 答:语法树如下:四元式序列:* + + / a b c d50.构造文法 S→AaAb|BbBa A→εe①(+,a,b,T1) ②(/,d,e,T2) ③(+,c,T2,T3) ④(*,T1,T3,T4)B→ε,的预测分析表。答:first(S)={a,b},First(AaAb)={a},First(BbBa )={b} Follow(A)={a,b} Follow(B)={a,b} a S A B S→AaAb A→ε b S→BbBa A→ε $B→εB→ε51.写出 C 语言标识符集(字母或下划线开头的由字母、数字、下划线构成的串)的正规式。 解答:用 D 表示数字 0-9,用 L 表示字母 a-z|A-Z,则 C 语言标识符的正规式为: (L|_) (L|D|_)* 52.有一语法制导定义如下,其中+表示符号连接运算: S→B print B.vers B→a B.vers=a B→b B.vers=b B→Ba B.vers=a+B.vers B→Bb B.vers=b+B.vers 若输入序列为 abab,且采用自底向上的分析方法,则输出序列为(__________baba_________) 。 用分析树表示求解过程。S B B B B a b a b Print baba B.vers=baba B.vers=aba B.vers=ba B.vers=a53.假设第一个四元式的序号是 100,写出布尔表达式 a&b∨c∧d&e 的四元式序列。40 / 44 《编译原理》复习题丨杨海振整理丨 100 101 102 103 104 105 T:106 …… F:q …….(j&, a, b, 106) (j, _, _ , 102) (jnz, c, _ ,104) (j,_ ,_ ,q) (j&,d, e, 106) (j,_ , _ , q )54.设有如下文法: 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]的句子。 55.对于下列文法 G[S]: S→Sb|bA A→aA|a (1)构造一个与 G 等价的 LL(1)文法 G′。 (2)对于文法 G′,构造相应的 LL(1)分析表。 解: (1) (5 分)G′:S→bAS′ S′→b S′|ε A→aA′ A′→A|ε (2) (1 分)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 S S′ b S→bAS′ S′→b S′41 / 44# S′→ε 《编译原理》复习题丨杨海振整理丨 A A′A→aA′ A′→A A′→ε A′→ε56.构造下述文法的 SLR(1)分析表。 G[S]:S→(A) A→ABB|B B→b 解:拓广文法: (1 分) S′→S ( 0) S→(A) (1) A→ABB (2) A→B (3) B→b (4)识别活前缀的 DFA: (4 分)I0:S′→.S S→.(A) S I1:S′→S. ( ) I2:S→(.A) A→.ABB A→.B B→.b B I5: A→B. I4: B→b. A I3:S→(A.) A→A.BB B→.b b I6: S→(A). B I7:A→AB.B B→.b B I8:A→ABB.bFIRST 集和 follow 集: (1 分) First(S)={(,c} follow( S)={#} First(A)={b} follow(A)={b,)} First(B)={b} follow(B)={b,)} SLR(1)分析表: (4 分) ACTION ( 0 1 2 3 4 5 6 7 8 R2 S4 R242 / 44GOTO ) b # Acc S4 S6 R4 R3 S4 R4 R3 R1 8 3 5 7 S 1 A BS2 《编译原理》复习题丨杨海振整理丨 57.有一语法制导定义如下: S→bAb print “1” A→(B print “2” A→a print “3” B→aA) print “4” 若输入序列为 b(a(a(aa) ) )b,且采用自下而上的分析方法,则输出序列为(______) 。 58.写出赋值语句 X= -(a+b)/(c-d)-(a+b*c)的逆波兰表示。Xab+-cd-/abc*+-= 59.为文法 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 (1) (1) (1) L→L ,S L.num=if L .num&S.num then L .num else S.num L→S L.num= S.num每个式子 1 分。 60.设有文法 G[S]: S→aAcB|Bd A→AaB|c B→bScA|b 该文法句型 aAcbBdcc 的句柄是_______Bd_____________。 61.2.已知文法 G[S]如下:构造该文法的 LR(0)分析表。 G[S]:S→BB B→aB|b 解:拓广文法: (1 分) (0)S?→S (1)S→BB (2)B→aB (3)B→b 识别活前缀的 DFA 如下:43 / 44 《编译原理》复习题丨杨海振整理丨 I0: S??.S S?.BB B?.ab B?.b b a I3: a B?a.B B?.ab B?.b B I6: B?aB.SI1: S??S.B bI2: S?B.B B?.ab B?.b bBI5: S?BB.a bI4: B?b.LR(0)分析表如下: 状态 0 1 2 3 4 5 6 S3 S3 R3 R1 R2 S4 S4 R3 R1 R2 R3 R1 R2 Action a S3 b S4 acc 5 6 # Goto S 1 B 244 / 44}

我要回帖

更多关于 编译原理词法分析 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信