编译原理课后答案——第九章小型编译程序介绍
编译原理课后习题答案+清华大学出版社第二版
一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程序 的总体结构图。
答案: 一个典型的编译程序通常包含 8 个组成部分,它们是词法分析程序、语法分析程序、语
义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和 错误处理程序。其各部分的主要功能简述如下。
第 4题
对下列错误信息,请指出可能是编译的哪个阶段(词法分析、语法分析、语义分析、代 码生成)报告的。 (1) else 没有匹配的 if (2) 数组下标越界 (3) 使用的函数没有定义 (4) 在数中出现非数字字符
答案: (1) 语法分析 (2) 语义分析 (3) 语法分析 (4) 词法分析
第5题
盛威网()专业的计算机学习网站
2
《编译原理》课后习题答案第一章
合实现方案,即先把源程序翻译成较容易解释执行的某种中间代码程序,然后集中解释执行 中间代码程序,最后得到运行结果。
广义上讲,编译程序和解释程序都属于翻译程序,但它们的翻译方式不同,解释程序是 边翻译(解释)边执行,不产生目标代码,输出源程序的运行结果。而编译程序只负责把源 程序翻译成目标程序,输出与源程序等价的目标程序,而目标程序的执行任务由操作系统来 完成,即只翻译不执行。
3
《编译原理》课后习题答案第一章
第6题
计算机执行用高级语言编写的程序有哪些途径?它们之间的主要区别是什么?
答案:计算机执行用高级语言编写的程序主要途径有两种,即解释与编译。 像 Basic 之类的语言,属于解释型的高级语言。它们的特点是计算机并不事先对高级语
言进行全盘翻译,将其变为机器代码,而是每读入一条高级语句,就用解释器将其翻译为一 条机器代码,予以执行,然后再读入下一条高级语句,翻译为机器代码,再执行,如此反 复。
编译原理lxy第9章
第16页
编译原理
C语言的程序结构 语言的程序结构 全局数据说明 Main ( ) { Main中的数据说明 中的数据说明 } void R ( ) { R中的数据说明 中的数据说明 } void R ( ) { R中的数据说明 中的数据说明 }
第17页
编译原理 C语言程序的存储组织 语言程序的存储组织
TOP R的活动记录 的活动记录
SP
Q的活动记录 的活动记录
Main的活动记录 的活动记录
主程序全局数据区
SP:总指向现行过程活动记录的起点,用于访问局部数据。 TOP:始终指向(已占用)栈顶单元。
第18页
编译原理 2、C的活动记录 、 的活动记录
C的活动记录有以下四个项目。 的活动记录有以下四个项目。 的活动记录有以下四个项目 1、连接数据(两项): 、 (两项): (1)老SP值,即前一活动记录的起始地址; 老 值 即前一活动记录的起始地址; (2)返回地址 (2)返回地址。 返回地址。 2、参数个数。 、 。 3、形式单元(存放实在参数的值或地址)。 、 (存放实在参数的值或地址)。 4、过程的局部变量、数组内情向量和临时工作单元。 、 。
编译原理
第九章 程序运行期间的存时存储空间的划分 活动记录概念 存储空间分配策略 1 1、静态存储分配 2、动态存储分配 简单栈式存储分配 嵌套过程语言的栈式分配 典型范例解析
第2页
编译原理 运行时存储空间的划分
编译程序为了使它编译后得到的目标程序能够运行, 编译程序为了使它编译后得到的目标程序能够运行, 要从操作系统中获得一块存储空间。 要从操作系统中获得一块存储空间。
有一些数据对象的大小在编译时也能确定,因此它们 有一些数据对象的大小在编译时也能确定, 也可以放在静态确定的区域。 也可以放在静态确定的区域。
编译原理课后习题答案-清华大学-第二版
《编译原理》课后习题答案第一章
是哪种方式,其加工结果都是源程序的执行结果。目前很多解释程序采取上述两种方式的综 合实现方案,即先把源程序翻译成较容易解释执行的某种中间代码程序,然后集中解释执行 中间代码程序,最后得到运行结果。
广义上讲,编译程序和解释程序都属于翻译程序,但它们的翻译方式不同,解释程序是 边翻译(解释)边执行,不产生目标代码,输出源程序的运行结果。而编译程序只负责把源 程序翻译成目标程序,输出与源程序等价的目标程序,而目标程序的执行任务由操作系统来 完成,即只翻译不执行。
好似滚雪球一样,直到我们所要求的编译程序。 (4)移植:将 A 机器上的某高级语言的编译程序搬到 B 机器上运行。
《编译原理》课后习题答案第一章
第6题
计算机执行用高级语言编写的程序有哪些途径?它们之间的主要区别是什么?
答案: 计算机执行用高级语言编写的程序主要途径有两种,即解释与编译。 像 Basic 之类的语言,属于解释型的高级语言。它们的特点是计算机并不事先对高级语
第4题
对下列错误信息,请指出可能是编译的哪个阶段(词法分析、语法分析、语义分析、 代码生成)报告的。 (1) else 没有匹配的 if (2) 数组下标越界 (3) 使用的函数没有定义 (4) 在数中出现非数字字符
答案: (1) 语法分析 (2) 语义分析 (3) 语法分析 (4) 词法分析
第5题
b∶=10; end (q); procedure s; var c,d; procedure r;
var e,f; begin (r)
call q; end (r); begin (s) call r; end (s); begin (p) call s;
end (p); begin (main)
编译原理第九章
分配策略:如果两个临时变量名作用域不相交,则它们可以分配在
同一单元中。一个临时变量名自它第一次被定值(赋值)的地方起
直至它最后一次被引用的地方止,这区间的程序所能到达的全体四
元式构成了它的作用域。 令临时变量名都分配在局部数据区中,若某一单元已分配给某些
临时变量名,则把这些名字的作用域(它们必须互不相交信息记录 )作为此单元的分配信息记录下来。每当要对一个新临时变量名进 行分配时,首先求出此名的作用域,然后按序检查每个已分配单 元,一旦发现新求出的作用域与某个单元所记录的全部作用域均不 相交时就把这个单元分配给这个新名,同时把它的作用域也添加到 该单元的分配信息之中。如果新临时变量的作用域和所有已分配单 元的作用域均有冲突,则就分配给它一个新的单元,同时把新名的 作用域作为此单元的分配信息。
适于静态管理的语言必须满足的条件:
1. 数组的上下界必须是常数
2. 过程调用不允许递归
3. 不允许用户动态地建立数据实体
编译程序可以确定出现在程序中的数据实体的地址(一般相 对于各数据区基地址的偏移量)。由于过程调用不允许递归,数 据实体的存储地址就和过程相联系,过程调用的活动记录就可 以直接安排在目标代码之后,并把各数据项的存储地址填入到 相关的目标代码中,以便在运行时访问这些数据存储空间。这 里,不存在对存储区域的再利用。目标代码运行时不必进行运 行时的存储管理。
上一页
下一页
18
3.2 FORTRAN的局部数据区
FORTRAN的编译程序将每个程序段都定义对应的局部数据区,每个数据区都 有一个编号,在地址分配时,在符号表中,对每个数据名将登记上它是属于哪个 数据区的,以及在该区中的相对位置(DA、ADDR)。
编译原理第二版课后习答案
《编译原理》课后习题答案第一章第?1?章引论第?1?题解释下列术语:(1)编译程序(2)源程序(3)目标程序(4)编译程序的前端(5)后端(6)遍答案:(1)?编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语言,则此翻译程序称为编译程序。
(2)?源程序:源语言编写的程序称为源程序。
(3)?目标程序:目标语言书写的程序称为目标程序。
(4)?编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与目标机无关。
通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符号表管理等工作。
(5)?后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,即目标代码生成,以及相关出错处理和符号表操作。
(6)?遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。
第?2?题一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程序的总体结构图。
答案:一个典型的编译程序通常包含?8?个组成部分,它们是词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和错误处理程序。
其各部分的主要功能简述如下。
词法分析程序:输人源程序,拼单词、检查单词和分析单词,输出单词的机内表达形式。
语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。
语义分析程序:进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表中。
中间代码生成程序:按照语义规则,将语法分析程序分析出的语法单位转换成一定形式的中间语言代码,如三元式或四元式。
中间代码优化程序:为了产生高质量的目标代码,对中间代码进行等价变换处理。
目标代码生成程序:将优化后的中间代码程序转换成目标代码程序。
表格管理程序:负责建立、填写和查找等一系列表格工作。
08979编译原理第九章
–
–
中间表示:四元式 DAG图 控制流图 数据流方程
问题复杂度:往往是NP 完全或NP难
–
简化,小规模问题
…
优化算法
–
代码优化的基本过程
代码的描述 数据流分析(data-flow analysis) 控制流分析(control-flow analysis) 变换 (transformations)
(3)T1:=4*I (5)T3:=T2[T1] (6)T4:=T1 (8)T6:=T5[T4] (9)T7:=T3*T6 (10)P:=P+T7 (11)I:=I+1 (12)if I<=20 goto(3)
(3‘)T1:=T1+4
(12)if I<=20 goto(5)
(1)P:=0 (2)I:=1 (4)T2:=addr(A)-4 (7)T5:=addr(B)-4 (3)T1:=4*I
性能指标
–
–
–
目标
代码优化
优化策略:
– – –
权衡(trade off):意图、结果 简洁:KISS(Keep It Simple,Stupid) 分工:编译阶段、软件处理、硬件机制
优化的阶段:
front end (I.R)
中间代码优化
(source code)
用户
code generator
基本优化技术
常数合并(合并已知量) 常数传播 代数化简 强度削弱(削弱运算强度) 复写传播 删除多余运算 循环不变代பைடு நூலகம்外提 变换循环控制条件 删除无用赋值
编译原理课后习题答案ch9
盛威网()专业的计算机学习网站
2
《编译原理》课后习题答案第九章
附加题
问题 1: 利用 Pascal 的作用域规则,试确定在下面的 Pascal 程序中的名字 a 和 b 的每一次出现 所应用的说明。 program m ( input, output ) ; procedure n ( u, v, x, y : integer ) ; var m : record m, n : interger end ; n : record n, m : interger end ; begin with m do begin m := u ; n:= v end ; with n do begin m := x ; n := y end ; writeln ( m.m, m.n, n.m, n.n ) end ; begin m ( 1, 2, 3, 4 ) end. 答案: 图中用蓝色数字下标相应标明。 program m1 ( input, output ) ; procedure n1( u, v, x, y : integer ) ; var m2 : record m3, n2 : interger end ; n3 : record n4, m4 : interger end ; begin with m2 do begin m3 := u ; n2 := v end ; with n3 do begin m4 := x ; n4 := y end ; writeln ( m2.m3, m2.n2, n3.m4, n3.n4 ) end ; begin m1 ( 1, 2, 3, 4 ) end. 问题 2: 当一个过程作为参数被传递时,我们假定有以下三种与此相联系的环境可以考虑,下 面的 Pascal 程序是用来说明这一问题的。 一种是词法环境 (lexical environment) , 如此这样的一个过程的环境是由这一过程定义 之处的各标识符的联编所构成; 一种是传递环境(passing environment) ,是由这一过程作为参数被传递之处的各标识
编译原理习题及答案(整理后)
第一章1、将编译程序分成若干个“遍”是为了。
b.使程序的结构更加清晰2、构造编译程序应掌握。
a.源程序b.目标语言c.编译方法3、变量应当。
c.既持有左值又持有右值4、编译程序绝大多数时间花在上。
d.管理表格5、不可能是目标代码。
d.中间代码6、使用可以定义一个程序的意义。
a.语义规则7、词法分析器的输入是。
b.源程序8、中间代码生成时所遵循的是- 。
c.语义规则9、编译程序是对。
d.高级语言的翻译10、语法分析应遵循。
c.构词规则二、多项选择题1、编译程序各阶段的工作都涉及到。
b.表格管理c.出错处理2、编译程序工作时,通常有阶段。
a.词法分析b.语法分析c.中间代码生成e.目标代码生成三、填空题1、解释程序和编译程序的区别在于是否生成目标程序。
2、编译过程通常可分为5个阶段,分别是词法分析、语法分析中间代码生成、代码优化和目标代码生成。
3、编译程序工作过程中,第一段输入是源程序,最后阶段的输出为标代码生成程序。
4、编译程序是指将源程序程序翻译成目标语言程序的程序。
一、单项选择题1、文法G:S→xSx|y所识别的语言是。
a. xyxb. (xyx)*c.x n yx n(n≥0) d. x*yx*2、文法G描述的语言L(G)是指。
a. L(G)={α|S+⇒α , α∈V T*}b. L(G)={α|S*⇒α, α∈V T*}c. L(G)={α|S*⇒α,α∈(V T∪V N*)} d. L(G)={α|S+⇒α, α∈(V T∪V N*)}3、有限状态自动机能识别。
a. 上下文无关文法b. 上下文有关文法c.正规文法d. 短语文法4、设G为算符优先文法,G 的任意终结符对a、b有以下关系成立。
a. 若f(a)>g(b),则a>bb.若f(a)<g(b),则a<bc. a~b都不一定成立d. a~b一定成立5、如果文法G是无二义的,则它的任何句子α。
a. 最左推导和最右推导对应的语法树必定相同b. 最左推导和最右推导对应的语法树可能不同c. 最左推导和最右推导必定相同d. 可能存在两个不同的最左推导,但它们对应的语法树相同6、由文法的开始符经0步或多步推导产生的文法符号序列是。
编译原理课后习题解答
〈句子〉=>〈主语〉〈谓语〉
=>〈主语〉〈动词〉〈直接宾语〉
=>〈主语〉〈动词〉〈冠词〉〈名词〉
=>〈主语〉〈动词〉〈冠词〉peanut
=>〈主语〉〈动词〉the peanut
=>〈主语〉ate the peanut
=>〈冠词〉〈形容词〉〈名词〉ate the peanut
=>〈冠词〉〈形容词〉 elephant ate the peanut
=>〈冠词〉big elephant ate the peanut
=> the big elephant ate the peanut
(B) 〈句子〉=>〈主语〉〈谓语〉
=>〈主语〉〈动词〉〈直接宾语〉
=>〈冠词〉〈形容词〉〈名词〉〈动词〉〈直接宾语〉
=>〈冠词〉〈形容词〉〈名词〉〈动词〉〈冠词〉〈名词〉
〈偶数字〉::=0 | 2 | 4 | 6 | 8
3. 写一文法,使其语言是偶整数的集合,但不允许有以 0 开头的偶整数。
解:G[〈偶整数〉]:
〈偶整数〉::= 〈符号〉〈单偶数〉|〈符号〉〈首数字〉〈数字串〉〈尾偶数〉
〈符号〉::= + | — |ε
〈单偶数〉::=2 | 4 | 6 | 8
〈尾偶数〉::= 0 |〈单偶数〉
S::= a(B)a B::= bB |b|ε ( 2 ) 文法[G〈S〉]: S ::= (A)(B) A::= aA|a B::= bB|b 6. 文法 G3[〈表达式〉]: 〈表达式〉::=〈项〉|〈表达式〉+〈项〉|〈表达式〉—〈项〉 〈项〉::=〈因子〉|〈项〉*〈因子〉|〈项〉/〈因子〉 〈因子〉::=(〈表达式〉)| i 试给出下列符号串的推导: i, (i), i*i, i*i+i, i*(i+i) 解:(1)〈表达式〉=>〈项〉 =>〈因子〉
编译原理部分课后答案,仅供参考
第一章编译程序概述1.1什么是编译程序编译程序是现代计算机系统的基本组成部分之一,而且多 数计算机系统都含有不止一个高级语言的编译程序。
对有些高 级语言甚至配置了几个不同性能的编译程序。
1.2编译过程概述和编译程序的结构编译程序完成从源程序到目标程序的翻译工作,是一个复 杂的整体的过程。
从概念上来讲,一个编译程序的整个工作过 程是划分成阶段进行的,每个阶段将源程序的一种表示形式转 换成另一种表示形式,各个阶段进行的操作在逻辑上是紧密连 接在一起的。
一般一个编译过程划分成词法分析、语法分析、 语义分析、中间代码生成,代码优化和目标代码生成六个阶段,这是一种典型的划分方法。
事实上,某些阶段可能组合在一起, 这些阶段间的源程序的中间表示形式就没必要构造岀来了。
我 们将分别介绍各阶段的任务。
另外两个重要的工作:表格管理 和岀错处理与上述六个阶段都有联系。
编译过程中源程序的各 种信息被保留在种种不同的表格里,编译各阶段的工作都涉及 到构造、查找或更新有关的表格,因此需要有表格管理的工作; 如果编译过程中发现源程序有错误,编译程序应报告错误的性 质和错误发生的地点,并且将错误所造成的影响限制在尽可能 小的范围内,使得源程序的其余部分能继续被编译下去,有些 编译程序还能自动校正错误, 这些工作称之为岀错处理。
图1.3表示了编译的各个阶段。
图1.3编译的各个阶段它不生成目标代码,它每遇到一个语句,就要对这个语句进行 分析以决定语句的含义,执行相应的动作。
右面的图示意了它 的工作机理第二章:PL/O 编译程序问答第1题 PL/0语言允许过程嵌套定义和递归调用,试问 它的编译程序如何解决运行时的存储管理。
答:PL/0语言允许过程嵌套定义和递归调用,它的编译程序在运行时采用了栈式动态存储管理。
(数组CODE 存放的只读目 标程序,它在运行时不改变。
)运行时的数据区S 是由解释程序 定义的一维整型数组,解释执行时对数据空间S 的管理遵循后进先岀规则,当每个过程(包括主程序)被调用时,才分配数据 空间,退出过程时,则所分配的数据空间被释放。
编译原理 答案
a a b b
X
Y
b
图2-2 习题2.3的NFA M
•
用子集法构造状态转换矩阵,如 表2-1所示。
表2-1 状态转换矩阵
I {x} {y} {x,y} Ia {x,y} — {x,y} Ib {y} {x,y} {x,y}
•
将转换矩阵中的所有子集重新命 名,形成表2-2所示的状态转换矩阵,即 得到 • M′=({0,1,2},{a,b},f,0,{1,2}), 其状态转换图如图2-3所示。
•
• G[A]:A→aA|bB|b • •
•
• • • • • • •
2.8 下列程序段以B表示循环体, A表示初始化,I表示增量,T表示测试: I=1; while (I<=n) { sun=sun+a[I]; I=I+1; } 请用正规表达式表示这个程序段 可能的执行序列。
•
【解答】 用正规表达式表示程 序段可能的执行序列为A(TBI)*。 • 2.9 将图 2-19 所示的非确定有 限自动机(NFA)变换成等价的确定有限自 动机(DFA)。
Ia {1,2} {1,2} {1,2}
Ib {1,2,Y} {1,2,Y} {1,2,Y} 重新命名
S 1 2 3
a 2 2 2
b 3 3 3
图2-18 图2-17确定化后的状态转换矩阵
•
比较图2-18与图2-15,重新命名 后的转换矩阵是完全一样的,也即正规 式 (a|b)*b 可以同样得到化简后的 DFA 如 图 2-16 所示。因此,两个自动机完全一 样,即两个正规文法等价。 (2) 对图2-16,令A对应状态1, B对应状态2,则相应的正规文法G[A]为 B→aA|bB|b G[A] 可 进 一 步 化 简 为 G[S] :
编译原理课后习题答案
第一章1.解答:程序设计语言:程序设计语言是遵守一定规范的、描述“计算”(Computing)过程的形式语言。
一般可以划分为低级语言和高级语言两大类。
低级语言是面向机器的语言,它是为特定的计算机系统设计的语言,机器指令、汇编语言是低级语言。
高级语言是与具体计算机无关的“通用”语言,它更接近于人类的自然语言和数学表示,例如FORTRAN、Pascal、C等等我们熟悉的语言是高级语言。
语言处理程序:由于目前的计算机只能理解和执行机器语言,因此必须有一个程序将用程序设计语言书写的程序等价(执行效果完全一致)地转换为计算机能直接执行的形式,完成这一工作的程序称为“语言处理程序”。
它一般可分为解释程序和翻译程序两大类。
翻译程序:翻译程序(Translator)是一种语言处理程序,它将输入的用程序设计语言书写的程序(称为源程序)转换为等价的用另一种语言书写的程序(称为目标程序)。
若源语言是汇编语言,目标程序是机器语言,称这种翻译程序为汇编程序。
若源语言是高级语言,目标程序是低级语言,称这种翻译程序为编译程序。
解释程序:解释程序(Interpreter)是一种语言处理程序,它对源程序逐个语句地进行分析,根据每个语句的含义执行语句指定的功能。
2.解答:编译程序的总框图见图1.2。
其中词法分析器,又称扫描器,它接受输入的源程序,对源程序进行词法分析,识别出一个个的单词符号,其输出结果是单词符号。
语法分析器,对单词符号串进行语法分析(根据语法规则进行推导或归约),识别出程序中的各类语法单位,最终判断输入串是否构成语法上正确的“程序”。
语义分析及中间代码产生器,按照语义规则对语法分析器归约出(或推导出)的语法单位进行语义分析并把它们翻译成一定形式的中间代码。
编译程序可以根据不同的需要选择不同的中间代码形式,有的编译程序甚至没有中间代码形式,而直接生成目标代码。
优化器对中间代码进行优化处理。
一般最初生成的中间代码执行效率都比较低,因此要做中间代码的优化,其过程实际上是对中间代码进行等价替换,使程序在执行时能更快,并占用更小的空间。
程序设计语言 编译原理(第三版)第9章
30
9.5 嵌套过程语言的栈式实现
2.Par T T——为过程
⇒在进入T之后,为了建立T自己的display,T必须知道 它直接外层的display。 又P的display 或者正好就是这个外层的display, 或者包含了这个外层display
而由于T的层数是已知的
⇒只要知道P的display,T就可以用它来建立自己的display。 即假定T的层数为1,则T的display乃是由P的display的前1 个单元的内容和SP的现行值所组成。
i b(形参) 1(形参个数) 0
v
u 2 11 返回地址 17 d c v(形参) u(形参) 2(形参个数)
12
11 10 9
返回地址
5 i c 0 0 返回地址 0 x a 0
25
24 23 22
8
7 6 5 4 3 2
21
20 19 18 17
11
返回地址 11
1
0
返回地址
0
25
9.5 嵌套过程语言的栈式实现
31
9.5 嵌套过程语言的栈式实现
2.Par T T——为过程
⇒为了使得过程T工作时能够知道过程P的display,必须在P把 T作为实参传递给Q的时候把P自身的display地址也传过去。 即:过程P中的par T的作用可刻画为建立如下所示的两个相继 临时单元: 第一个临时单元B1:过程T的入口地址; 第二个临时单元B2:现行的display地址。; 然后执行(i+1)[TOP]:=addr(B1) 把第一临时单元B1的地址传给Q
8
9.2 运行时存储器的划分
三、存储分配策略 1.静态存储分配策略
编译原理及编译程序构造部分课后答案
符号表管理词法分析程序语法分析程序语义分析、生成中间代码代码优化出错处理第一章练习12、典型的编译程序可划分为哪几个主要的逻辑部分?各部分的主要功能是什么?典型的编译程序具有7个逻辑部分:第二章练习2.24. 试证明:A+ =AA*=A*A证:T A*=A0U A+, A+=A1U A2U-U An U…得: A*=A0U A1U A2U-U An U…AA*=A (A0U A1U A2U-U An U…)=AA0U AA1U AA2U-U A An U …=A U A2U A3U An +1U …= A+同理可得:A*A =(A0U A1U A2U-U An U …)A=A0 A U A1A U A2A U…U An A U… =A U A2U A3U An+1U …= A+因此:A+ =AA*=A*A练习 2.3 1•设G[〈标识符〉]的规则是:〈标识符〉::=a|b|c|〈标识符〉a| 〈标识符〉c|〈标识符〉0| 〈标识符〉1试写出VT 和VN,并对下列符号串a,abO,aOcO1,Oa,11,aaa给出可能的一些推导解:VT ={a,b,c,0,1,} VN ={〈标识符〉}(1) 不能推导出ab0,11,0a(2) 〈标识符〉=>a(3) 〈标识符〉=>〈标识符〉1=>〈标识符〉01 =>〈标识符〉c01 =>〈标识符〉0c01=> a0c01 (4)〈标识符〉=>〈标识符〉a=>〈标识符〉aa=>aaa2.写一文法,其语言是偶整数的集合解:G[v偶整数>]:<偶整数>::= <符号><偶数字>| <符号><数字串><偶数字><符号> ::二 + | —| £<数字串>::= <数字串><数字>|<数字><数字> ::= <偶数字>| 1 | 3 | 5 | 7 | 9<偶数字> ::=0 | 2 | 4 | 6 | 84. 设文法G 的规则是:〈A〉::=b<A>| cc试证明:cc, bcc, bbcc, bbbc& L[G]证:(1)〈 A>=>cc(2)〈A〉=>b〈A〉=>bcc(3)〈A>=>b〈A>=>bb〈A>=>bbcc(4)〈A>=>b〈A>=>bb〈A>=>bbb〈A>=>bbbcc又T cc, bcc, bbcc, bbbcc E Vt*二由语言定义,cc, bcc, bbcc, bbbcdE L[G]5 试对如下语言构造相应文法:(1){ a(bn)a | n=0,1,2,3,……},其中左右圆括号为终结符。
编译原理及编译程序构造答案
编译原理及编译程序构造答案编译原理及编译程序构造答案【篇一:编译原理课后习题答案】译程序在逻辑功能上由哪几部分组成?答:编译程序主要由以下几个部分组成:词法分析、语法分析、语义分析、中间代码生成、中间代码优化、目标代码生成、错误处理、表格管理。
2. 实现编译程序的主要方法有哪些?答:主要有:转换法、移植法、自展法、自动生成法。
3. 将用户使用高级语言编写的程序翻译为可直接执行的机器语言程序有哪几种主要的方式?答:编译法、解释法。
4. 编译方式和解释方式的根本区别是什么?答:编译方式:是将源程序经编译得到可执行文件后,就可脱离源程序和编译程序单独执行,所以编译方式的效率高,执行速度快;解释方式:在执行时,必须源程序和解释程序同时参与才能运行,其不产生可执行程序文件,效率低,执行速度慢。
1第二章1. 乔姆斯基文法体系中将文法分为哪几类?文法的分类同程序设计语言的设计与实现关系如何?答:1)0型文法、1型文法、2型文法、3型文法。
2)2. 写一个文法,使其语言是偶整数的集合,每个偶整数不以0为前导。
答:z?sme | bs?1|2|3|4|5|6|7|8|9 m?? | d | md d?0|s b?2|4|6|8 e?0|b n? d|nd d? 0|1|2|3|4|5|6|7|8|9请给出句子123、301和75431的最右推导和最左推导。
答:n?nd?n3?nd3?n23?d23?123n?nd?ndd?ddd?1dd?12d?123 n?nd?n1?nd1?n01?d01?301 n?nd?ndd?ddd?3dd?30d?301n?nd?n1?nd1?n31?nd31?n431?nd431?n5431?d5431?75431 n?nd?ndd?nddd?ndddd?ddddd?7dddd?75ddd?754dd?7543 d? 754313. 设文法g为:4. 证明文法 s?ises|is| i是二义性文法。
编译原理课后习题答案解析+清华大学出版社第二版
计算机执行用高级语言编写的程序有哪些途径它们之间的主要区别是什么
答案:计算机执行用高级语言编写的程序主要途径有两种,即解释与编译。 像 Basic 之类的语言,属于解释型的高级语言。它们的特点是计算机并不事先对高级语
言进行全盘翻译,将其变为机器代码,而是每读入一条高级语句,就用解释器将其翻译为一 条机器代码,予以执行,然后再读入下一条高级语句,翻译为机器代码,再执行,如此反 复。
第2题
若 PL/0 编译程序运行时的存储分配策略采用栈式动态分配,并用动态链和静态链的方式分 别解决递归调用和非局部变量的引用问题,试写出下列程序执行到赋值语句 b∶ =10 时运行 栈的布局示意图。 var x,y; procedure p; var a; procedure q; var b; begin (q) b∶ =10; end (q); procedure s; var c,d; procedure r; var e,f; begin (r) call q; end (r); begin (s) call r; end (s); begin (p) call s;
(2) 数组下标越界 (3) 使用的函数没有定义 (4) 在数中出现非数字字符
答案: (1) 语法分析 (2) 语义分析 (3) 语法分析 (4) 词法分析
第5题
编译程序大致有哪几种开发技术
答案:
(1) 自编译:用某一高级语言书写其本身的编译程序。 (2) 交叉编译:A 机器上的编译程序能产生 B 机器上的目标代码。 (3) 自展:首先确定一个非常简单的核心语言 L0,用机器语言或汇编语言书写出它的
第6题
给出对 PL/0 语言作如下功能扩充时的语法图和 EBNF 的语法描述。 (1) 扩充条件语句的功能使其为: if〈条件〉then〈语句〉[else〈语句〉] (2) 扩充 repeat 语句为: repeat〈语句〉{;〈语句〉}until〈条件〉
最新编译原理(课后习题答案ppt课件
10
(b) 试对于句子 not ( true or false) 构造一棵分析树.
bexpr bterm bfactor not bfactor
a S b S
(d) 此文法产生的语言是什么?
由相同个数的a和b组成的字符串.
9
1.3 考虑文法 bexpr bexpr or bterm | bterm bterm bterm and bfactor | bfactor bfactor not bfactor | ( bfactor ) | true | false
(a) 0 ( 0 | 1)* 0 由0和1组成且以0开始和结束的符号串全体.
(b) ( ( | 0 ) 1* ) * 由0和1组成的符号串全体.
(c) ( 0 | 1 )* 0 ( 0 | 1) ( 0 | 1) 由0和1组成且以000,001,010或011结束的符号串全体. 长度大于等于3且倒数第3个字符为0的01符号串全体.
16
3.4 对于下列语言分别写出它们的正规表达式:
(a) 英文字母组成的所有符号串, 要求符号串中顺序包含 五个元音字母. 令letter={非元音的英文字母} letter* (a|A) letter* (e|E) letter* (i|I) letter* (o|O) letter* (u|U) letter*
18
(e) 带有偶数个0和奇数个1的由0和1组成的符号串全体. E为带有偶数个0和1的由0和1组成的符号串全体. 即 ( 00 | 11)* ( ( 01 | 10 ) ( 00 | 11)* ( 01 | 10 ) ( 00 | 11)* )* E1E|E0E1E0E
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第九章 小型编译程序介绍
上述编译过程的五个阶段是编译程序工作时的动 态特征,编译程序的结构可以按照这五个阶段的任务 分模块进行设计。编译程序的结构示意如图9-1所示。
我们设计的小型编译程序包含除优化以外的其余 各阶段。
第九章 小型编译程序介绍
9.2 小型编译程序关于高级语言的规定
高级语言程序具有四种基本结构:顺序结构﹑选 择结构﹑循环结构和过程。为了便于掌握编译的核心 内容,突出重点,简化编译程序的结构,同时又涵盖 高级语言程序的基本结构,我们选取赋值语句﹑if语句 和while语句作为前三种结构的代表,略去了过程结构。 实际上,上述三种语句已经基本满足了高级语言的程 序设计。因此,我们仅考虑由下面产生式所定义的程 序语句:
源程序
词法分析器
单词符号
表
语法分析器
出
格
语法单位
错
中间代码生成器
管
处
四元式
理
优化
理
四元式 目标代码生成器
目标程序
图9-1 编译程序结构示意
第九章 小型编译程序介绍
第四阶段为优化。优化的任务在于对前阶段产生 的中间代码进行加工变换,以期在最后阶段能产生出 更为高效(节省时间和空间)的目标代码。
第五阶段为目标代码生成。这一阶段的任务是把 中间代码(或经优化处理之后)变换成特定机器上的绝对 指令代码或可重新定位的指令代码或汇编指令代码。 这一阶段实现了最后的翻译,它的工作有赖于硬件系 统结构和机器指令含义。
第一阶段为词法分析。词法分析的任务是输入源 程序,对构成源程序的字符串进行扫描和分解,识别 出一个个单词符号,如保留字、标识符、常数、算符 和界符等。
第九章 小型编译程序介绍
第二阶段为语法分析。语法分析的任务是在词法 分析的基础上,根据语言的语法规则(文法规则)把单词 符号串分解成各类语法单位(语法范畴),如“短语”、 “子句”、“句子”、“程序段”和“程序”。通过 语法分析确定整个输入串是否构成一个语法上正确的 “程序”。
第九章 小型编译程序介绍
S→if B then S else S ︱while B do S ︱begin L end︱A L→S;L︱S A→i:=E B→B∧B︱B∨B︱¬ B︱(B) ︱i rop i︱i E→E+E︱E*E︱(E) ︱i
第九章 小型编译程序介绍
其中,各非终结符的含义如下: S——语句; L——语句串; A——赋值句; B——布尔表达式; E——算术表达式。
end#~
第九章 小型编译程序介绍
9.3 小型编译程序关于单词的内部定义
由于我们规定的程序语句中涉及单词较少,故在词 法分析阶段忽略了单词输入错误的检查,而将编译程序 的重点放在中间代码生成阶段。词法分析器的功能是输 入源程序,输出单词符号。我们规定输出的单词符号格 式为如下的二元式:
(单词种别,单词自身的值) 我们对常量,变量,临时变量,保留关键字(if、 while、begin、end、else、then、do等),关系运算符,逻 辑运算符,分号,括号等,规定其内部定义如表9-1所示。
第九章 小型编译程序介绍
符 s y _ if sy _then s y _ els e s y _ w h ile s y _ b egin sy _do sy _end a s em ico lo n e jin gh ao S L tem p sy EA EO p lu s t im es becom es op _and op _or op _not ro p lp aren t rp arent id en t in t co n s t
表9-1 关于单词的内部定义
号
种别编码
说
明
0
保 留 字 if
Hale Waihona Puke 1保 留 字 then
2
保 留 字 els e
3
保 留 字 w h ile
4
保 留 字 b egin
5
保 留 字 do
6
保 留 字 end
第三阶段为中间代码产生。按语言的语义将语法 分析出来的语法单位翻译成中间代码。一般而言,中 间代码是一种独立于具体硬件的记号系统,但它与计 算机的指令形式有某种程度的接近,或者能够比较容 易地把它变换成计算机的机器指令。常用的中间代码 有四元式、三元式、间接三元式和逆波兰记号等。
第九章 小型编译程序介绍
我们规定的程序是由一条语句或由begin和end嵌套 起来的复合语句组成的,并且规定在语句末要加上 “#~”表示程序结束。下面给出的是符合规定的程序示 例:
begin
A:=A+B*C;
C:=A+2;
第九章 小型编译程序介绍
while A<C and B<D do while A>B do if M=N then C:=D else while A<=D do A:=D
第九章 小型编译程序介绍
各终结符的含义如下: i ——整型变量或常数,布尔变量或常数; rop ——六种关系运算符的代表; ; ——起语句分隔符作用; := ——赋值符号; ¬ ——逻辑非运算符“not”; ∧ ——逻辑与运算符“and”;
第九章 小型编译程序介绍
∨ ——逻辑或运算符“or”; + ——算术加运算符;
第九章 小型编译程序介绍
第九章 小型编译程序介绍
9.1 小型编译程序结构 9.2 小型编译程序关于高级语言的规定 9.3 小型编译程序关于单词的内部定义 9.4 小型编译程序的LR分析表 9.5 小型编译程序执行过程
第九章 小型编译程序介绍
9.1 小型编译程序结构
编译程序的工作贯穿于从输入源程序开始到输出 目标程序为止的整个过程,是非常复杂的。一般来说, 整个过程可以划分成五个阶段:词法分析、语法分析、 中间代码生成、优化和目标代码生成。
* ——算术乘运算符; ( ——左括号;
) ——右括号。 注意,六种关系运算符分别为 <:小于 <=:小于等于 <>:不等于 >:大于 >=:大于等于 =:等于
第九章 小型编译程序介绍
关于表达式的运算,我们规定由高到低优先顺序 为算术运算、关系运算、布尔运算;并且服丛左结合 规则。算术运算符优先级的顺序依次为 “( )”﹑“*” ﹑“+” ; 布 尔 运 算 符 优 先 级 的 顺 序 依 次 为 “¬ ”﹑“∧”﹑“∨”;六个关系运算符优先级相同。