编译原理答案主编张晶
编译原理第二版课后习答案教学文稿

编译原理第二版课后习答案《编译原理》课后习题答案第一章第 1 章引论第 1 题解释下列术语:(1)编译程序(2)源程序(3)目标程序(4)编译程序的前端(5)后端(6)遍答案:(1)编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语言,则此翻译程序称为编译程序。
(2)源程序:源语言编写的程序称为源程序。
(3)目标程序:目标语言书写的程序称为目标程序。
(4)编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与目标机无关。
通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符号表管理等工作。
(5)后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,即目标代码生成,以及相关出错处理和符号表操作。
(6)遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。
第 2 题一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程序的总体结构图。
答案:一个典型的编译程序通常包含 8 个组成部分,它们是词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和错误处理程序。
其各部分的主要功能简述如下。
词法分析程序:输人源程序,拼单词、检查单词和分析单词,输出单词的机内表达形式。
语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。
语义分析程序:进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表中。
中间代码生成程序:按照语义规则,将语法分析程序分析出的语法单位转换成一定形式的中间语言代码,如三元式或四元式。
中间代码优化程序:为了产生高质量的目标代码,对中间代码进行等价变换处理。
目标代码生成程序:将优化后的中间代码程序转换成目标代码程序。
表格管理程序:负责建立、填写和查找等一系列表格工作。
编译原理课后习题答案+清华大学出版社第二版

用以引用非局部(包围它的过程)变量时,寻找该变量的地址。 DL: 动态链,指向调用该过程前正在运行过程的数据段基地址,用以过程执行结束释放
数据空间时,恢复调用该过程前运行栈的状态。 RA: 返回地址,记录调用该过程时目标程序的断点,即调用过程指令的下一条指令的地
编译程序大致有哪几种开发技术?
答案:
(1)自编译:用某一高级语言书写其本身的编译程序。 (2)交叉编译:A 机器上的编译程序能产生 B 机器上的目标代码。 (3)自展:首先确定一个非常简单的核心语言 L0,用机器语言或汇编语言书写出它的编
译程序 T0,再把语言 L0 扩充到 L1,此时 L0⊂ L1 ,并用 L0 编写 L1 的编译程序 T1,再把语 言 L1 扩充为 L2,有 L1 ⊂ L2 ,并用 L1 编写 L2 的编译程序 T2,……,如此逐步扩展下 去, 好似滚雪球一样,直到我们所要求的编译程序。 (4)移植:将 A 机器上的某高级语言的编译程序搬到 B 机器上运行。
(main).
答案: 程序执行到赋值语句 b∶=10 时运行栈的布局示意图为:
1
《编译原理》课后习题答案第二章
第 3题 写出题 2 中当程序编译到 r 的过程体时的名字表 table 的内 容。
name
kind
level/val
adr
size
答案:
题 2 中当程序编译到 r 的过程体时的名字表 table 的内容为:
盛威网()专业的计算机学习网站
2
《编译原理》课后习题答案第一章
合实现方案,即先把源程序翻译成较容易解释执行的某种中间代码程序,然后集中解释执行 中间代码程序,最后得到运行结果。
编译原理张晶版 第七章 语法制导翻译和中间代码生成

(1)s=s0
(2)s=s1 (3)s=ε
课程名称
第七章 语法制导翻译和中间代码生成(22)
输入输出对可由(,)表示,其中是输入句子形式而是输出句子形 式。
(S,S)开始用产生式s0s来扩展得到(0S,S0).
再用一次规则(1),得到(00S,S00)。 再用规则(2),就得到(001S,S100). 然后应用规则(3)并得到(001,100)。
L id
T.type=integer T.type:=real
L1.in:=L.in addtype(id.entry,L.in) addtype(id.entry,L.in)
课程名称
第七章 语法制导翻译和中间代码生成(17)
Real id1,id2,id3
D T.type=real real L.in= real L.in= real , id3
E T T F F
T T1 * F F (E) digit
设表达式为3*5+4,则语义动作打印数值19
. L
E.val=19 E.val=15
+
T.val=3 F.val=3 digit.lexval=3 F.val=5
*
F.val=4
digit.lexval=4 digit.lexval=5
课程名称
第七章 语法制导翻译和中间代码生成(23)
课程名称
第七章 语法制导翻译和中间代码生成(3)
属性文法 表达式文法 E—>T+T| T or T T—>n | b ET1 + T2 { T1.type = int T2.type= T1.type E.type :=int} E T1 or T2 { T1.type = bool T2.type= T1.type E.type :=bool} T n { T.type := int} T b { T.type := bool}
第1章编译原理答案(主编张晶).

编译原理与其它课程关系
操作系统
控制对象
数据结构
编译理论
基础
素材
离散数学
自动机和形式语言
要求先学习以下课程
1.程序设计语言 2.算法与数据结构:栈分配、堆分配、静态分配等各种存 储分配方式。线性表、二叉查找树、哈希表等多种数据结 构。 3.离散数学:集合论与数理逻辑是进一步学习形式语言与 自动机理论的数学基础。
最好学习过或同时学习以下课程
1.软件工程:掌握大型程序设计以及工程化的软件生产方 法。 2.形式语言与自动机:相当于本课程中词法分析与语法分 析的理论基础。
目 录
•第一章 •第二章 •第三章 •第四章 •第五章 •第六章 引言 文法和语言 词法分析 语法分析—自顶向下分析方法 语法分析—自底向上分析方法 语法分析—LR方法
Compiler
面向机器代码 汇编 装配 目标程序代码
源程序的编译和运行
编译或汇编阶段
源程序 编译程序 或汇编程序 目标程序
运行阶段
输入数据
目标程序 + 运行子程序
输出数据
1.1.3 解释程序
解释程序(Interpreter)(类似于口译,不生成目标代码) 对源程序进行解释执行的程序。
工作过程 源程序
综合
编译过程
符号表管理
源程序
词 法 分 析
语 法 分 析
语 义 分 析
优
化
目 标 代 码 生 成
目标程序
出错处理
1.2.1 词法分析
任务
输入源程序;扫描、分解字符串,识别出一 个个单词(定义符、标识符、运算符、界符、 常数)
所做转换
源程序字符串
单词符号
编译原理张晶版 第四章 自上而下语法分析

1、消除左递归
•1) 什么是左递归 —左递归:文法存在产生式 P + Pa —直接左递归: P —间接左递归:P Pa Aa ,A + Pb
•2)消除左递归
—消除直接左递归 —消除间接左递归
第四章 自上而下语法分析(23)
第二节 自上而下分析法的一般问题 三、不带回溯的自上而下分析算法
2、消除直接左递归
第四章 自上而下语法分析(44)
第三节 预测分析程序与LL(1)文法 二、求串a的终结首符集和非终结符A的随符集
例:对如下文法G(已加上编号)
1. E
4. T 7. F
TE’
FT’ i
2. E’
5. T’ 8. F
+TE’
*FT’ (E)
3.E’
6.T’
e
e
求各非终结符号的终结首符集和随符集
第四章 自上而下语法分析(45)
第四章 自上而下语法分析(47)
第三节 预测分析程序与LL(1)文法 二、求串a的终结首符集和非终结符A的随符集
例:对如下文法G(已加上编号)
1. E
4. T 7. F
TE’
FT’ i
2. E’
5. T’ 8. F
+TBiblioteka ’*FT’ (E)3.E’
6.T’
e
e
求各非终结符号的终结首符集和随符集
第四章 自上而下语法分析(48)
第四章 自上而下语法分析(40)
第三节 预测分析程序与LL(1)文法 三、构造预测分析表
1. 基本思想 1)若A a是一个产生式,a ∈ First(a),那么当A 是栈顶符号且将读入a时,选择a取代A匹配成功的 希望最大,故,M[A,a]元素为A a 2)若A a而a=e,或a + e;当A是栈顶符号且将读 入a时,若a ∈ Follow(A),则栈顶的A应被e匹配; 此时读头不前进,让A的随符与读头下的符号进行 匹配,这样输入串匹配成功的可能最大,故M[A,a] 元素为A a(这里a=e或a + e)
编译原理(主编张晶)5

输入符号串
abbcde# bbcde# bcde# bcde# cde# cde# de#
动作
移进 移进 归约(P→b) 移进 归约(P→Pb) 移进 移进
S P Q
8)
# aPcd
e#
e# # #
归约(Q→d)
移进 归约 接受
9) #aPcQ 10) #aPcQe 11) #S
P
a b b c d e
定理: 算符优先句型的最左素短语是描述下列条件的最左素短语: ai-1< Niai …Njaj Nj+1 > aj+1 ai=ai+1,=… aj-1= aj
1. 扫描自左向右,直到扫到第一 个>,停止扫描。 2. 开始找最左素短语(自右向左 找第一个<)
长度为1,ai-1<ai>ai+1 长度>1,内部关系为 =
2. 求“ < ”、“ > ”
对形如A→…aB…的产生式, a < FIRSTVT(B)
对形如A→…Bb…的产生式, LASTVT(B) >b
•
重新计算 例:教材P76 5.4
构造优先关系表----(句型中相邻的终结符号) 总结:
•
• •
计算所有非终结符的FIRSTVT、 LASTVT
计算=,<, > 填表 终结符号
最左素短语 规约符号
T*F T+T i E+F
T E F E
3、简单优先分析算法
1. 根据文法构造优先关系矩阵。 2. 设有符号栈S,如果栈顶符号 < = 输入符号,进栈;否则停 止进栈,在栈顶找最左素短语规约。 3. 直到分析完所有输入符号,栈中只剩文法的开始符号,则分 析成功,否则分析失败。
编译原理张晶版 第一章 概论

-- Fortran、Pascal、C 语言等
特点:不依赖具体机器,移植性好、对用户要求低、 易使用、易维护等。
用高级语言编制的程序,计算机不能立即执行, 必须通过一个“翻译程序”加工,转化为与其等价的 机器语言程序,机器才能执行。
这种翻译程序,称之为“编译程序”。
第一章 概论(21)
Compiler
第一章 概论(19)
1.1什么是编译程序
程序设计语言的发展
汇编语言
C7 06 0000 0002 MOV x, 2
面向用户 的语言
x =2
面向问题 的语言
低级语言
高级语言
第一章 概论(20)
•低级语言(Low level Language)
字位码、机器语言、汇编语言
特点:与特定的机器有关,功效高,但使用复杂、 繁琐、费时、易出错
•源程序
用汇编语言或高级语言编写的程序称为源程序。
• 目标程序
用目标语言所表示的程序。 目标语言:可以是介于源语言和机器语言之间的 “中间语言”,可以是某种机器的机器语言,也可以是 某机器的汇编语言。
• 翻译程序
将源程序转换为目标程序的程序称为翻译程序。 它是指各种语言的翻译器,包括汇编程序和编译程序, 是汇编程序、编译程序以及各种变换程序的总称
第一章 概论(24)
Compiler
源程序的编译和运行 •编译或汇编阶段
源程序
•运行阶段
编译程序 或
汇编程序
输入数据
目标程序 +
运行子程序
目标程序 输出数据
第一章 概论(25)
Compiler
程序设计语言的转换 • 翻译
—是指能把某种语言的源程序,在不改变语义的条件下,转换 成另一种语言程序—目标语言程序
第3章编译原理答案(主编张晶)

others *
1/
2*
3* 4/ others
5
others others
all
6 all
others *
1/
2*
3* 4/ others
5
状态1:注释开始状态。 状态2:进入注释体前的中间状态。 状态3:表明目前正在注释体中的状态。 状态4:离开注释前的中间状态。 状态5:注释结束状态,即接受状态。
(1)分析和识别单词及属性, 包括识别语言的关键字、标识符、常数、运算符等;
(2)跳过各种分隔符,如空格,回车,制表符等; (3)删除注释; (4)进行词法检查,报告所发现的错误; (5)建立符号表。
main( )/*ADD*/ {int x=10,y=20,sum; sum=x+y; }
词法分析
正则表达式也是描述单词的重要工具。
【例2】设Σ={a,b}
正规式 ba* a(a|b)* (a|b)*abb (a|b)*(aa|bb) (a|b)* (aa|ab|ba|bb) * (a|b)(a|b)(a|b) *
正规集 所有以b为首后跟任意多个a的符号串 所有以a为首的符号串 所有以abb为尾的a,b符号串 所有含有两个相继的a或相继的b的符号串 空串和任何长度为偶数的符号串 任何长度大于等于2的符号串
转换
正规文法
main、(、)、{、int、 x、=、10、,、y、=、 20、,、sum、;、sum、 =、x、+、y、;、}
词法分析程序的设计与实现?
词法规则
状态图
词法分析程序
为识别单词而专门设计的有向图, 是设计词法分析程序的一种好途径。
(1)根据词法规则写出正规文法; (2)将正规文法转换成状态图; (3)将状态图转换成流程图。