编译原理与实践 第六 七章 答案

合集下载

编译原理课后习题答案-清华大学-第二版

编译原理课后习题答案-清华大学-第二版

《编译原理》课后习题答案第一章
是哪种方式,其加工结果都是源程序的执行结果。目前很多解释程序采取上述两种方式的综 合实现方案,即先把源程序翻译成较容易解释执行的某种中间代码程序,然后集中解释执行 中间代码程序,最后得到运行结果。
广义上讲,编译程序和解释程序都属于翻译程序,但它们的翻译方式不同,解释程序是 边翻译(解释)边执行,不产生目标代码,输出源程序的运行结果。而编译程序只负责把源 程序翻译成目标程序,输出与源程序等价的目标程序,而目标程序的执行任务由操作系统来 完成,即只翻译不执行。
好似滚雪球一样,直到我们所要求的编译程序。 (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)

(完整版)哈工大编译原理习题及答案

(完整版)哈工大编译原理习题及答案

何谓源程序、目标程序、翻译程序、编译程序和解释程序它们之间可能有何种关系一个典型的编译系统通常由哪些部分组成各部分的主要功能是什么选择一种你所熟悉的程序设计语言,试列出此语言中的全部关键字,并通过上机使用该语言以判明这些关键字是否为保留字。

选取一种你所熟悉的语言,试对它进行分析,以找出此语言中的括号、关键字END以及逗号有多少种不同的用途。

试用你常用的一种高级语言编写一短小的程序,上机进行编译和运行,记录下操作步骤和输出信息,如果可能,请卸出中间代码和目标代码。

第一章习题解答1.解:源程序是指以某种程序设计语言所编写的程序。

目标程序是指编译程序(或解释程序)将源程序处理加工而得的另一种语言(目标语言)的程序。

翻译程序是将某种语言翻译成另一种语言的程序的统称。

编译程序与解释程序均为翻译程序,但二者工作方法不同。

解释程序的特点是并不先将高级语言程序全部翻译成机器代码,而是每读入一条高级语言程序语句,就用解释程序将其翻译成一段机器指令并执行之,然后再读入下一条语句继续进行解释、执行,如此反复。

即边解释边执行,翻译所得的指令序列并不保存。

编译程序的特点是先将高级语言程序翻译成机器语言程序,将其保存到指定的空间中,在用户需要时再执行之。

即先翻译、后执行。

2.解:一般说来,编译程序主要由词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序、目标代码生成程序、信息表管理程序、错误检查处理程序组成。

3.解:C语言的关键字有:auto break case char const continue default do double else enum externfloat for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while。

编译原理第三版课后习题答案

编译原理第三版课后习题答案

编译原理第三版课后习题答案编译原理是计算机科学中的一门重要课程,它研究的是如何将高级程序语言转换为机器语言的过程。

而《编译原理》第三版是目前被广泛采用的教材之一。

在学习过程中,课后习题是巩固知识、提高能力的重要环节。

本文将为读者提供《编译原理》第三版课后习题的答案,希望能够帮助读者更好地理解和掌握这门课程。

第一章:引论习题1.1:编译器和解释器有什么区别?答案:编译器将整个源程序转换为目标代码,然后一次性执行目标代码;而解释器则逐行解释源程序,并即时执行。

习题1.2:编译器的主要任务是什么?答案:编译器的主要任务是将高级程序语言转换为目标代码,包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等过程。

第二章:词法分析习题2.1:什么是词法分析?答案:词法分析是将源程序中的字符序列划分为有意义的词素(token)序列的过程。

习题2.2:请给出识别下列词素的正则表达式:(1)整数:[0-9]+(2)浮点数:[0-9]+\.[0-9]+(3)标识符:[a-zA-Z_][a-zA-Z_0-9]*第三章:语法分析习题3.1:什么是语法分析?答案:语法分析是将词法分析得到的词素序列转换为语法树的过程。

习题3.2:请给出下列文法的FIRST集和FOLLOW集:S -> aAbA -> cA | ε答案:FIRST(S) = {a}FIRST(A) = {c, ε}FOLLOW(S) = {$}FOLLOW(A) = {b}第四章:语义分析习题4.1:什么是语义分析?答案:语义分析是对源程序进行静态和动态语义检查的过程。

习题4.2:请给出下列文法的语义动作:S -> if E then S1 else S2答案:1. 计算E的值2. 如果E的值为真,则执行S1;否则执行S2。

第五章:中间代码生成习题5.1:什么是中间代码?答案:中间代码是一种介于源代码和目标代码之间的表示形式,它将源代码转换为一种更容易进行优化和转换的形式。

编译原理教程课后习题答案——第六章

编译原理教程课后习题答案——第六章

第六章运行时存储空间组织6.1 完成下列选择题:(1) 过程的DISPLAY表中记录了。

a. 过程的连接数据b. 过程的嵌套层次c. 过程的返回地址d. 过程的入口地址(2) 过程P1调用P2时,连接数据不包含。

a. 嵌套层次显示表b. 老SPc. 返回地址d. 全局DISPLAY地址(3) 堆式动态分配申请和释放存储空间遵守原则。

a. 先请先放b. 先请后放c. 后请先放d. 任意(4) 栈式动态分配与管理在过程返回时应做的工作有。

a. 保护SPb. 恢复SPc. 保护TOPd. 恢复TOP(5) 如果活动记录中没有DISPLAY表,则说明。

a. 程序中不允许有递归定义的过程b. 程序中不允许有嵌套定义的过程c. 程序中既不允许有嵌套定义的过程,也不允许有递归定义的过程d. 程序中允许有递归定义的过程,也允许有嵌套定义的过程【解答】(1) b (2) a(3) d (4) b (5) b6.2 何谓嵌套过程语言运行时的DISPLAY表?它的作用是什么?【解答】当过程定义允许嵌套时,一个过程在运行中应能够引用在静态定义时包围它的任一外层过程所定义的变量或数组。

也就是说,在栈式动态存储分配方式下的运行中,一个过程Q可能引用它的任一外层过程P的最新活动记录中的某些数据。

因此,过程Q运行时必须知道它的所有(静态)外层过程的最新活动记录的地址。

由于允许递归和可变数组,这些外层过程的活动记录的位置也往往是变迁的。

因此,必须设法跟踪每个(静态)外层的最新活动记录的位置,而完成这一功能的就是DISPLAY嵌套层次显示表。

也即,每当进入一个过程后,在建立它的活动记录区的同时也建立一张DISPLAY表,它自顶而下每个单元依次存放着现行层、直接外层等,直至最外层(主程序层)等每一层过程的最新活动记录的起始地址。

6.3 (1) 写出实现一般递归过程的活动记录结构以及过程调用、过程进入与过程返回的指令;(2) 对以return(表达式)形式(这个表达式本身是一个递归调用)返回函数值的特殊函数过程,给出不增加时间开销但能节省存储空间的实现方法。

第六七章 作业与习题参考答案

第六七章 作业与习题参考答案

第六七章作业与习题参考答案第六七章作业与习题参考答案编译原理操作参考答案-1-第七章lr分析法问题1已知语法a→ aad | aab |ε判断该文法是否是slr(1)文法,若是构造相应分析表,并对输入串ab#给出分析过程。

语法:a→ aad | aab |ε拓广文法为g′,增加产生式s′→a若产生式排序为:0s'→a1a→aad2a→aab3a→ε由产生式知:first(s')={ε,a}first(a)={ε,a}follow(s')={#}follow(a)={d,b,#}标识活动前缀的LR(0)项集族G'和DFA如下图所示:在i0中:A.→. Aad和a→ AAB是搬入项目,a→ 作为一个归约项,归约冲突中有一个移动,因此给定的语法不是LR(0)语法。

在I0、I2中:follow(a)∩{a}={d,b,#}∩{a}=构造的slr(1)分析表如下:题目1的slr(1)分析表因此,I0和I2中的移入归约冲突可以通过follow集合来解决,因此G是SLR(1)语法。

-2-:编译原理作业参考答案状态012345主题1输入字符串ab#的分析过程文法符号栈剩余输入串(inputleft)ab#....s2b#....r3(a→ε)b#....s5#....r2(a→aab)#....accgotoactionadb#s2r3r3r3a ccs2r3r3r3s4s5r1r1r1r2r2r2gotoa1.3状态栈(statestack)002023023501动作(action)31##a#aa#aab#a分析成功,说明输入串ab是题目1文法的句子如果问题2中有二进制数的定义,语法如下:s→ l、l | ll→ lb | bb→ 0|1(1)试为该文法构造lr分析表,并说明属哪类lr分析表。

(2)给出输入串101.110的分析过程。

解决方案:语法:s→ l、l | ll→ lb | bb→ 0|1拓广文法为g′,增加产生式s′→s若产生式排序为:0s'→s1s→l.l2s→l3l→lb编译原理操作参考答案4L→ b5b→ 06B→ 我从生产公式中知道:第一(s')={0,1}第一(s)={0,1}第一(L)={0,1}第一(b)={0,1}跟随(s')={0,1}跟随(s)={0,1}跟随(L)={,0,1,#跟随(b)={,0,1,#g′的lr(0)项目集族及识别活前缀的dfa如下图所示:-3-在i2中:B→. 0和B→. 1是入住物品和→ L.是减少项目。

《编译原理实践及应用》习题的参考答案

《编译原理实践及应用》习题的参考答案

附录部分习题参考答案第1章参考答案:1,2,3,4,5,6,7解答:略!第2章参考答案:1,2,3:解答:略!4. 解答:A:① B:③ C:① D:②5. 解答:用E表示<表达式>,T表示<项>,F表示<因子>,上述文法可以写为:E → T | E+TT → F | T*FF → (E) | i最左推导:E=>E+T=>E+T+T=>T+T+T=>F+T+T=>i+T+T=>i+F+T=>i+i+T=>i+i+F=>i+i+iE=>E+T=>T+T=>F+T=>i+T=>i+T*F=>i+F*F=>i+i*F=>i+i*i 最右推导:E=>E+T=>E+F=>E+i=>E+T+i=>E+F+i=>E+i+i=>T+i+i=>F+i+i=>i+i+iE=>E+T=>E+T*F=>E+T*i=>E+F*i=>E+i*i=>T+i*i=>F+i*i =>i+i*ii+i+i和i+i*i的语法树如下图所示。

i+i+i、i+i*i的语法树6. 解答:(1) 终结符号为:{or,and,not,(,),true,false}非终结符号为:{bexpr,bterm,bfactor}开始符号为:bexpr(2) 句子not(true or false)的语法树为:7. 解答:(1) 把a n b n c i分成a n b n和c i两部分,分别由两个非终结符号生成,因此,生成此文法的产生式为:S → ABA → aAb|abB → cB|ε(2) 令S为开始符号,产生的w中a的个数恰好比b多一个,令E为一个非终结符号,产生含相同个数的a和b的所有串,则产生式如下:S → aE|Ea|bSS|SbS|SSbE → aEbE|bEaE|ε(3) 设文法开始符号为S,产生的w中满足|a|≤|b|≤2|a|。

编译原理第7章答案

编译原理第7章答案

第七章LR分析法1.已知文法A→aAd|aAb|ε判断该文法是否是SLR(1)文法,若是构造相应分析表,并对输入串ab#给出分析过程。

解:增加一个非终结符S/后,产生原文法的增广文法有:S/→AA→aAd|aAb|ε下面构造它的LR(0)项目集规范族为:02对于I0来说有FOLLOW(A)∩{a}={b,d,#}∩{a}=Φ所以在I0状态下面临输入符号为a时移进,为b,d,#时归约,为其他时报错。

对于I2来说有也有与I0完全相同的结论。

这就是说,以上的移进-归约冲突是可以解决的,因此该文法是SLR(1)文法。

其他SLR(1)分析表为:下面构造它的SLR(1)项目集规范族为:15S→a|^|(T)T→T,S|S(1)构造它的LR(0),LALR(1),LR(1)分析表。

(2)给出对输入符号串(a#和(a,a#的分析过程。

(3)说明(1)中三种分析表发现错误的时刻和输入串的出错位置有何区别。

解:(1)加入非终结符S/,方法的增广文法为:S/→SS→aS→^S→(T)T→T,ST→S下面构造它的LR(0)项目集规范族为:表7.15.1 文法的LR(0)分析表17.若包含条件语句的语句文法可缩写为:S→iSeS|iS|S;S|a其中:i代表if,e代表else,a代表某一语句。

若规定:(1)else与其左边最近的if结合(2);服从左结合试给出文法中i,e,; 的优先关系,然后构造出无二义性的LR分析表,并对输入串iiaea#给出分析过程。

解:加入S/→S产生式构造出增广文法如下:[0] S/→S[1] S→iSeS[2] S→iS[3] S→S;S[4] S→a由习惯可知,定义文法中i,e,;,a4个算符的优先关系为:a>e>i>;。

并且i与;的结合方向均为自左至右。

由上述状态项目集可见:a.状态I1存在移进-归约冲突,由于FOLLOW(S/)∩{;}={#}∩{;}=Φ,所以面临#号时应acc,面临;号时应移进。

编译原理作业题答案编译原理课后题答案

编译原理作业题答案编译原理课后题答案

第二章高级语言的语法描述6、令文法G 6为:N →D|ND D → 0|1|2|3|4|5|6|7|8|9(1)G 6 的语言L (G 6)是什么?(2)给出句子01270127、、34和568的最左推导和最右推导。

解答:思路:由N N →→ D|ND 可得出如下推导N =>=>ND ND ND=>=>=>NDD NDD NDD=>…=>=>…=>=>…=>D D n(n >=1=1))可以看出,N 最终可以推导出1个或多个(也可以是无穷)D ,而D D →→ 0|1|2|3|4|5|6|7|8|9可知,每个D 为0~9中的任一个数字,所以,中的任一个数字,所以,N N N 最终推导出的就是由最终推导出的就是由0~9这10个数字组成的字符串。

(1)G 6 的语言L (G 6)是由0~9这10个数字组成的字符串个数字组成的字符串,,或{0{0,,1,1,……,9}+。

(2)(2)句子句子01270127、、34和568的最左推导分别为的最左推导分别为: : N =>=>ND ND ND=>=>=>NDD NDD NDD=>=>=>NDDD NDDD NDDD=>=>=>DDDD DDDD DDDD=>=>=>0DDD 0DDD 0DDD=>=>=>01DD 01DD 01DD=>=>=>012D 012D 012D=>=>=>0127 0127 N =>=>ND ND ND=>=>=>DD DD DD=>=>=>3D 3D 3D=>=>=>34 34N =>=>ND ND ND=>=>=>NDD NDD NDD=>=>=>DDD DDD DDD=>=>=>5DD 5DD 5DD=>=>=>56D 56D 56D=>=>=>568 568 句子01270127、、34和568的最右推导分别为的最右推导分别为: :N =>=>ND ND ND=>=>=>N7N7N7=>=>=>ND7ND7ND7=>=>=>N27N27N27=>=>=>ND27ND27ND27=>=>=>N127N127N127=>=>=>D127D127D127=>=>=>0127 0127 N =>=>ND ND ND=>=>=>N4N4N4=>=>=>D4D4D4=>=>=>34 34N =>=>ND ND ND=>=>=>N8N8N8=>=>=>ND8ND8ND8=>=>=>N68N68N68=>=>=>D68D68D68=>=>=>568 5687、写一个文法,使其语言是奇数集,且每个基数不以0开头。

编译原理5、6、7章解题小结

编译原理5、6、7章解题小结

编译原理5、6、7章解题小结第一篇:编译原理5、6、7章解题小结第5、6、7章小结几种语法分析方法• 自上而下–递归下降分析法–预测(LL(1))分析法• 自下而上–算符优先分析法– LR分析法:LR(0)、SLR(1)、LR(1)、LALR(1)一、自上而下的语法分析方法1.不带回溯确定的自上而下分析法2.对文法的要求:1)文法非左递归2)LL(1)文法i.LL(1)文法的定义:⌝ LL分析表不含多重元素⌝对A∈VT,A->α|β• FIRST(α)⋂ FIRST(β)=φ• α与β至多只有一个为ε• 若β*⇒ε,则FIRST(α)⋂ FOLLOW(A)=φii.LL(1)文法的两个性质⌝ LL(1)文法不含左递归⌝ LL(1)文法无二义i.将方法G改写成LL(1)文法的方法:⌝消去直接左递归⌝提公共左因子3.根据文法规则构造1)递归下降分析程序的方法2)预测分析表的方法EX1:已知文法G:S->aAbDe | dA->BSD | eB->Sac | cD | εD->Se | ε求:1)每个非终结符的FIRST,FOLLOW集2)判定是否为LL(1)文法。

解:FIRST(S)={a,e};FIRST(B)={a,d,c,ε};FIRST(D)={a,d,ε};FIRST(A)={a,d,c,ε,e};FOLLOW(S)={a,e,d,b,#};FOLLOW(B)={a,e};FOLLOW(D)={a,e,b};FOLLOW(A)={b};FIRST()EX2:已知∑={a,b},用高级语言编写一个能够识别集合L={ anbn | n≥0}的程序。

提示:1、求文法G:S->aSb | ε2、判定文法G能用何种方法做。

二、自下而上的语法分析方法(一)、算符优先分析法1.算符优先分析法的定义2.最左素左语3.确定优先关系,构造优先关系表EX3:已知文法G:S->S;D | DD->D(T)| HT->T+S | SH->a |(S)求:1)求优先关系表2)判定是否为OG、OPG文法。

编译原理课后答案——第七章_目标代码生成

编译原理课后答案——第七章_目标代码生成
第七章 目标代码生成
第七章 目标代码生成
7.1 对下列四元式序列生成目标代码: T=A-B S=C+D
W=E-F
U=W/T V=U*S 其中,V是基本块出口的活跃变量,R0和R1是可用寄存 器。
第七章 目标代码生成 【解答】 简单代码生成算法依次对四元式进行翻译。
我们以四元式T=a+b为例来说明其翻译过程。 汇编语言的加法指令代码形式为 ADD R, X 其中,ADD为加法指令;R为第一操作数,第一操作数必 须为寄存器类型;X为第二操作数,它可以是寄存器类型,也 可以是内存型的变量。ADD R,X指令的含意是:将第一操作数 R与第二操作数相加后,再将累加结果存放到第一操作数所在 的寄存器中。要完整地翻译出四元式T=a+b,则可能需要下面 三条汇编指令:
第七章 目标代码生成 此外,如果必须使用第一条指令,即第一操作数 不在寄存器而是在内存中,且此时所有可用寄存器都 已分配完毕,这时就要根据寄存器中所有变量的待用 信息(也即引用点)来决定淘汰哪一个寄存器留给当前 的四元式使用。寄存器的淘汰策略如下: (1) 如果某寄存器中的变量已无后续引用点且该 变量是非活跃的,则可直接将该寄存器作为空闲寄存 器使用。 (2) 如果所有寄存器中的变量在基本块内仍有引 用点且都是活跃的,则将引用点最远的变量所占用寄 存器中的值存放到内存与该变量对应的单元中,然后 再将此寄存器分配给当前的指令使用。
第七章 目标代码生成 因此,本题所给四元式序列生成的目标代码如下: MOV R0, A SUB R0, C MOV R1, C ADD R1, D /*R1=S*/ /*R0=T*/
MOV S, R1 的值送内存单元S*/
MOV R1, E SUB R1, F SUB R1, R0 MUL R1, S

编译原理课后作业参考答案

编译原理课后作业参考答案

第6章 属性文法和语法制导翻译7. 下列文法由开始符号S 产生一个二进制数,令综合属性val 给出该数的值:试设计求的属性文法,其中,已知B 的综合属性c, 给出由B 产生的二进位的结果值。

例如,输入时,=,其中第一个二进位的值是4,最后一个二进位的值是。

【答案】11. 设下列文法生成变量的类型说明:(1)构造一下翻译模式,把每个标识符的类型存入符号表;参考例。

【答案】第7章 语义分析和中间代码产生1. 给出下面表达式的逆波兰表示(后缀式):3. 请将表达式-(a+b)*(c+d)-(a+b+c)分别表示成三元式、间接三元式和四元式序列。

【答案】间接码表:(1)→(2)→(3)→(4)→(1)→(5)→(6)4. 按节所说的办法,写出下面赋值句A:=B*(-C+D) 的自下而上语法制导翻译过程。

给出所产生的三地址代码。

【答案】5. 按照7.3.2节所给的翻译模式,把下列赋值句翻译为三地址代码: A[i, j]:=B [i, j] + C[A [k, l]] + d [ i+j] 【答案】6. 按7.4.1和节的翻译办法,分别写出布尔式A or ( B and not (C or D) )的四元式序列。

【答案】用作数值计算时产生的四元式: 用作条件控制时产生的四元式:其中:右图中(1)和(8)为真出口,(4)(5)(7)为假出口。

7. 用7.5.1节的办法,把下面的语句翻译成四元式序列:While A<C and B<D do if A=1 then C:=C+1else while A ≦D do A:=A+2; 【答案】第9章 运行时存储空间组织4. 下面是一个Pascal 程序:当第二次( 递归地) 进入F 后,DISPLAY 的内容是什么当时整个运行栈的内容是什么 【答案】第1次进入F 后,运行栈的内容: 第2次进入F 后,运行栈的内容: 109 87 6 5 4 3 2 1 017 16 15 14 13 12 11 10 9 8 7第2次进入F 后,Display 内容为:5. 对如下的Pascal 程序,画出程序执行到(1)和(2)点时的运行栈。

编译原理作业集-第六章-修订(精选.)

编译原理作业集-第六章-修订(精选.)

第六章属性文法和语法制导翻译本章要点1. 属性文法,基于属性文法的处理方法;2. S-属性文法的自下而上计算;3. L-属性文法的自顶向下翻译;4. 自下而上计算继承属性;本章目标掌握和理解属性方法、基于属性文法的处理方法、S-属性文法和自下而上计算、L-属性文法和自顶向下翻译、自下而上计算继承属性等内容。

本章重点1.语法制导翻译基本思想。

2.语义规则的两种描述方法:语法制导的定义和翻译方案。

语法制导的定义没有指明语义规则的计算次序,而翻译方案显式给出语义规则(或叫语义动作)的计算次序和位置。

3.基于属性文法的处理方法,综合属性定义(S属性定义)和L属性定义。

4.设计简单问题的语法制导定义和翻译方案,这是本章的重点和难点。

这种设计可看成是一种程序设计,是一种事件驱动形式的程序设计,因此它比一般的编程要难得多。

这里的事件是句子中各种语法结构的识别。

5.语义规则的三种计算方法:分析树方法、基于规则的方法和忽略规则的方法。

6.S属性的自下而上计算(边语法分析边属性计算,忽略规则的方法)。

7.L属性的自上而下计算(边语法分析边属性计算,忽略规则的方法)。

8.递归计算(先语法分析后属性计算,基于规则的方法)。

本章难点1. 设计简单问题的语法制导定义和翻译方案;作业题一、单项选择题:1. 文法开始符号的所有________作为属性计算前的初始值。

a. 综合属性b. 继承属性c. 继承属性和综合属性d. 都不是2. 对应于产生式A→XY继承属性Y.y的属性计算,可能正确的语义规则是________。

a. A.a:=f(X.x,Y.y);b. )Y.y:=f(A.a,Y.y);c. Y.y:=f(X.x);d. A.a:=f(Y.y);3. 描述文法符号语义的属性有两种,一种称为__ __,另一种称为__ ___。

a. L-属性b. R-属性c. 综合属性d. 继承属性4. 出现在产生式________和出现在产生式________不由所给的产生式的属性计算规则进行计算,而是由其他产生式的属性规则计算或者由属性计算器的参数提供。

编译原理部分课后答案,仅供参考

编译原理部分课后答案,仅供参考

第一章编译程序概述1.1 什么是编译程序编译程序是现代计算机系统的基本组成部分之一,而且多数计算机系统都含有不止一个高级语言的编译程序。

对有些高级语言甚至配置了几个不同性能的编译程序。

1.2编译过程概述和编译程序的结构编译程序完成从源程序到目标程序的翻译工作,是一个复杂的整体的过程。

从概念上来讲,一个编译程序的整个工作过程是划分成阶段进行的,每个阶段将源程序的一种表示形式转换成另一种表示形式,各个阶段进行的操作在逻辑上是紧密连接在一起的。

一般一个编译过程划分成词法分析、语法分析、语义分析、中间代码生成,代码优化和目标代码生成六个阶段,这是一种典型的划分方法。

事实上,某些阶段可能组合在一起,这些阶段间的源程序的中间表示形式就没必要构造出来了。

我们将分别介绍各阶段的任务。

另外两个重要的工作:表格管理和出错处理与上述六个阶段都有联系。

编译过程中源程序的各种信息被保留在种种不同的表格里,编译各阶段的工作都涉及到构造、查找或更新有关的表格,因此需要有表格管理的工作;如果编译过程中发现源程序有错误,编译程序应报告错误的性质和错误发生的地点,并且将错误所造成的影响限制在尽可能小的范围内,使得源程序的其余部分能继续被编译下去,有些编译程序还能自动校正错误,这些工作称之为出错处理。

图1.3表示了编译的各个阶段。

图1.3 编译的各个阶段1.3 高级语言解释系统为了实现在一个计算机上运行高级语言的程序,主要有两个途径:第一个途径是把该程序翻译为这个计算机的指令代码序列,这就是我们已经描述的编译过程。

第二个途径是编写一个程序,它解释所遇到的高级语言程序中的语句并且完成这些语句的动作,这样的程序就叫解释程序。

从功能上说,一个解释程序能让计算机执行高级语言。

它与编译程序的主要不同是它不生成目标代码,它每遇到一个语句,就要对这个语句进行分析以决定语句的含义,执行相应的动作。

右面的图示意了它的工作机理第二章:PL/0编译程序问答第1题PL/0语言允许过程嵌套定义和递归调用,试问它的编译程序如何解决运行时的存储管理。

(完整word版)编译原理第六章答案

(完整word版)编译原理第六章答案

第6章自底向上优先分析第1题已知文法G[S]为:S T a|A |(T)T,S|S(1)计算 G[S]的 FIRSTVT 和 LASTVT。

(2)构造G[S]的算符优先关系表并说明G[S]是否为算符优先文法。

⑶计算G[S]的优先函数。

(4)给出输入串(a,a)#和(a,(a,a))#的算符优先分析过程。

答案:文法展开为:S^aS T AS T (T)T T T,ST T S猱符优先关系表:友情提示:记得增加拓广文法S' T#S#,所以# FIRSTVT(S) , LASTVT(S) # 。

Success!对输入串(a,(a,a) ) #的算符优先分析过程为:栈〔STACK) 为询字符WH恋)剩余输入笊(INPUT_STRING)动作〔ACTION)岸n a.(a.a))# e ill * a 伽)># itove iiima{aa)> Reduce: S—q <a.a)># Move iii( a.a))# Move iiia 讪Move iiia))# Reduce: S—日#(N,(N i a))# \tove iii#(N.(N a Move m粼屈)Reduce: S—R粼N(N.N)Reduce; T—丁占)h【ovE iii)#Reduce: S—*(T) #(N,N )#Reduce: T—*T,S #(N )Move iiiKN) ##Reduce: S—"(T) Success!第2题已知文法G[S]为:S T a|A |(T)T,S|S(1)给出(a,(a,a))和(a,a)的最右推导,和规范归约过程。

⑵ 将⑴和题1中的⑷进行比较给出算符优先归约和规范归约的区另叽答案:(1 ) (n・a)的授右推导过程为: sn(T) =(T.S)=^(T.a)=>(S.a)=>(a.a)(a.(a.a))的最右推导过程为:S=>(T)O(T.S)=(T.(T))=>(r.(r.s))=>(T.(T.a))=>(T.(S.a))=>(T-(a.a))=>(S.(a.a))=>(a.(a.a))(a.(a.a))的规范归约过程:(冇)的规范!H约过阻(2)非终结符无关,只需知道把当前可归约串归约为某一个非终结符,不必知道该非终结符的名字是什么,因此去掉了单非终结符的归约。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

The Exercises of Chapter Six6.2应该在nu m→digit产生式中再加一条语义规则:numd.count=1用来进行初始化。

6.46.7 Consider the following grammar for simple Pascal-style declarations:delc →var-list : typevar-list →var-list, id | idtype →integer | realWrite an attribute grammar for the type of a variable.[Solution]Grammar Rule Semantic Rulesdelc →var-list : type var-list.type = type.typevar-list1 →var-list2, id val-list2.type=var-list1.typeid.type=var-list1.typevar-list →id id.type=var-list.typetype →integer type.type= INTERGERtype →real type.type=REAL6.10 a. Draw dependency graphs corresponding to each grammar rule of Example 6.14 (Page 283) , and for the expression 5/2/2.0.b. Describe the two passes required to compute the attributes on the syntax tree of 5/2/2.0, including a possible order in which the nodes could be visited and the attribute values computed at each point.c. Write pseudcode for procedures that would perform the computations described in part(b). [Solution]a. The grammar rules of Example 6.14S →expexp →exp/exp | num | num.numThe dependency graphs for each grammar rule:S →expval SisFloat etype val expexp →exp / expvalexp →numisFloat etype val expval numexp →num.numisFloat etype val expval num.numThe dependency graphs for the expression: 5/2/2.0val SexpisFloat val num.num(2.0)val num val num(5)(2)b. The first pass is to compute the etype from isFloat.The second pass is to compute the val from etype.The possible order is as follows:val S1221i expisFloat val num.num(2.0)(5)(2)c. The pseudcode procedure for the computation of the isFloat.Function EvalisFloat(T: treenode): BooleanVar temp1, temp2: BooleanBeginCase nodekind of T ofexp:temp1= EvalisFloat(left child of T);if right child of T is not nil thentemp2=EvalisFloat( right child of T)return temp1 or temp2elsereturn temp1;num:return false;num.num:return true;endFunction Evalval(T: treenode, etype:integer): V ALUEVar temp1, temp2: V ALUEBeginCase nodekind of T ofS:Return(Evalval(left child of T, etype));Exp:If etype=EMPTY thenIf EvalisFloat(T) then etype:=FLOAT;Else etype=INT;Temp1=Evalval(left child of T, etype)If right child of T is not nil thenTemp2=Evalval(right child of T, etype);If etype=FLOAT thenReturn temp1/temp2;ElseReturn temp1 div temp2;ElseReturn(temp1);Num:If etype=INTReturn(T.val);ElseReturn(T.val);Num.num:Return(T.val).6.11Dependency graphs corresponding to the numbered grammar rules in 6.4:Dependency graph for the string ‘3 *(4+5) *6:6.21 Consider the following extension of the grammar of Figure 6.22(page 329) to include function declarations and calls:program → var-decls;fun-decls;stmtsvar-decls → var-decls;var-decl|var-declvar-decl → id: type-exptype-exp → int|bool|array [num] of type-expfun-decls → fun id (var-decls):type-exp;bodybody → expstmts → stmts;stmt| stmtstmt → if exp then stmt | id:=expexp → exp + exp| exp or exp | exp[exp]|id(exps)|num|true|false|idexps→ exps,exp|expa.Devise a suitable tree structure for the new function type structure, and write a typeEqualfunction for two function types.b.Write semantic rules for the type checking of function declaration and functioncalls(represented by the rule exp →id(exps)),similar to rules of table 6.10(page 330).[Solution]a. One suitable tree structure for the new function type structure:The typeEqual function for two function type:Function typeEqual-Fun(t1,t2 : TypeFun): BooleanVar temp : Boolean;p1,p2:TypeExpbeginp1:=t1.lchild;p2:=t2.lchild;temp:=true;while temp and p1<>nil and p2<>nil dobegintemp=typeEqual-Exp(p1,p2);p1=p1.sibling;p2=p2.sibling;endif temp then return(typeEqual-Exp(t1.rchild,t2.rchild));return(temp);endb. The semantic rules for type checking of function declaration and function call:fun-decls → fun id (var-decls):type-exp; bodyid.type.lchild:=var-decls.type;id.type.rchild:=type-exp.type;insert(,id.typefun)exp → id(exps)if isFunctionType(id.type) andtypeEqual-Exp(id.type.lchild,exps.type) thenexp.type=id.type.rchild;else type-error(exp)The exercise of chapter seven7.2 Draw a possible organization for the runtime environment of the following C program, similar to that of Figure 7.4 (Page 354).a. After entry into block A in function f.[Solution]a. Global/static area Activation record of main Activation record of f after entering the Block Afpsp7.8 In languages that permit variable numbers of arguments in procedure calls, one way to find the first argument is to compute the arguments in reverse order, as described in section 7.3.1, page 361.a. One alternative to computing the arguments in reverse would be to reorganize the activation record to make the first argument available even in the presence of variable arguments. Describe such an activation record organization and the calling sequence it would need.b. Another alternative to computing the arguments in reverse is to use a third point(besides the sp and fp), which is usually called the ap (argument pointer). Describe an activation record structure that uses an ap to find the first argument and the calling sequence it would need.[Solution]a. The reorganized activation record.Global/static areaActivation record of mainActivation record of g after entering the Block BThe calling sequence will be:(1)store the fp as the control link in the new activation record;(2)change the fp to point to the beginning of the new activation record;(3)store the return address in the new activation record;(4)compute the arguments and store their in the new activation record in order;(5)perform a jump to the code of procedure to be called.The calling sequence will be:(1) set ap point to the position of the first argument.(2) compute the arguments and store their in the new activation record in order;(3)store the fp as the control link in the new activation record;(4)change the fp to point to the beginning of the new activation record;(5)store the return address in the new activation record;(6)perform a jump to the code of procedure to be called.7.15 Give the output of the following program(written in C syntax) using the four parameter methods discussed in section 7.5.#include <stdio.h>int i=0;void p(int x, int y){ x +=1;i +=1;y +=1;}main{ int a[2]={1,1};p(a[i], a[i]);printf(“%d %d\n”, a[0], a[1]);return 0;}[Solution]pass by value: 1, 1pass by reference: 3, 1pass by value-result: 2, 1pass by name: 2, 2。

相关文档
最新文档