2024年2月15日发(作者:)
编译原理考试题及答案汇总
一、选择
1.将编译程序分成若干个“遍”是为了_B__。
A . 提高程序的执行效率
B.使程序的结构更加清晰
C. 利用有限的机器内存并提高机器的执行效率
D.利用有限的机器内存但降低了机器的执行效率
2.正规式 MI 和 M2 等价是指__C__。
A . MI 和 M2 的状态数相等 和 M2 的有向弧条数相等。
C .M1 和 M2 所识别的语言集相等 D. Ml 和 M2 状态数和有向弧条数相等
3.中间代码生成时所依据的是 _C_。
A.语法规则 B.词法规则 C.语义规则 D.等价变换规则
4.后缀式 ab+cd+/可用表达式__B_来表示。
A. a+b/c+d B.(a+b)/(c+d) C. a+b/(c+d) D. a+b+c/d
6. 一个编译程序中,不仅包含词法分析,_A____,中间代码生成,代码优化, 目标代码生成等五个部分。
A.( ) 语法分析 B.( )文法分析 C.( )语言分析 D.( )解释分析
7. 词法分析器用于识别__C___。
A.( ) 字符串 B.( )语句 C.( )单词 D.( )标识符
8. 语法分析器则可以发现源程序中的___D__。
A.( ) 语义错误 B.( ) 语法和语义错误
C.( ) 错误并校正 D.( ) 语法错误
9. 下面关于解释程序的描述正确的是__B___。
(1) 解释程序的特点是处理程序时不产生目标代码
(2) 解释程序适用于 COBOL 和 FORTRAN 语言
(3) 解释程序是为打开编译程序技术的僵局而开发的
A.( ) (1)(2) B.( ) (1) C.( ) (1)(2)(3) D.( ) (2)(3)
10. 解释程序处理语言时 , 大多数采用的是__B___方法。
A.( ) 源程序命令被逐个直接解释执行
B.( ) 先将源程序转化为中间代码 , 再解释执行
C.( ) 先将源程序解释转化为目标程序 , 再执行
D.( ) 以上方法都可以
11. 编译过程中 , 语法分析器的任务就是__B___。
(1) 分析单词是怎样构成的 (2) 分析单词串是如何构成语句和说明的
(3) 分析语句和说明是如何构成程序的 (4) 分析程序的结构
A.( ) (2)(3) B.( ) (2)(3)(4)C.( ) (1)(2)(3) D.( ) (1)(2)(3)(4)
12. 编译程序是一种___C__。
A. ( ) 汇编程序 B.( ) 翻译程序 C.( ) 解释程序 D.( ) 目标程序
13. 文法 G 所描述的语言是_C____的集合。
A. ( ) 文法 G 的字母表 V 中所有符号组成的符号串
B.( ) 文法 G 的字母表 V 的闭包 V* 中的所有符号串
C.( ) 由文法的开始符号推出的所有终极符串
D. ( ) 由文法的开始符号推出的所有符号串
14. 文法分为四种类型,即 0 型、1 型、2 型、3 型。其中 3 型文法是___B__。
A. ( ) 短语文法 B.( ) 正则文法 C.( ) 上下文有关文法 D.( ) 上下文无关文法
15. 一个上下文无关文法 G 包括四个组成部分,它们是:一组非终结符号,一 组终结符号,一个开始符号,以及一组 __D___。
A.( ) 句子 B.( ) 句型 C.( ) 单词 D.( ) 产生式
16. 通常一个编译程序中,不仅包含词法分析,语法分析,中间代码生成,代码优化,目 标代码生成等五个部分,还应包括_C____。
A.( ) 模拟执行器 B .( ) 解释器
C.( ) 表格处理和出错处理 D.( ) 符号执行器
17. 文法 G[N]= ( {b} , {N , B} , N , {N→b│ bB , B→bN} ),该文法所描述 的语言是C
A.( ) L(G[N])={bi│ i ≥ 0} B.( ) L(G[N])={b2i│ i≥ 0}
C.( ) L(G[N])={b2i+1│ i ≥ 0} D.( ) L(G[N])={b2i+1│ i ≥ 1}
18. 一个句型中的最左_B____称为该句型的句柄。
A.( ) 短语 B.( ) 简单短语 C.( ) 素短语 D.( ) 终结符号
19.设 G 是一个给定的文法,S 是文法的开始符号,如果 S->x( 其中 x∈V*), 则称 x 是
文法 G 的一个___B__。
A.( ) 候选式 B .( ) 句型 C.( ) 单词 D.( ) 产生式
20. 文法 G[E] :
E →T∣E + T
T →F∣T ﹡ F
F →a∣ ( E )
该文法句型 E + F ﹡ (E + T) 的简单短语是下列符号串中的_____。
① ( E + T ) ②E + T ③F ④ F ﹡ (E + T)
A.( ) ① 和 ③ B.( ) ② 和 ③ C.( ) ③ 和 ④ D.( ) ③
21. 若一个文法是递归的,则它所产生的语言的句子__A___。
A.( ) 是无穷多个 B .( ) 是有穷多个
C.( ) 是可枚举的 D.( ) 个数是常量
22. 词法分析器用于识别___C__。
A.( ) 句子 B .( ) 句型 C.( ) 单词 D.( ) 产生式
23. 在语法分析处理中, FIRST 集合、 FOLLOW 集合、 SELECT 集合均是_B____。
A . ( ) 非终极符集 B .( ) 终极符集 C.( ) 字母表 D . ( ) 状态集
24. 在自底向上的语法分析方法中,分析的关键是__A___。
A .( ) 寻找句柄 B .( ) 寻找句型 C .( ) 消除递归 D .( ) 选择候选式
25. 在 LR 分析法中,分析栈中存放的状态是识别规范句型___C__的 DFA 状态。
A .( ) 句柄 B .( ) 前缀 C .( ) 活前缀 D .( ) LR(0) 项目
26. 文法 G 产生的__D___的全体是该文法描述的语言。
A.( ) 句型 B.( ) 终结符集 C.( ) 非终结符集 D.( ) 句子
27. 若文法 G 定义的语言是无限集,则文法必然是 ___A__
A.( ) 递归的 B .( ) 前后文无关的
C .( ) 二义性的 D.( ) 无二义性的
28. 四种形式语言文法中,1 型文法又称为 __A___文法。
A.( ) 短语结构文法 B .( ) 前后文无关文法
C.( ) 前后文有关文法 D.( ) 正规文法
29. 一个文法所描述的语言是__A___。
A.( ) 唯一的 B.( ) 不唯一的
C.( ) 可能唯一,好可能不唯一 D.( ) 都不对
30. __B___和代码优化部分不是每个编译程序都必需的。
A.( ) 语法分析 B .( ) 中间代码生成
C.( ) 词法分析 D.( ) 目标代码生成
31._B____是两类程序语言处理程序。
A.( ) 高级语言程序和低级语言程序 B .( ) 解释程序和编译程序
C.( ) 编译程序和操作系统 D.( ) 系统程序和应用程序
32. 数组的内情向量中肯定不含有数组的_A____的信息。
A . ( ) 维数 B.( ) 类型 C.( ) 维上下界 D.( ) 各维的界差
33. 一个上下文无关文法 G 包括四个组成部分,它们是:一组非终结符号,一组终结符号,
一个开始符号,以及一组 __D___。
A.( ) 句子 B.( ) 句型
C.( ) 单词 D.( ) 产生式
34. 文法分为四种类型,即 0 型、1 型、2 型、3 型。其中 2 型文法是___D__。
A . ( ) 短语文法 B .( ) 正则文法
C.( ) 上下文有关文法 D.( ) 上下文无关文法
35.一个上下文无关文法 G 包括四个组成部分,它们是:一组非终结符号,一组终结符号,
一个开始符号,以及一组 __D___。
A.( ) 句子 B.( ) 句型 C.( ) 单词 D.( ) 产生式
36.__A___是一种典型的解释型语言。
A.( ) BASIC B.( ) C C.( ) FORTRAN D.( ) PASCAL
37.与编译系统相比,解释系统___D__。
A.( ) 比较简单 , 可移植性好 , 执行速度快
B.( ) 比较复杂 , 可移植性好 , 执行速度快
C .( ) 比较简单 , 可移植性差 , 执行速度慢
D.( ) 比较简单 , 可移植性好 , 执行速度慢
38.用高级语言编写的程序经编译后产生的程序叫__B___。
A.( ) 源程序 B .( ) 目标程序 C.( ) 连接程序 D.( ) 解释程序
39.编写一个计算机高级语言的源程序后 , 到正式上机运行之前,一般要经过___B__这几步:
(1) 编辑 (2) 编译 (3) 连接 (4) 运行
A . ( ) (1)(2)(3)(4) B.( ) (1)(2)(3) C.( ) (1)(3) D.( ) (1)(4)
40.把汇编语言程序翻译成机器可执行的目标程序的工作是由__A___完成的。
A.( ) 编译器 B.( ) 汇编器
C.( ) 解释器 D.( ) 预处理器
41.词法分析器的输出结果是__C___。
A.( ) 单词的种别编码 B.( ) 单词在符号表中的位置
C.( ) 单词的种别编码和自身值 D.( ) 单词自身值
42. 文法 G :S→xSx|y 所识别的语言是__C___。
A.( ) xyx B.( ) (xyx)* C .( ) xnyxn(n≥0) D.( ) x*yx*
43.如果文法 G 是无二义的,则它的任何句子α___A__。
A.( ) 最左推导和最右推导对应的语法树必定相同
B.( ) 最左推导和最右推导对应的语法树可能不同
C.( ) 最左推导和最右推导必定相同
D.( ) 可能存在两个不同的最左推导,但它们对应的语法树相同
44.构造编译程序应掌握___D___。
A.( ) 源程序 B .( ) 目标语言
C.( ) 编译方法 D.( ) 以上三项都是
45.四元式之间的联系是通过__B___实现的。
A.( ) 指示器 B .( ) 临时变量
C.( ) 符号表 D.( ) 程序变量
46.表达式( ┐ A ∨B)∧(C∨D)的逆波兰表示为___B__。
A . ( ) ┐ AB∨∧CD∨ B .( ) A ┐ B∨CD∨∧
C.( ) AB∨┐ CD∨∧ D.( ) A┐ B ∨∧CD∨
47. 优化可生成__D___的目标代码。
A.( ) 运行时间较短 B.( ) 占用存储空间较小
C.( ) 运行时间短但占用内存空间大 D.( ) 运行时间短且占用存储空间小
48.下列__C____优化方法不是针对循环优化进行的。
A . ( ) 强度削弱 B .( ) 删除归纳变量
C.( ) 删除多余运算 D.( ) 代码外提
49.编译程序使用__B___区别标识符的作用域。
A . ( ) 说明标识符的过程或函数名
B.( ) 说明标识符的过程或函数的静态层次
C.( ) 说明标识符的过程或函数的动态层次
D . ( ) 标识符的行号
50.编译程序绝大多数时间花在___D__ 上。
A.( ) 出错处理 B.( ) 词法分析 C.( ) 目标代码生成 D.( ) 表格管理
51. 编译程序是对__D___。
A.( ) 汇编程序的翻译 B .( ) 高级语言程序的解释执行
C.( ) 机器语言的执行 D.( ) 高级语言的翻译
52. 采用自上而下分析,必须__C___。
A.( ) 消除左递归 B .( ) 消除右递归
C.( ) 消除回溯 D.( ) 提取公共左因子
53.在规范归约中,用__B___来刻画可归约串。
A.( ) 直接短语 B.( ) 句柄
C.( ) 最左素短语 D.( ) 素短语
54. 若 a 为终结符,则 A ->α • aβ 为__B___项目。
A.( ) 归约 B .( ) 移进 C.( ) 接受 D.( ) 待约
55.间接三元式表示法的优点为__A___。
A.( ) 采用间接码表,便于优化处理 B .( ) 节省存储空间,不便于表的修改
C.( ) 便于优化处理,节省存储空间 D.( ) 节省存储空间,不便于优化处理
56.基本块内的优化为___B__。
A . ( ) 代码外提,删除归纳变量 B.( ) 删除多余运算,删除无用赋值
C.( ) 强度削弱,代码外提 D.( ) 循环展开,循环合并
57. 在目标代码生成阶段,符号表用___D__。
A.( ) 目标代码生成 B.( ) 语义检查 C.( ) 语法检查 D.( ) 地址分配
58.若项目集 Ik 含有 A ->α • ,则在状态 k 时,仅当面临的输入符号 a∈FOLLOW(A)时,才采取“A ->α • ”动作的一定是__D___。
A . ( ) LALR 文法 B.( ) LR(0)文法
C.( ) LR(1)文法 D.( ) SLR(1)文法
59.堆式动态分配申请和释放存储空间遵守__D___原则。
A . ( ) 先请先放 B.( ) 先请后放
C.( ) 后请先放 D . ( ) 任意
二、判断
1.计算机高级语言翻译成低级语言只有解释一种方式。(×)
2.在编译中进行语法检查的目的是为了发现程序中所有错误。(×)
3.甲机上的某编译程序在乙机上能直接使用的必要条件是甲机和乙机的操作系
统功能完全相同。 (√ )
4.正则文法其产生式为 A->a , A->Bb, A,B∈VN , a 、 b∈VT 。 (×)
5.每个文法都能改写为 LL(1) 文法。 (√)
6.递归下降法不允许任一非终极符是直接左递归的。 (√)
7.算符优先关系表不一定存在对应的优先函数。 (×)
8.自底而上语法分析方法的主要问题是候选式的选择。 (×)
9.LR 法是自顶向下语法分析方法。 (×)
10.简单优先文法允许任意两个产生式具有相同右部。 (×)
11.“ 用高级语言书写的源程序都必须通过编译, 产生目标代码后才能投入运行 ”这种说法。( × )
12
.若一个句型中出现了某产生式的右部,则此右部一定是该句型的句柄。( × )
13
.一个句型的句柄一定是文法某产生式的右部。 ( √)
14
.在程序中标识符的出现仅为使用性的。 ( × )
15
.仅考虑一个基本块,不能确定一个赋值是否真是无用的。 ( √ )
16
.削减运算强度破坏了临时变量在一基本块内仅被定义一次的特性。 ( √ )
17.在中间代码优化中循环上的优化主要有不变表达式外提和削减运算强度。 ( × )
18
.数组元素的地址计算与数组的存储方式有关。 ( × )
19
.编译程序与具体的机器有关,与具体的语言无关。 ( × )
20.递归下降分析法是自顶向上分析方法。( √ )
21.产生式是用于定义词法成分 的一种书写规则。 ( × )
22.LR 法是自顶向下语法分析方法。 (×)
23.在 SLR ( 1 )分析法的名称中,S 的含义是简单的。( √)
24
.综合属性是用于 “ 自上而下 ” 传递信息。( × )
25.符号表中的信息栏中登记了每个名字的 属性和特征等有关信息 ,如类型、种属、所占
单元大小、地址等等。 ( × )
26.程序语言的语言处理程序是一种应用软件。 ( × )
27.一个 LL(l)文法一定是无二义的。 ( × )
28
.正规文法产生的语言都可以用上下文无关文法来描述。 ( × )
29.一张转换图只包含有限个状态,其中有一个被认为是初态,最多只有一个终态。 ( √)
30
.目标代码生成时,应考虑如何充分利用计算机的寄存器的问题。 ( × )
31.逆波兰法表示的表达式亦称后缀式 。 ( √ )
32.如果一个文法存在某个句子对应两棵不同的语法树,则称这个文法是二义的。 ( √ )
33.数组元素的地址计算与数组的存储方式有关。( × )
34.对于数据空间的存贮分配, FORTRAN 采用动态贮存分配策略。 ( × )
35.编译程序是对高级语言程序的解释执行。( × )
36.一个有限状态自动机中,有且仅有一个唯一的终态。( × )
37.语法分析时必须先消除文法中的左递归 。 ( × )
38.LR 分析法在自左至右扫描输入串时就能发现错误,但不能准确地指出出错地点。 ( √ )
39.逆波兰表示法表示表达式时无须使用括号。 ( √ )
40.静态数组的存储空间可以在编译时确定。 ( × )
41.进行代码优化时应着重考虑循环的代码优化,这对提高目标代码的效率将起更大作用。( × )
42.两个正规集相等的必要条件是他们对应的正规式等价。( × )
43.一个语义子程序描述了一个文法所对应的翻译工作。 ( × )
44.r 和 s 分别是正规式,则有 L(r|s)=L(r)L(s)。( × )
45.确定的的自动机以及不确定的自动机都能正确地识别正集(√)
46
.分析作为单独的一遍来处理较好。 ( × )
47. LR 分析器的任务就是产生 LR 分析表。 (√ )
48.归约和规范推导是互逆的两个过程。 (√ )
49.同心集的合并有可能产生新的“移进”/ “归约” 冲突 (×)
分析技术无法适用二义文法。 ( × )
51树形表示和四元式不便于优化,而三元式和间接三元式则便于优化。 ( × )
52序中的表达式语句在语义翻译时不需要回填技术。 ( √)
三、填空
1.编译程序的工作过程一般可以划分为词法分析,语法分析,语义分析,中间代码
生成,代码优化等几个基本阶段,同时还会伴有__表格处理___和 ___出错处理__。
2.若源程序是用高级语言编写的,___目标程序__是机器语言程序或汇编程序,
则其翻译程序称为 ___编译程序__ 。
3.编译方式与解释方式的根本区别在于__是否生成目标代码___。
4.对编译程序而言,输入数据是___源程序__, 输出结果是__目标程序___。
5.产生式是用于定义___语法成分__的一种书写规则。
6.语法分析最常用的两类方法是___自上而下__和___自下而上__分析法
7.设
G
是一个给定的文法,S
是文法的开始符号,如果
S->x(
其中
x∈VT*),
则称
x
是文
法的一个__句子___。
8.递归下降法不允许任一非终极符是直接__左___递归的。
9.自顶向下的语法分析方法的基本思想是:从文法的__开始符号____开始,根据给定的输
入串并按照文法的产生式一步一步的向下进行__直接推导____,试图推导出文法的__句子
____,使之与给定的输入串___匹配___。
10.自底向上的语法分析方法的基本思想是:从输入串入手,利用文法的产生式一步一步地
向上进行___直接归约__ ,力求归约到文法的__开始符号___。
11常用的参数传递方式有___传地址__,传值和传名。
12.在使用高级语言编程时,首先可通过编译程序发现源程序的全部__语法___错误和语义的部分错误。
13___句柄_。
.一个句型中的最左简单短语称为该句型的
14.对于文法的每个产生式都配备了一组属性的计算规则,称为 __语义规则___ 。
15.一个典型的编译程序中,不仅包括__词法分析___、__语法分析___、__中间代码生成___、 代码优化、目标代码生成等五个部分,还应包括表格处理和出错处理。
16. 从功能上说,程序语言的语句大体可分为__执行性___语句和__说明性___语句两大类。
17. 产生式是用于定义__语法范畴___的一种书写规则。
18.语法分析是依据语言的__语法___规则进行的,中间代码产生是依据语言的__语义___规 进行的。
19.语法分析器的输入是__单词符号串___,其输出是__语法单位___
。
20.产生式是用于定义___语法成分__的一种书写规则。
21.逆波兰式 ab+c+ d*e- 所表达的表达式为__(a+b+c)*d-e___ 。
22.语法分析最常用的两类方法是__自上而下___和__自下而上___分析法。
23.计算机执行用高级语言编写的程序主要有两种途径:___解释__和__编译___。
24.扫描器是__词法分析器___,它接受输入的__源程序___,对源程序进行___词法分析__ 并识别出一个个单词符号,其输出结果是单词符号,供语法分析器使用。
25
.自上而下分析法采用___移进__、归约、错误处理、___接受__等四种操作。
26.一个 LR 分析器包括两部分:一个总控程序和___一张分析表_。
27.后缀式 abc-/所代表的表达式是___a/(b-c)__。
28.局部优化是在__基本块___范围内进行的一种优化。
29.词法分析基于__正则___文法进行,即识别的单词是该类文法的句子。
30.语法分析基于__上下文无关___文法进行,即识别的是该类文法的句子。语法分析的有效 工具是__语法树___。
31.分析句型时,应用算符优先分析技术时,每步被直接归约的是__最左素短语___,而应用
LR 分析技术时,每步被直接归约的是___句柄__。
32.语义分析阶段所生成的与源程序等价的中间表示形式可以有__逆波兰___、___三元式表示__与___四元式表示__等。
33.按 Chomsky 分类法,文法按照___规则定义的形式__进行分类。
34.一个文法能用有穷多个规则描述无穷的符号串集合(语言)是因为文法中存在有___递归
__定义的规则。
35.一个名字的属性包括__类型___和__作用域___。
四、综合题
1. 已知文法 G(E)
E →T|E+T
T→F|T *F
F →(E)|i
(1)给出句型(T *F+i)的最右推导;
(2)给出句型(T *F+i)的短语、简单短语、句柄、素短语、最左素短语。
解:
(1) 最右推导:E ->T->F->(E)->(E + T)->(E + F)->(E + i)->(T+i)->(T*F+i)
(2) 短语:(T*F+i) ,T*F+i ,T*F,i
简单短语:T*F,i
句柄:T*F
素短语:T*F,i
最左素短语:T*F
2. 构造正规式 1(0|1)*101 相应的 DFA 。
解:先构造 NFA :
确定化:
重新命名,令 AB 为 B、AC 为 C、ABY 为 D 得:
所以,可得 DFA 为:
3. 文法:
S->MH|a
H ->LSo| ε
K ->dML| ε
L ->eHf
M->K|bLM
判断 G 是否为 LL(1) 文法,如果是,构造 LL(1) 分析表。
解:各符号的 FIRST 集和 FOLLOW集为:
各产生式SELECT集为:
S->MH
S->a
H ->LSo
H ->ε
K ->dML
K ->ε
L ->eHf
M->K
M-> bLM
预测分析表
SELECT
{d,b,e,#,o}
{a}
{e}
{#,f,o}
{d}
{e,#,o}
{e}
{d,e,#,o}
{b}
由于预测分析表中无多重入口,所以可判定文法是 LL(1)的。
4. 对下面的文法 G :
E ->TE'
E'->+E| ε
T ->FT'
T' ->T| ε
F-> PF'
F'-> *F'| ε
P->(E)|a|b|^
(1)计算这个文法的每个非终结符的 FIRST 集和 FOLLOW 集。 (4 分)
(2) 证明这个方法是 LL(1) 的。(4 分)
(3) 构造它的预测分析表。(2 分)
解:(1)计算这个文法的每个非终结符的 FIRST 集和 FOLLOW集。
FIRST 集合有:
FIRST(E)=FIRST(T)=FIRST(F)=FIRST(P)={(,a,b,^};
FIRST(E')={+,ε }
FIRST(T)=FIRST(F)=FIRST(P)={(,a,b,^};
FIRST(T')=FIRST(T)U{ε}={(,a,b,^, ε};
FIRST(F)=FIRST(P)={(,a,b,^};
FIRST(F')=FIRST(P)={*, ε};
FIRST(P)={(,a,b,^};
FOLLOW 集合有:
FOLLOW(E)={),#};
FOLLOW(E')=FOLLOW(E)={),#}; FOLLOW(T)=FIRST(E')UFOLLOW(E)={+,),#};//不包含ε
FOLLOW(T')=FOLLOW(T)=FIRST(E')UFOLLOW(E)={+,),#};
FOLLOW(F)=FIRST(T')UFOLLOW(T)={(,a,b,^,+,),#};//不包含ε
FOLLOW(F')=FOLLOW(F)=FIRST(T')UFOLLOW(T)={(,a,b,^,+,),#};
FOLLOW(P)=FIRST(F')UFOLLOW(F)={*,(,a,b,^,+,),#};//不包含ε
(2)证明这个方法是 LL(1)的。
各产生式的 SELECT 集合有:
SELECT(E->TE')=FIRST(T)={(,a,b,^};
SELECT(E'->+E)={+};
SELECT(E'->ε)=FOLLOW(E/)={),#}
SELECT(T->FT')=FIRST(F)={(,a,b,^};
SELECT(T'->T)=FIRST(T)={(,a,b,^};
SELECT(T'->ε)=FOLLOW(T/)={+,),#};
SELECT(F->PF')=FIRST(P)={(,a,b,^};
SELECT(F'->*F')={*};
SELECT(F'->ε )=FOLLOW(F')={(,a,b,^,+,),#};
SELECT(P->(E))={(}
SELECT(P->a)={a}
SELECT(P->b)={b}
SELECT(P->^)={^}
可见,相同左部产生式的 SELECT 集的交集均为空,所以文法 G[E]是 LL(1)文法。
(3)构造它的预测分析表。 文法 G[E]的预测分析表如下:
5.已知文法 G[S] 为:
S->a|^|(T)
T-> T,S|S
(1) 计算 G[S] 的 FIRSTVT 和 LASTVT 。
(2) 构造 G[S] 的算符优先关系表并说明 G[S] 是否未算符优先文法。
(3) 给出输入串 (a,a)# 的算符优先分析过程。
解:(1)各符号的 FIRSTVT 和 LASTVT:
(2)算符优先关系表:
(3)句子(a,a)#分析过程如下:
6.已知文法为:
S->a|^|(T)
T->T,S|S
构造它的 LR(0)分析表。
解:加入非终结符 S' ,方法的增广文法为:
S'->S
S->a
S->^
S->(T)
T ->T,S
T ->S 下面构造它的 LR(0)项目集规范族为:
从上表可看出,不存在移进- 归约冲突以及归约归约冲突,该文法是 LR(0)文法。 从而有下面的 LR(0)分析表:
7.已知文法为:
A ->aAd|aAb| ε
判断该文法是否是 SLR(1) 文法,若是构造相应分析表,并对输入串 ab# 给出分析过程。 解:增加一个非终结符 S/后,产生原文法的增广文法有: S'->A A ->aAd|aAb|ε 下面构造它的 LR(0)项目集规范族为:
从上表可看出, 状态 I0 和 I2 存在移进- 归约冲突,该文法不是 LR(0)文法。对于 I0 来说有:
FOLLOW(A)∩{a}={b,d,#}∩{a}=Φ ,所以在 I0 状态下面临输入符号为 a 时移进,为 b,d,#时
归约,为其他时报错。对于 I2 来说有也有与 I0 完全相同的结论。这就是说,以上的移进 - 归约冲突是可以解决的,因此该文法是 SLR(1)文法。
其 SLR(1)分析表为:
对输入串 ab#给出分析过程为:
《编译原理》历年试题及答案
一. (每项选择2分,共20分)选择题
1.将编译程序分成若干个“遍”是为了_b__。
a.提高程序的执行效率
b.使程序的结构更加清晰
c.利用有限的机器内存并提高机器的执行效率
d.利用有限的机器内存但降低了机器的执行效率
2.构造编译程序应掌握__d__。
a.源程序 b.目标语言
c.编译方法 d.以上三项都是
3.变量应当c_。
a.持有左值 b.持有右值
c.既持有左值又持有右值 d.既不持有左值也不持有右值
4.编译程序绝大多数时间花在_d___上。
a.出错处理 b.词法分析
c.目标代码生成 d.管理表格
5.词法分析器的输出结果是_c___。
a.单词的种别编码 b.单词在符号表中的位置
c.单词的种别编码和自身值 d.单词自身值
6.正规式MI和M2等价是指__c__。
a. MI和M2的状态数相等 和M2的有向弧条数相等。
C.M1和M2所识别的语言集相等 d. Ml和M2状态数和有向弧条数相等
7.中间代码生成时所依据的是—c。
a.语法规则 b.词法规则 c.语义规则 d.等价变换规则
8.后缀式ab+cd+/可用表达式__b_来表示。
a. a+b/c+d b. (a+b)/(c+d) c. a+b/(c+d) d. a+b+c/d
9.程序所需的数据空间在程序运行前就可确定,称为____c__管理技术。
a.动态存储 b.栈式存储 c.静态存储 d.堆式存储
10.堆式动态分配申请和释放存储空间遵守___d_____原则。
a.先请先放 b.先请后放 c.后请先放 d.任意
二(每小题10分,共80分)简答题
1.画出编译程序的总体结构图,简述各部分的主要功能。
2. 已知文法G[E]:
E→ET+|T T→TF* | F F→F^ | a
试证:FF^^*是文法的句型,指出该句型的短语、简单短语和句柄.
3.为正规式(a|b) *a(a|b)构造一个确定的有限自动机。
4. 设文法G(S):
S→(L)|a S|a
L→L,S|S
(1) 消除左递归和回溯;
(2) 计算每个非终结符的FIRST和FOLLOW;
(3) 构造预测分析表。
5. 已知文法
A->aAd| aAb|ε
判断该文法是否SLR(1)文法,若是构造相应分析表,并对输入串ab#给出分析过程。
6. 构造算符文法G[H]的算符优先关系(含#)。
G[H]:H→H;M|M
M→d|aHb
7.已构造出文法G(S)
(1)S BB
(2)B aB
(3)B b
1)。给出DFA图
2).给出LR分析表
3).假定输入串为abaab,请给出LR分析过程(即状态,符号,输入串的变化过程)。
8. 将下面的语句翻译成四元式序列:
while A if A=1 then C:=C+l else while A≤ D do A:=A+2; 9. 对下面的流图, (1)求出流图中各结点N的必经结点集D(n), (2)求出流图中的回边, (3)求出流图中的循环。 参 考 答 案 一.单项选择题 1. 将编译程序分成若干个“遍”是为了使编译程序的结构更加清晰,故选b。 2. .构造编译程序应掌握源程序、目标语言及编译方法等三方面的知识,故选d。 3. 对编译而言,变量既持有左值又持有右值,故选c。 4. 编译程序打交道最多的就是各种表格,因此选d。 5. 词法分析器输出的结果是单词的种别编码和自身值,选C。 6. 正规式M1和M2所识别的语言集相等,故选C。 7. 选c。 8. 选b。 9. 选C 10. 堆式动态分配申请和释放存储空间不一定遵守先请后放和后请先放的原则,故选d 二.简答题 1. 【解答】 编译程序的总体结构图如图1.2所示。 词法分析器:输入源程序,进行词法分析,输出单词符号。 语法分析器:在词法分析的基础上,根据语言的语法规则(文法规则)把单词符号串分 解成各类语法单位,并判断输入串是否构成语法上正确的“程序”。 中间代码生成器:按照语义规则把语法分析器归约(或推导)出的语法单位翻译成一定 形式的中间代码,比如说四元式。 优化:对中间代码进行优化处理。 目标代码生成器:把中间代码翻译成目标语言程序。 表格管理模块保存一系列的表格,登记源程序的各类信息和编译各阶段的进展情况。编 译程序各阶段所产生的中间结果都记录在表格中,所需信息多数都需从表格中获取,整个编 译过程都在不断地和表格打交道。 出错处理程序对出现在源程序中的错误进行处理。此外,编译的各阶段都可能出现错误, 出错处理程序对发现的错误都及时进行处理。 2. 【解答】 该句型对应的语法树如下:该句型相对于E的短语有FF^^*;相对于T的短语有FF^^*,F; 相对于F的短语有F^;F^^;简单短语有F;F^;句柄为F. 3. 【解答】 最简DFA如图2.66所示。 4. 【解答】 (1) S→(L)|aS’ S’→S|ε L→SL’ L’→SL’|ε 评分细则:消除左递归2分,提公共因子2分。 (2) FIRST和FOLLOW FIRST)S)={(,a} FOLLOW(S)={#,,,)} FIRST(S’)={,a,ε} FOLLOW(S’)={#,,,)} FIRST(L)={(,a} FOLLOW(L)={ )} FIRST(L’)={,,ε} FOLLOW(L’〕={ )} 5. 【解答】 (1)拓广文法 (0)S->A (1) A->aAd (2)A-> aAb (3)A->ε (2)构造识别活前缀的DFA FOLLOW(A)={d,b,#} 对于状态I0:FOLLOW(A)∩{a}=Ф 对于状态I1:FOLLOW(A)∩{a}=Ф 因为,在DFA中无冲突的现象,所以该文法是SLR(1)文法。 (3)SLR(1)分析表 状态 ACTION GOTO a B d # A 0 S2 r3 r3 r3 1 1 acc 2 S2 r3 r3 r3 3 3 S5 S4 4 r1 r1 r1 5 r2 r2 r2 (4)串ab#的分析过程 步骤 状态栈 符号栈 当前字符 剩余字符串 动作 1 0 # a b# 移进 2 02 #a b # 归约A->ε 3 023 #aA b # 移进 4 0235 #aAb # 归约A-> aAb 5 01 #A # 接受 6. 【解答】 由M→d和M→a…得:FIRSTVT(M)={d,a}; 由H-H;…得:FIRSTVT(H)={;} 由H→M得:FIRSTVT(M) cFIRSTVT(H),即FIRSTVT(H)={;,d,a} 由M→d和M→…b得:LASTVT(M)={d,b}; 由H---,;m得:LASTVT(H)={;}; 由H→M得:LASTVT(M)cLASTVT(H),即LASTVT(H)={;,d,b} 对文法开始符H,有#H#存在,即有#=#,# # 对形如P→…ab…,或P→…aQb…,有a=b,由M→a|b得:a=b; 对形如P→…aR…,而b∈FIRSTVT(R),有a 有a>b。 由H→…;M得:; 由M→aH…得:a 由H→H;’’.得:LASTVT(H)>;,即:;>;,d>;,b>; 由M→…Hb得:LASTVT(H)>b,即:;>b,d>b,b>b 由此得到算符优先关系表,见表3.5。 7. 【解答】 (1)LR分析表如下: (2)分析表 状态 ACTION GOTO a b # S B 0 s3 s4 1 2 1 acc 2 S3 S4 5 3 s3 s4 6 4 r3 r3 5 R1 R1 r1 6 R2 R2 R2 (3) 句子abaab的分析过程 表:句子abaab的分析过程 步骤 状态 符号栈 输入串 所得产生式 0 #0 # abaad# 1 #03 #a baad# 2 #034 #ab aab# B→b 3 #036 #aB aab# B→aB 4 #02 #B aab# 5 #023 #Ba ab# 6 #0233 #Baa b# 7 #02334 #Baab # 8 #02336 #BaaB # 9 #0236 #BaB ad# 10 #025 #BB ad# 11 #01 #S d# 12 # # d# 13 识别成功 8. 【解答】 该语句的四元式序列如下(其中E1、E2和E3分别对应:A 系运算符优先级高): 100 (j<,A,C,102) 101(j,_,_,113) /*E1为F*/ 102 (j<,B,D,104) /*El为T*/ 103 (j,_,_,113) /*El为F*/ 104 (j=,A,1,106) /*Ez为T*/ 105 (j,_,_,108) /*EZ为F*/ 106 (+,C,1,C) /*C:=C+1*/ 107 (j,_,_,112) /*跳过else后的语句*/ 108 (j≤,A,D,110) /*E3为T*/ 109 (j,_,_,112) /*E3为F*/ 110 (+,A,2,A) /*A:=A+2*/ 111 (j,_,_,108) /*转回内层while语句开始处*/ 112(j,_,_,100) /*转回外层while语句开始处*/ 113 9. 【解答】 (1)流图中各结点N的必经结点集D(n), D(l)={1},D(2)={1,2},D(3)={1,2,3},D(4)={1,2,3,4},D(5)={1,2,5}, D(6)={1,2,5,6} (2)求出流图中的回边, 5->2,4->3 (3)求出流图中的循环: 回边5->2对应的循环:2、5、3、4; 回边4->3对应的循环:3、4 《编译原理》模拟试题一 一、是非题(请在括号内,正确的划√,错误的划×)(每个2分,共20分) 1.计算机高级语言翻译成低级语言只有解释一种方式。(×) 2.在编译中进行语法检查的目的是为了发现程序中所有错误。(×) 3.甲机上的某编译程序在乙机上能直接使用的必要条件是甲机和乙机的操作系 统功能完全相同。 (√ ) 4.正则文法其产生式为 A->a , A->Bb, A,B∈VN , a 、 b∈VT 。 (×) 5.每个文法都能改写为 LL(1) 文法。 (√) 6.递归下降法允许任一非终极符是直接左递归的。 (√) 7.算符优先关系表不一定存在对应的优先函数。 (×) 8.自底而上语法分析方法的主要问题是候选式的选择。 (×) 9.LR 法是自顶向下语法分析方法。 (×) 10.简单优先文法允许任意两个产生式具有相同右部。 (×) 二、选择题(请在前括号内选择最确切的一项作为答案划一个勾,多划按错论)(每 个4分,共40分) 1. 一个编译程序中,不仅包含词法分析,_____,中间代码生成,代码优化, 目标代码生成等五个部分。 A.( ) 语法分析 B.( )文法分析 C.( )语言分析 D.( )解释分析 2. 词法分析器用于识别_____。 A.( ) 字符串B.( )语句C.( )单词 D.( )标识符 3. 语法分析器则可以发现源程序中的_____。 A.( ) 语义错误 B.( ) 语法和语义错误 C.( ) 错误并校正 D.( ) 语法错误 4. 下面关于解释程序的描述正确的是_____。 (1) 解释程序的特点是处理程序时不产生目标代码 (2) 解释程序适用于 COBOL 和 FORTRAN 语言 (3) 解释程序是为打开编译程序技术的僵局而开发的 A.( ) (1)(2) B.( ) (1) C.( ) (1)(2)(3) D.( ) (2)(3) 5. 解释程序处理语言时 , 大多数采用的是_____方法。 A.( ) 源程序命令被逐个直接解释执行 B.( ) 先将源程序转化为中间代码 , 再解释执行 C.( ) 先将源程序解释转化为目标程序 , 再执行 D.( ) 以上方法都可以 6. 编译过程中 , 语法分析器的任务就是_____。 (1) 分析单词是怎样构成的 (2) 分析单词串是如何构成语句和说明的 (3) 分析语句和说明是如何构成程序的 (4) 分析程序的结构 A.( ) (2)(3) B.( ) (2)(3)(4)C.( ) (1)(2)(3) D.( ) (1)(2)(3)(4) 7. 编译程序是一种_____。 A. ( ) 汇编程序 B.( ) 翻译程序C.( ) 解释程序 D.( ) 目标程序 8. 文法 G 所描述的语言是_____的集合。 A. ( ) 文法 G 的字母表 V 中所有符号组成的符号串 B.( ) 文法 G 的字母表 V 的闭包 V* 中的所有符号串 C.( ) 由文法的开始符号推出的所有终极符串 D. ( ) 由文法的开始符号推出的所有符号串 9. 文法分为四种类型,即0型、1型、2型、3型。其中3型文法是_____。 A. ( ) 短语文法 B.( ) 正则文法C.( ) 上下文有关文法 D.( ) 上下文 无关文法 10. 一个上下文无关文法 G 包括四个组成部分,它们是:一组非终结符号,一 组终结符号,一个开始符号,以及一组 _____。 A.( ) 句子 B.( ) 句型C.( ) 单词 D.( ) 产生式 三、填空题(每空1分,共10分) 1.编译程序的工作过程一般可以划分为词法分析,语法分析,语义分析,中间代码 生成,代码优化等几个基本阶段,同时还会伴有__表格处理___和 ___出错处理__。 2.若源程序是用高级语言编写的,___目标程序__是机器语言程序或汇编程序, 则其翻译程序称为 ___编译程序__ 。 3.编译方式与解释方式的根本区别在于__是否生成目标代码___。 4.对编译程序而言,输入数据是___源程序__, 输出结果是__目标程序___。 5.产生式是用于定义___语法成分__的一种书写规则。 6.语法分析最常用的两类方法是___自上而下__和___自下而上__分析法。 四、简答题(20分) 1. 什么是句子? 什么是语言 ? 答:(1)设G是一个给定的文法,S是文法的开始符号,如果S x(其中x∈VT*),则称x是文 法的一个句子。 (2)设G[S]是给定文法,则由文法G所定义的语言L(G)可描述为: L(G)={x│S x,x∈VT*} 。 2. 写一文法,使其语言是偶正整数的集合,要求: (1)允许0打头; (2) 不允许0打头。 解:(1)G[S]=({S,P,D,N},{0,1,2,…,9},P,S) P: S->PD|D P->NP|N D->0|2|4|6|8 N->0|1|2|3|4|5|6|7|8|9 (2)G[S]=({S,P,R,D,N,Q },{0,1,2,…,9},P,S) P: S->PD|P0|D P->NR|N R->QR|Q D->2|4|6|8 N->1|2|3|4|5|6|7|8|9 Q->0|1|2|3|4|5|6|7|8|9 3. 已知文法 G[E] 为: E→T|E+T|E-T T→F|T*F|T/F F→ ( E ) |i ① 该文法的开始符号(识别符号)是什么? ② 请给出该文法的终结符号集合 VT 和非终结符号集合 VN 。 ③ 找出句型 T+T*F+i 的所有短语、简单短语和句柄。 解:① 该文法的开始符号(识别符号)是E。 ②该文法的终结符号集合VT={+、-、*、/、(、)、i}。 非终结符号集合VN={E、T、F}。 ③句型T+T*F+I的短语为i、T*F、第一个T、T+T*F+i; 简单短语为i、T*F、第一个T;句柄 为第一个T。 4. 构造正规式相应的 NFA : 1(0|1)*101 解1(0|1)*101对应的NFA为 5. 写出表达式(a+b*c)/(a+b)-d的逆波兰表示和三元式序列。 逆波兰表示: abc*+ab+/d- 三元式序列: ① (*,b,c) ② (+,a,①) ③ (+, a,b) ④ (/,②,③) ⑤ (-,④,d) 五.计算题(10分) 构造下述文法 G[S] 的自动机: S->A0 A->A0|S1|0 该自动机是确定的吗?若不确定,则对它确定化。 解:由于该文法的产生式S->A0,A->A0|S1中没有字符集VT的输入,所以不是确定的自 动机。 要将其他确定化,必须先用代入法得到它对应的正规式。把S?A0代入产生式A?S1 有:A=A0|A01|0=A(0|01)|0=0(0|01)*。 代入S->A0有该文法的正规式:0(0|01)*0,所以,改 写该文法为确定的自动机为: 由于状态A有3次输入0的重复输入,所以上图只是NFA,下面将它确定化: 下表由子集法将NFA转换为 DFA: 由上表可知DFA为: 《编译原理》模拟试题二 一、是非题(请在括号内,正确的划√,错误的划×)(每个2分,共20分) 1.“ 用高级语言书写的源程序都必须通过编译,产生目标代码后才能投入运行 ”这种说法。 (× ) 2.若一个句型中出现了某产生式的右部,则此右部一定是该句型的句柄。(× ) 3.一个句型的句柄一定是文法某产生式的右部。 (√) 4.在程序中标识符的出现仅为使用性的。 (× ) 5.仅考虑一个基本块,不能确定一个赋值是否真是无用的。 (√ ) 6.削减运算强度破坏了临时变量在一基本块内仅被定义一次的特性。 (√ ) 7.在中间代码优化中循环上的优化主要有不变表达式外提和削减运算强度。 (× ) 8.算符优先关系表不一定存在对应的优先函数。 (×) 9.数组元素的地址计算与数组的存储方式有关。 (×) 10.编译程序与具体的机器有关,与具体的语言无关。 (× ) 二、选择题(请在前括号内选择最确切的一项作为答案划一个勾,多划按错论)(每个4分,共 40分) 1. 通常一个编译程序中,不仅包含词法分析,语法分析,中间代码生成,代码优化,目 标代码生成等五个部分,还应包括_____。 A.( ) 模拟执行器 B.( ) 解释器 C.( ) 表格处理和出错处理 D.( ) 符号执行器 2. 文法 G[N]= ( {b} , {N , B} , N , {N→b│bB , B→bN} ),该文法所描述 的语言是 A.( ) L(G[N])={bi│i≥0} B.( ) L(G[N])={b2i│i≥0} C.( ) L(G[N])={b2i+1│i≥0} D.( ) L(G[N])={b2i+1│i≥1} 3. 一个句型中的最左_____称为该句型的句柄。 A.( ) 短语 B.( ) 简单短语 C.( ) 素短语 D.( ) 终结符号 4. 设 G 是一个给定的文法, S 是文法的开始符号,如果 S->x( 其中 x∈V*), 则称 x 是 文法 G 的一个_____。 A.( ) 候选式 B.( ) 句型 C.( ) 单词 D.( ) 产生式 5. 文法 G[E] : E→T∣E + T T→F∣T ﹡ F F→a∣ ( E ) 该文法句型 E + F ﹡ (E + T) 的简单短语是下列符号串中的_____。 ① ( E + T ) ②E + T ③F ④ F ﹡ (E + T) A.( ) ① 和 ③ B.( ) ② 和 ③ C.( ) ③ 和 ④ D.( ) ③ 6. 若一个文法是递归的,则它所产生的语言的句子_____。 A.( ) 是无穷多个 B.( ) 是有穷多个 C.( ) 是可枚举的 D.( ) 个数是常量 7. 词法分析器用于识别_____。 A.( ) 句子 B.( ) 句型 C.( ) 单词 D.( ) 产生式 8. 在语法分析处理中, FIRST 集合、 FOLLOW 集合、 SELECT 集合均是_____。 A. ( ) 非终极符集 B.( ) 终极符集 C.( ) 字母表 D. ( ) 状态集 9. 在自底向上的语法分析方法中,分析的关键是_____。 A.( ) 寻找句柄 B.( ) 寻找句型 C.( ) 消除递归 D.( ) 选择候选式 10. 在 LR 分析法中,分析栈中存放的状态是识别规范句型_____的 DFA 状态。 A.( )句柄 B.( ) 前缀 C.( )活前缀 D.( ) LR(0) 项目 三、填空题(每空1分,共10分) 1.设G是一个给定的文法,S是文法的开始符号,如果S->x( 其中 x∈VT*), 则称 x是文 法的一个__句子___。 2.递归下降法不允许任一非终极符是直接__左___递归的。 3.自顶向下的语法分析方法的基本思想是:从文法的__开始符号____开始,根据给定的输 入串并按照文法的产生式一步一步的向下进行__直接推导____,试图推导出文法的__句子 ____,使之与给定的输入串___匹配___。 4.自底向上的语法分析方法的基本思想是:从输入串入手,利用文法的产生式一步一步地 向上进行___直接归约__ ,力求归约到文法的__开始符号___。 5.常用的参数传递方式有___传地址__,传值和传名。 6.在使用高级语言编程时,首先可通过编译程序发现源程序的全部__语法___错误和语义部 分错误。 四、简答题(20分) 1. 已知文法 G[S] 为: S→dAB A→aA|a B→Bb|ε G[S] 产生的语言是什么? 答:G[S]产生的语言是L(G[S])={danbm│n≥1,m≥0}。 2. 简述 DFA 与 NFA 有何区别 ? 答:DFA与NFA的区别表现为两个方面:一是NFA可以若干个开始状态,而DFA仅只一个 开始状态。 另一方面,DFA的映象M是从K×Σ到K,而NFA的映象M是从K×Σ到K的 子集, 即映象M将产生一个状态集合(可能为空集),而不是单个状态。 3. 构造正规式相应的 DFA : 1(1010 * | 1(010) * 1) * 0。 解:1(1010 * | 1(010) * 1) * 0对应的NFA为: 4. 已知文法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→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 5. 何谓优化?按所涉及的程序范围可分为哪几级优化? 1)优化:对程序进行各种等价变换,使得从变换后的程序出发,能产生更有效的目标代码。 (2) 三种级别:局部优化、循环优化、全局优化。 五.计算题(10分) 对下面的文法 G : E->TE' E'->+E| ε T->FT' T' ->T| ε F-> PF' F'-> *F'| ε P->(E)|a|b|^ (1)计算这个文法的每个非终结符的 FIRST 集和 FOLLOW 集。 (4分) (2) 证明这个方法是 LL(1) 的。(4分) (3) 构造它的预测分析表。(2分) 解:(1)计算这个文法的每个非终结符的FIRST集和FOLLOW集。 FIRST集合有: FIRST(E)=FIRST(T)=FIRST(F)=FIRST(P)={(,a,b,^}; FIRST(E')={+,ε} FIRST(T)=FIRST(F)=FIRST(P)={(,a,b,^}; FIRST(T')=FIRST(T)∪{ε}={(,a,b,^,ε}; FIRST(F)=FIRST(P)={(,a,b,^}; FIRST(F')=FIRST(P)={*,ε}; FIRST(P)={(,a,b,^}; FOLLOW集合有: FOLLOW(E)={),#}; FOLLOW(E')=FOLLOW(E)={),#}; FOLLOW(T)=FIRST(E')∪FOLLOW(E)={+,),#};//不包含ε FOLLOW(T')=FOLLOW(T)=FIRST(E')∪FOLLOW(E)={+,),#}; FOLLOW(F)=FIRST(T')∪FOLLOW(T)={(,a,b,^,+,),#};//不包含ε FOLLOW(F')=FOLLOW(F)=FIRST(T')∪FOLLOW(T)={(,a,b,^,+,),#}; FOLLOW(P)=FIRST(F')∪FOLLOW(F)={*,(,a,b,^,+,),#};//不包含ε (2)证明这个方法是LL(1)的。 各产生式的SELECT集合有: SELECT(E->TE')=FIRST(T)={(,a,b,^}; SELECT(E'->+E)={+}; SELECT(E'->ε)=FOLLOW(E/)={),#} SELECT(T->FT')=FIRST(F)={(,a,b,^}; SELECT(T'->T)=FIRST(T)={(,a,b,^}; SELECT(T'->ε)=FOLLOW(T/)={+,),#}; SELECT(F->PF')=FIRST(P)={(,a,b,^}; SELECT(F'->*F')={*}; SELECT(F'->ε)=FOLLOW(F')={(,a,b,^,+,),#}; SELECT(P->(E))={(} SELECT(P->a)={a} SELECT(P->b)={b} SELECT(P->^)={^} 可见,相同左部产生式的SELECT集的交集均为空,所以文法G[E]是LL(1)文法。 (3)构造它的预测分析表。 文法G[E]的预测分析表如下: 《编译原理》模拟试题三 一、是非题(请在括号内,正确的划√,错误的划×)(每个2分,共20分) 1.对于数据空间的存贮分配,FORTRAN采用动态贮存分配策略。(×) 2.甲机上的某编译程序在乙机上能直接使用的必要条件是甲机和乙机的操作系统功能完全 相同。(× ) 3.递归下降分析法是自顶向上分析方法。(√ ) 4.产生式是用于定义词法成分 的一种书写规则。 (×) 5.LR 法是自顶向下语法分析方法。 (√ ) 6.在 SLR ( 1 )分析法的名称中,S的含义是简单的。(√) 7.综合属性是用于 “ 自上而下 ” 传递信息。(× ) 8.符号表中的信息栏中登记了每个名字的 属性和特征等有关信息 ,如类型、种属、所占 单元大小、地址等等。 (×) 9.程序语言的语言处理程序是一种应用软件。 (×) 10.解释程序适用于 COBOL 和 FORTRAN 语言。 (×) 二、选择题(请在前括号内选择最确切的一项作为答案划一个勾,多划按错论)(每个4分,共 40分) 1. 文法 G 产生的_____的全体是该文法描述的语言。 A.( ) 句型 B.( ) 终结符集 C.( ) 非终结符集 D.( ) 句子 2. 若文法 G 定义的语言是无限集,则文法必然是 _____。 A.( ) 递归的 B.( ) 前后文无关的 C.( ) 二义性的 D.( ) 无二义性的 3. 四种形式语言文法中,1型文法又称为 _____文法。 A.( ) 短语结构文法 B.( ) 前后文无关文法 C.( ) 前后文有关文法 D.( ) 正规文法 4. 一个文法所描述的语言是_____。 A.( ) 唯一的 B.( ) 不唯一的 C.( ) 可能唯一,好可能不唯一 D.( ) 都不对 5. _____和代码优化部分不是每个编译程序都必需的。 A.( ) 语法分析 B.( ) 中间代码生成 C.( ) 词法分析 D.( ) 目标代码生成 6._____是两类程序语言处理程序。 A.( ) 高级语言程序和低级语言程序 B.( ) 解释程序和编译程序 C.( ) 编译程序和操作系统 D.( ) 系统程序和应用程序 7. 数组的内情向量中肯定不含有数组的_____的信息。 A. ( ) 维数 B.( ) 类型 C.( ) 维上下界 D.( ) 各维的界差 8. 一个上下文无关文法 G 包括四个组成部分,它们是:一组非终结符号,一组终结符号, 一个开始符号,以及一组 _____。 A.( ) 句子 B.( ) 句型 C.( ) 单词 D.( ) 产生式 9. 文法分为四种类型,即0型、1型、2型、3型。其中2型文法是_____。 A. ( ) 短语文法 B.( ) 正则文法 C.( ) 上下文有关文法 D.( ) 上下文无关文法 10.文法 G 所描述的语言是_____的集合。 A. ( ) 文法 G 的字母表 V 中所有符号组成的符号串 B.( ) 文法 G 的字母表 V 的闭包 V* 中的所有符号串 C.( ) 由文法的开始符号推出的所有终极符串 D. ( ) 由文法的开始符号推出的所有符号串 三、填空题(每空1分,共10分) 1.一个句型中的最左简单短语称为该句型的___句柄__。 2.对于文法的每个产生式都配备了一组属性的计算规则,称为 __语义规则___ 。 3.一个典型的编译程序中,不仅包括__词法分析___、__语法分析___、__中间代码生成___、 代码优化、目标代码生成等五个部分,还应包括表格处理和出错处理。 4. 从功能上说,程序语言的语句大体可分为__执行性___语句和__说明性___语句两大类。 5. 扫描器的任务是从__源程序___中识别出一个个___单词符号__。 6. 产生式是用于定义__语法范畴___的一种书写规则。 四、简答题(20分) 1. 写一个文法,使其语言是奇数集,且每个奇数不以0开头。 解:文法G(N): N→AB|B A→AC|D B→1|3|5|7|9 D→B|2|4|6|8 C→0|D 2. 设文法G(S): S→(L)|a S|a L→L,S|S (1) 消除左递归和回溯; (2) 计算每个非终结符的FIRST和FOLLOW。 解:(1) S→(L)|aS' S'→S|ε L→SL' L'→SL'|ε (2) FIRST)S)={(,a} FOLLOW(S)={#,,,)} FIRST(S')={,a,ε} FOLLOW(S')={#,,,)} FIRST(L)={(,a} FOLLOW(L)={ )} FIRST(L')={,,ε} FOLLOW(L'〕={ )} 3. 已知文法G(E) E→T|E+T T→F|T *F F→(E)|i (1)给出句型(T *F+i)的最右推导; (2)给出句型(T *F+i)的短语、素短语。 解:(1) 最右推导: E->T->F->(E)->(E+T)->(E+F)->(E+i) ->(T+i)->(T*F+i) (2) 短语:(T*F+i),T*F+i,T*F,i 素短语:T*F,i 4. 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,-,-,3) (3) (j<,b,0,5) (4) (j,-,-,15) (5) (+,×,1,T1) (6) (:=,T1,-,×) (7) (j≥,a,0,9) (8) (j,-,-,12) (9) (-,a,1,T2) (10) (:=,T2,-,a) (11) (j,-,-,1) (12) (+,b,1, T3) (13) (:=,T3,-,b) (14) (j,-,-,1) (15) 五.计算题(10分) 已知 NFA= ( {x,y,z},{0,1},M,{x},{z} ),其中: M(x,0)={z},M(y,0)={x,y},M(z,0)={x,z},M(x,1)={x}, M(y,1)= φ ,M(z,1)={y}, 构造相应的DFA 并最小化。 解:根据题意有NFA图: 下表由子集法将NFA转换为DFA: 下面将该DFA最小化: (1) 首先将它的状态集分成两个子集:P1={A,D,E},P2={B,C,F} (2) 区分P2:由于F(F,1)=F(C,1)=E,F(F,0)=F并且F(C,0)=C,所以F,C等价。由于 F(B,0)=F(C,0)=C, F(B,1)=D,F(C,1)=E,而D,E不等价(见下步),从而B与C,F可以区分。 有P21={C,F},P22={B}。 (3) 区分P1:由于A,E输入0到终态,而D输入0不到终态,所以D与A,E可以区分, 有P11={A,E},P12={D}。 (4) 由于F(A,0)=B,F(E,0)=F,而B,F不等价,所以A,E可以区分。 (5) 综上所述,DFA可以区分为P={{A},{B},{D},{E},{C,F}}。所以最小化的DFA 如下: 《编译原理》模拟试题四 一、是非题(请在括号内,正确的划√,错误的划×)(每个2分,共20分) 1.一个 LL(l)文法一定是无二义的。 (× ) 2.正规文法产生的语言都可以用上下文无关文法来描述。 (× ) 3.一张转换图只包含有限个状态,其中有一个被认为是初态,最多只有一个终态。 (√) 4.目标代码生成时,应考虑如何充分利用计算机的寄存器的问题。 (× ) 5.逆波兰法表示的表达式亦称前缀式 。 (√ ) 6.如果一个文法存在某个句子对应两棵不同的语法树,则称这个文法是二义的。 (√ ) 7.LR 法是自顶向下语法分析方法。 (× ) 8.数组元素的地址计算与数组的存储方式有关。(× ) 9.算符优先关系表不一定存在对应的优先函数。 (×) 10.对于数据空间的存贮分配, FORTRAN 采用动态贮存分配策略。 (×) 二、选择题(请在前括号内选择最确切的一项作为答案划一个勾,多划按错论)(每个4分,共 40分) 1.词法分析器用于识别_____。 A.( ) 字符串 B.( )语句 C.( )单词 D.( )标识符 2.文法分为四种类型,即0型、1型、2型、3型。其中0型文法是_____。 A. ( ) 短语文法 B.( ) 正则文法 C.( ) 上下文有关文法 D.( ) 上下文无关文法 3.一个上下文无关文法 G 包括四个组成部分,它们是:一组非终结符号,一组终结符号, 一个开始符号,以及一组 _____。 A.( ) 句子 B.( ) 句型 C.( ) 单词 D.( ) 产生式 4._____是一种典型的解释型语言。 A.( ) BASIC B.( ) C C.( ) FORTRAN D.( ) PASCAL 5.与编译系统相比,解释系统_____。 A.( ) 比较简单 , 可移植性好 , 执行速度快 B.( ) 比较复杂 , 可移植性好 , 执行速度快 C.( ) 比较简单 , 可移植性差 , 执行速度慢 D.( ) 比较简单 , 可移植性好 , 执行速度慢 6.用高级语言编写的程序经编译后产生的程序叫_____。 A.( ) 源程序 B.( ) 目标程序 C.( ) 连接程序 D.( ) 解释程序 7.词法分析器用于识别_____。 A. ( ) 字符串 B.( ) 语句 C.( ) 单词 D.( ) 标识符 8.编写一个计算机高级语言的源程序后 , 到正式上机运行之前,一般要经过_____这几步: (1) 编辑 (2) 编译 (3) 连接 (4) 运行 A. ( ) (1)(2)(3)(4) B.( ) (1)(2)(3) C.( ) (1)(3) D.( ) (1)(4) 9.把汇编语言程序翻译成机器可执行的目标程序的工作是由_____完成的。 A.( ) 编译器 B.( ) 汇编器 C.( ) 解释器 D.( ) 预处理器 10.文法 G 所描述的语言是_____的集合。 A. ( ) 文法 G 的字母表 V 中所有符号组成的符号串 B.( ) 文法 G 的字母表 V 的闭包 V* 中的所有符号串 C.( ) 由文法的开始符号推出的所有终极符串 D. ( ) 由文法的开始符号推出的所有符号串 三、填空题(每空1分,共10分) 1.语法分析是依据语言的__语法___规则进行的,中间代码产生是依据语言的__语义___规 进行的。 2.语法分析器的输入是__单词符号串___,其输出是__语法单位___。 3.一个名字的属性包括__类型___和__作用域___。 4.产生式是用于定义___语法成分__的一种书写规则。 5.逆波兰式 ab+c+ d*e- 所表达的表达式为__(a+b+c)*d-e___ 。 6.语法分析最常用的两类方法是__自上而下___和__自下而上___分析法。 四、简答题(20分) 1. 写出下列表达式的三地址形式的中间表示。 (1) 5+6 *(a + b); (2)for j:=1 to 10 do a[j + j]:=0。 答: (1)100: t1:=a+b 101: t2:=6*t1 102: t3:=5+t2 (2)100: j:=1 101: if j>10 goto NEXT 102: i:=j+j 103: a[i]:=0 2. 设基本块p由如下语句构成: T 0 : =3.14; T 1 :=2*T 0 ; T 2 :=R+r; A:=T l *T 2 ; B:=A; T 3 :=2*T 0 ; T 4 :=R+r; T 5 :=T 3 *T 4 ; T 6 :=R-r ; B:=T 5 *T 6 ; 试给出基本块p的 DAG 。 解:基本块p的DAG图: 3. 写出表达式(a+b)/(a-b-(a+b*c)的三元序列及四元序列。 解:(1)三元式: ①(+,a,b) ②(-,a,b) ③(/,①,②) ④(*,b,c) ⑤(+,a,④) ⑥(-,③,⑤) (2)四元式: ①(+,a,b,T1) ②(-,a,b,T2) ③(/,T1,T2,T3) ④(*,b,c,T4) ⑤(+,a,T4,T5) ⑥(-,T3,T5,T6) 4. 写一个文法使其语言为偶数集,且每个偶数不以0开头。 解:文法G(S): S→AB|B|A0 A→AD|C B→2|4|6|8 C→1|3|5|7|9|B D→0|C 5. 设文法 G ( S ): S→S + aF|aF| + aF F→*aF|*a (1)消除左递归和回溯; (2)构造相应的 FIRST 和 Follow 集合。 1) S->aFS'|+aFS' S'->+aFS'|ε F->*aF' F'->F|ε (2) FIRST(S)={a,+} FOLLOW(S)={#} FIRST(S')={+,ε } FOLLOW(S')={#} FIRST(F)={*} FOLLoW(F)=(+,#} FIRST(F')={*,ε} FOLLOW(+,#} 五.计算题(10分) 已知文法为: S->a|^|(T) T->T,S|S 构造它的 LR(0)分析表。 解:加入非终结符S',方法的增广文法为: S'->S S->a S->^ S->(T) T->T,S T->S 下面构造它的LR(0)项目集规范族为: 从上表可看出,不存在移进-归约冲突以及归约归约冲突,该文法是LR(0)文法。 从而有下面的LR(0)分析表: 《编译原理》模拟试题五 一、是非题(请在括号内,正确的划√,错误的划×)(每个2分,共20分) 1.编译程序是对高级语言程序的解释执行。(× ) 2.一个有限状态自动机中,有且仅有一个唯一的终态。(×) 3.一个算符优先文法可能不存在算符优先函数与之对应。 (√ ) 4.语法分析时必须先消除文法中的左递归 。 (×) 5.LR分析法在自左至右扫描输入串时就能发现错误,但不能准确地指出出错地点。 (√) 6.逆波兰表示法表示表达式时无须使用括号。 (√ ) 7.静态数组的存储空间可以在编译时确定。 (×) 8.进行代码优化时应着重考虑循环的代码优化,这对提高目标代码的效率将起更大作用。 (×) 9.两个正规集相等的必要条件是他们对应的正规式等价。 (× ) 10.一个语义子程序描述了一个文法所对应的翻译工作。 (×) 二、选择题(请在前括号内选择最确切的一项作为答案划一个勾,多划按错论)(每个4分,共 40分) 1.词法分析器的输出结果是_____。 A.( ) 单词的种别编码 B.( ) 单词在符号表中的位置 C.( ) 单词的种别编码和自身值 D.( ) 单词自身值 2. 正规式 M 1 和 M 2 等价是指_____。 A.( ) M1和M2的状态数相等 B.( ) M1和M2的有向边条数相等 C.( ) M1和M2所识别的语言集相等 D.( ) M1和M2状态数和有向边条数相等 3. 文法G:S→xSx|y所识别的语言是_____。 A.( ) xyx B.( ) (xyx)* C.( ) xnyxn(n≥0) D.( ) x*yx* 4.如果文法G是无二义的,则它的任何句子α_____。 A.( )最左推导和最右推导对应的语法树必定相同 B.( ) 最左推导和最右推导对应的语法树可能不同 C.( ) 最左推导和最右推导必定相同 D.( )可能存在两个不同的最左推导,但它们对应的语法树相同 5.构造编译程序应掌握______。 A.( )源程序 B.( ) 目标语言 C.( ) 编译方法 D.( ) 以上三项都是 6.四元式之间的联系是通过_____实现的。 A.( ) 指示器 B.( ) 临时变量 C.( ) 符号表 D.( ) 程序变量 7.表达式(┐A∨B)∧(C∨D)的逆波兰表示为_____。 A. ( ) ┐AB∨∧CD∨ B.( ) A┐B∨CD∨∧ C.( ) AB∨┐CD∨∧ D.( ) A┐B∨∧CD∨ 8. 优化可生成_____的目标代码。 A.( ) 运行时间较短 B.( ) 占用存储空间较小 C.( ) 运行时间短但占用内存空间大 D.( ) 运行时间短且占用存储空间小 9.下列______优化方法不是针对循环优化进行的。 A. ( ) 强度削弱 B.( ) 删除归纳变量 C.( ) 删除多余运算 D.( ) 代码外提 10.编译程序使用_____区别标识符的作用域。 A. ( ) 说明标识符的过程或函数名 B.( ) 说明标识符的过程或函数的静态层次 C.( ) 说明标识符的过程或函数的动态层次 D. ( ) 标识符的行号 三、填空题(每空1分,共10分) 1.计算机执行用高级语言编写的程序主要有两种途径:___解释__和__编译___。 2.扫描器是__词法分析器___,它接受输入的__源程序___,对源程序进行___词法分析__ 并识别出一个个单词符号,其输出结果是单词符号,供语法分析器使用。 3.自上而下分析法采用___移进__、归约、错误处理、___接受__等四种操作。 4.一个LR分析器包括两部分:一个总控程序和___一张分析表__。 5.后缀式abc-/所代表的表达式是___a/(b-c)__。 6.局部优化是在__基本块___范围内进行的一种优化。 四、简答题(20分) 1. 简要说明语义分析的基本功能。 答:语义分析的基本功能包括: 确定类型、类型检查、语义处理和某些静态语义检 查。 2. 考虑文法 G[S]: S → (T) | a+S | a T → T,S | S 消除文法的左递归及提取公共左因子。 解:消除文法G[S]的左递归: S→(T) | a+S | a T→ST′ T′→,ST′| ε 提取公共左因子: S→(T) | aS′ S′→+S | ε T→ST′ T′→,ST′| ε 3. 试为表达式 w+(a+b)*(c+d/(e-10)+8) 写出相应的逆波兰表示。 解: w a b + c d e 10 - / + 8 + * + 4. 按照三种基本控制结构文法将下面的语句翻译成四元式序列: while (A { if (A ≥ 1) C=C+1; else while (A ≤ D) A=A+2; }。 解:该语句的四元式序列如下(其中E1、E2和E3分别对应A<C∧B<D、A≥1和A≤D,并 且关系运算符优先级高): 100 (j<,A,C,102) 101 (j,_,_,113) 102 (j<,B,D,104)
发布者:admin,转转请注明出处:http://www.yc00.com/news/1707990588a1534054.html
评论列表(0条)