编译原理作业集-第六章-修订
编译原理第6章习题答案
1)抽象语法树:
2)四元式序列:
3)三元式序列:
4)间接三元式序列:
6.4.1 向图6-19的翻译方案中加入对应于下列产生式的规则: 1) E E1 * E2 2) E E1 (单目加)
E.addr = E1.addr E.code = E1.code
例如:+3
6.4.2 使用图6-20中的增量式翻译方案重复练习6.4.1
{E.addr = E1.addr}
在增量方式中,gen不仅要构造出一个新的三地址指令,还 要将它添加到至今为止已生成的指令序列之后。
6.4.3 使用使用图6-22所示的翻译方案来翻译下 列赋值语句: 2) x = a[i][j] + b[i][j] 假设w1为数组a的第一维的宽度,w2为数组b 的第一维的宽度,整数宽度为w。第6章习题答案
作业: 6.1.1 6.2.1 6.4.1 6.4.2 6.4.3 6.6.1
6.7.1 (1) 补充习题1
第6章 中间代码生成
6.1.1 为下面的表达式构造DAG ((x+y)-((x+y)*(x-y)))+((x+y)*(x-y))
6.2.1 将算术表达式 a+-(b+c) 翻译成
补充习题1:用本节所给的翻译模式(采用回填)翻译语句: if (a<b || c<d && e<f ) A1 else A2; while (a<b) A3 ; 假定语句序号从100起算,又假定A1、A2、A3语句各生成10条指令。
100 if a<b goto 106 101 goto 102 102 if c<d goto 104 103 goto 117 104 if e<f goto 106 105 goto 117 106 107 . A1 . 115 116 goto 127 117 118 A2 . . 126 127 if a<b goto 129 128 goto 140 129 130 A3 . . 138 139 goto 127 140 141 142 143 144 145
编译原理第6章习题与答案
第6章习题6-1 将下列中缀式改写为逆波兰式。
(1) -A*(B+C)/(D-E)(2) ((a*d+c)/d+e)*f+g(3) a+x≤4∨(c>d*3)(4) a∨b∧c<d*e/f6-2 将下列逆波兰式改写为中缀式。
(1) abc*+(2) abc-*cd+e/-(3) abc+≤a0>∧ab+0≠a0<∧∨6-3 将下列语句翻译成四元式序列。
(1) X:=A*(B+C)+D(2) if A∧(B∨(C∨D)) then S1 else S2(3) while A<C∧B>0 doif A=1 then C:=C+1 else A:=A+26-4 设有二维PASCAL数组A[1··10,1··20]和三维PASCAL数组B[1··10, 1··20,1··30],给出赋值语句A[I,J]:=B[J,I+J,I+1]+X的四元式序列。
第5章习题答案6-1 解:(1) A-BC+*DE-/(2) ad*c+d/e+f*g+(3) ax+4≤cd3*>∨(4) abcde*f/<∧∨6-2 解:(1) a+b*c(2) a*(b-c)-(c+d)/e(3) a≤b+c∧a>0∨a+b≠0∧a<06-3 解:(1) (1) (+,B,C,T1)(2) (*,A,T1 ,T2)(3) (+,T2 ,D,T3)(4) (=,T3 ,0,X)(2) 如下所示:(1) (jnz,A,0,3);(2) (j,0,0,p+1);(3) (jnz,B,0,9);(4) (j,0,0,5);(5) (jnz,C,0,9);(6) (j,0,0,7);(7) (jnz,D,0,9);(8) (j,0,0,p+1);(9) 与S1相应的四元式序列(p) (j,0,0,q)(p+1) 与S2相应的四元式序列(q) …(3) 假设所产生的四元式序列编号从1开始(1) (j<A,C,3)(2) (j,0,0,13)(3) (j>,B,0,5)(4) (j,0,0,13)(5) (j=,A,1,7)(6) (j,0,0,10)(7) (+,C,1,T1)(8) (=,T1 , ,C)(9) (j,0,0,1)(10) (+,A,2,T2)(11) (=,T2 , ,A)(12) (j,0,0,1)(13) …6-4 解:(1) (*,I,20,T1)(2) (+,J,T1,T1)(3) (-,a A,C A ,T2)(4) (+,I,J,T3)(5) (*,J,20,T4)(6) (+,T3 ,T4 ,T4)(7) (+,I,1,T5)(8) (*,T4,30,T6)(9) (+,T5 ,T6 ,T6)(10) (-,a B,C B ,T7)(11) (=[],T7[T6],0,T8)(12) (+,T8 ,X,T9)(13) ([]=,T9 ,0,T2[T1])(注:(1)~(3)是计算下标变量A[I,J]XXX的四元式,T2中存放的是CONSTPART部分,而T1中存放的是VARPART部分,a A表示数组A的首XXX;(4)~(10) 是计算下标变量B[J,I+J,I+1]XXX的四元式,T7中存放的是CONSTPART 部分,而T6中存放的是VARPART部分,a B表示数组B的首XXX。
编译原理教程课后习题答案——第六章
第六章运行时存储空间组织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(表达式)形式(这个表达式本身是一个递归调用)返回函数值的特殊函数过程,给出不增加时间开销但能节省存储空间的实现方法。
现代编译原理--第六章(中间树IRTree含源码)
现代编译原理--第六章(中间树IRTree含源码)这⼀章,就虎书⽽⾔,理论知识点是及其少的,就介绍了为什么要有⼀个中间表⽰树。
看下⾯这张图就能理解为什么了。
由以上可以知道,中间表达式树可以看成是⼀种简化过的汇编语⾔组成的树。
在这个阶段,我们已经抛弃了所有的变量名称和函数名称,使⽤标号以及变量以及临时变量(temp_newtemp)来代替来代替。
,⽽且所有的变量都存储在frame中,也就是说,我们是使⽤frame 来分割代码的,⼀个frame就代表了⼀个函数。
这章的代码量却是挺多的。
在写代码之前,如果不懂整个代码的布局,是很难了解书上那写代码是对应那些功能,以及书上没有给出的代码,我应该这么完善。
那么,我就我⾃⼰的理解来说⼀下到⽬前为⽌(翻译成中间表⽰树以后,编译器的前端就算基本完成了),整个代码的布局是什么样。
⾸先我们从外部读取tiger语⾔编写的源代码,经过由flex和bison⽣成的lex.yy.cpp tiger.tab.cpp tiger.tab.h的处理(词法分析,语法分析),⽣成了抽象语法树,这个语法树的数据结构是在absyn,table,symbol这些⽂件中定义的。
然后我们要抽象语法树转化为中间表⽰树,这个转化过程都是由 semant ⽂件中的函数完成(语义分析)。
semant主要完成了两个任务:对类型检测(类型检测)以及⽣成中间表达树(中间表达树)。
类型检测过程中使⽤到了evn,table,symbol,type中定义的⼀些东西。
⽽转化为中间表⽰树使⽤了translate⽂件中的函数,之所以使⽤这translate⽂件,是为了将树的具体构建过程和语义分析过程分离,这样如果想要⽤另⼀种⽅式表⽰中间表⽰树,可以不动原来semant的代码。
因为在semant定义的函数只能看到以Tr_开头的函数,⽽看不到关于树的任何信息。
⼀棵中间表⽰树是由frame(F 开头),tree(T开头)两部⽂件分组成的,并且这两部分只被translate使⽤。
编译原理作业参考答案
T,
「,ST,
2.利用P76表的LL(1)分析表写出表达式(i + i)*i的预测分析过程。
步骤
符号栈
输入串
所用的产生式
0
#E
(i+i) *i#
1
#E' T
(i+i) *i#
E TE‘
编译程序:把输入的源程序翻译成等价的目标程序(汇编语言或机器语 言),
然后再执行目标程序(先编译后执行),执行翻译工作的程序称为编译程序。
解释程序:以该语言写的源程序作为输入,但不产生目标程序。按源 程序中语句动态顺序逐句的边解释边执行的过程,完成翻译工作的程序称 为解释程序。
2、什么叫“遍”
指对源程序或源程序的中间形式(如单词,中间代码)从头到尾扫描一 次,并作相应的加工处理,称为一遍。
优化:对中间代码进行优化处理。
目标代码生成:把中间代码翻译成目标语言程序。
4、编译程序与解释程序的区别
编译程序生成目标程序后,再执行目标程序;然而解释程序不生成目标 程序,边解释边执行。
5、有人认为编译程序的五个组成部分缺一不可,这种看法正确吗
编译程序的5个阶段中,词法分析,语法分析,语51分析和代码生成生 成是必须完成的。而中间代码生成和代码优化并不是必不可少的。优化的 目的是为了提高目标程序的质量,没有这一部分工作,仍然能够得到目标 代码。
(G)
={
(0 1
29)+)
或L
(G)
={
为数字串}
(2)
最左推导
:N
ND
DD
3D 34
N
ND
NDD
DDD 5DD 56D
568
最右推导
编译原理作业集-第六章-修订
第六章属性文法和语法制导翻译本章要点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. 出现在产生式________和出现在产生式________不由所给的产生式的属性计算规则进行计算,而是由其他产生式的属性规则计算或者由属性计算器的参数提供。
编译原理第六章答案
第6 章自底向上优先分析第1 题已知文法G[S]为:S→a|∧|(T)T→T,S|S(1) 计算G[S]的FIRSTVT 和LASTVT。
(2) 构造G[S]的算符优先关系表并说明G[S]是否为算符优先文法。
(3) 计算G[S]的优先函数。
(4) 给出输入串(a,a)#和(a,(a,a))#的算符优先分析过程。
答案:文法展开为:S→aS→∧S→(T)T→T,ST→S(1) FIRSTVT - LASTVT 表:表中无多重人口所以是算符优先(OPG)文法。
友情提示:记得增加拓广文法 S`→#S#,所以# FIRSTVT(S),LASTVT(S) #。
(3)对应的算符优先函数为:Success!对输入串(a,(a,a))# 的算符优先分析过程为:Success!第2 题已知文法G[S]为:S→a|∧|(T)T→T,S|S(1) 给出(a,(a,a))和(a,a)的最右推导,和规范归约过程。
(2) 将(1)和题1 中的(4)进行比较给出算符优先归约和规范归约的区别。
答案:(2)算符优先文法在归约过程中只考虑终结符之间的优先关系从而确定可归约串,而与非终结符无关,只需知道把当前可归约串归约为某一个非终结符,不必知道该非终结符的名字是什么,因此去掉了单非终结符的归约。
规范归约的可归约串是句柄,并且必须准确写出可归约串归约为哪个非终结符。
第3题:有文法G[S]:S VV T|ViTT F|T+FF )V*|((1) 给出(+(i(的规范推导。
(2) 指出句型F+Fi(的短语,句柄,素短语。
(3) G[S]是否为OPG若是,给出(1)中句子的分析过程。
因为该文法是OP,同时任意两个终结符的优先关系唯一,所以该文法为OPG。
(+(i(的分析过程第4题文法G[S]为:S→S;G|GG→G(T)|HH→a|(S)T→T+S|S(1)构造G[S]的算符优先关系表,并判断G[S]是否为算符优先文法。
(2)给出句型a(T+S);H;(S)的短语、句柄、素短语和最左素短语。
编译原理 第6章习题解答
第六章习题解答6.1根据语法树,得到下述优先关系:E′*(E T′>+ F>* i>*+<T +<F +<i *<(6.2由文法各条产生式,有然后构造<:FIRST={(Z,b),(M,(),(M,a),(L,M)}FIRST+={(Z,b),(M,(),(M,a),(L,M),(L,(),(L,a)}FIRST*=FIRST+∪{(a,a),(b,b),((,(),( ),)),(Z,Z),(M,M),(L,L)}所以<={(b,(),(b,a),((,M),((,(),((,a))再构造>:LAST={(Z,b),(M,L),(M,a),(L,))}LAST+={(Z,b),(M,L),(M,a),(M,))(L,))}(LAST+)T={(b,Z),(L,M),(a,M),( ),M},( ),L}}(LAST+)T所以>={(L,b),(L,a),(a,b),(a,a),( ),b),(),a)}将这三种关系合并得到表6.1。
利用此算法分析符号串b((aa)a)b是否是文法G[Z]的句子,过程如表6.2所示。
分析成功,符号串b((aa)a)b是文法G[Z]的句子。
表6.1 G[Z]的简单优先关系矩阵表6.2 简单优先分析过程6.3由优先关系矩阵中所示的优先关系:a>c a<b b>b b以及优先函数的定义,应该有f(a)>g(c),f(a)<g(b),f(b)>g(b),f(b)=g(c)则有f(a)>g(c)=f(b)>g(b)>f(a)矛盾。
所以该文法不存在优先函数。
6.4①定义集合∑=N,R={(x,y)∣x,y∈∑,x是y的因子}②定义集合∑=N,R={(x,y)|x,y∈∑,x和y均能被3整除}③定义集合∑=N-{1},R={(x,y)|x,y∈∑,x和y有大于1的公约数}④定义集合∑=N,R为关系“=”6.5关系可以用集合定义,也可以用布尔矩阵表示。
《编译原理》第6章 (1)
…a
a >b
24
由定义直接构造:
预备知识:
定义两个集合:
+ + FIRSTVT(B)={b|B b…或B Cb…},
+ + LASTVT(B)={b|B …b或B …bC}
即最后一个终结符 即第一个终结符
25
三种优先关系的计算为: a)≡关系 条件:A…ab... A…aBb… b) <关系 条件:A…aB… bFIRSTVT(B) 结论:a<b c) >关系 条件:A…Bb… aLASTVT(B) 结论:a>b
20
定义:设G是不含产生式的算符文法,若G中任何两个终 结符号之间至多有一种优先关系存在,则G是一个算符 优先文法OPG。 注:不允许有ab、 a≡b、 ab 中的两种同时存在 要完成运算符间优先级的比较,最简单的办法是先定义 各种可能相继出现的运算符的优先级,并将其表示成矩 阵形式,即得到一个算符优先关系表。在分析过程中通 过查询矩阵元素而获得算符间的优先关系。
了解算符优先分析法的优缺点和实际应用中的局限性
2
【学习指南】
算符优先分析法是自下而上语法分析的一种,它的算
法简单、直观、易于理解,故通常作为学习其它自下 而上语法分析的基础。在学习前,应复习有关语法分 析的知识,如:什么是语言、文法、句子、句型、短 语、简单短语、句柄、最右推导、规范归约基本概念
S
A
A→Ab
最右推导 句型
abbcde
句柄 归约用规则 b A→b
S→aAcBe
aAbcde
Ab
d
A→Ab
B→d
A
A→b
B
B→d
aAcde
编译原理第6章习题答案
P164–7
方法一: S L1.L2 SL L L1B LB B0 B1 {S.val:=L1.val+(L2.val/2 {S.val:=L.val} {L.val:=2*L1.val + B.c; L.length:=L1.length+1} {L.val:=B.c; L.length :=1} {B.c:=0} {B.c:=1}
End Else begin E.type := real; E.code:=E1.code || T.code || inttoreal || + end ET E.type := T.type; E.code:= T.code
T num.num T.type := real E.code:= num.num T num T.type := int E.code:= num
L1.length
L 2.length
)}
;
L.length:=L1.length+1} LB B0 B1 {L.val:=B.val; L.length :=1} {B.val:=0} {B.val:=1}
P165–11
答: D→id L L→, id L1 L→ : T T→integer T→ real {D.type:= L.type;addtype(id.type,L.type)} {L.type:= L1.type;addtype(id.type,L1.type)} {L.type:= T.type} { T.type := integer} { T.type := real}
L 2.length
)}
方法二: 为了用上 B 的综合属性 c, 就要将左递归产生式 L LB 转化为 L BL, 所以设计的求 S.val 的属性文法为: S L1.L2 SL L B L1 {S.val:=L1.val+(L2.val/2 {S.val:=L.val} {L.val:=B.c+L1.val; B.c:=B.val*2
编译原理第六章答案-编译原理第六章
第6 章自底向上优先分析第1 题已知文法G[S]为:S→a|∧|(T)T→T,S|S(1)计算G[S]的FIRSTVT 和LASTVT.(2)构造G[S]的算符优先关系表并说明G[S]是否为算符优先文法。
(3)计算G[S]的优先函数。
(4)给出输入串(a,a)#和(a,(a,a))#的算符优先分析过程。
答案:文法展开为:S→aS→∧S→(T)T→T,ST→S(1)FIRSTVT — LASTVT 表:表中无多重人口所以是算符优先(OPG)文法。
友情提示:记得增加拓广文法S`→#S#,所以#FIRSTVT(S),LASTVT(S) #。
(3)对应的算符优先函数为:Success!对输入串(a,(a,a))#的算符优先分析过程为:Success!第2 题已知文法G[S]为:S→a|∧|(T)T→T,S|S(1)给出(a,(a,a))和(a,a)的最右推导,和规范归约过程。
(2) 将(1)和题1 中的(4)进行比较给出算符优先归约和规范归约的区别。
答案:(2)算符优先文法在归约过程中只考虑终结符之间的优先关系从而确定可归约串,而与非终结符无关,只需知道把当前可归约串归约为某一个非终结符,不必知道该非终结符的名字是什么,因此去掉了单非终结符的归约。
规范归约的可归约串是句柄,并且必须准确写出可归约串归约为哪个非终结符。
第3题:有文法G[S]:S VV T|ViTT F|T+FF )V*|((1) 给出(+(i(的规范推导。
(2) 指出句型F+Fi(的短语,句柄,素短语。
(3)G[S]是否为OPG?若是,给出(1)中句子的分析过程。
因为该文法是OP,同时任意两个终结符的优先关系唯一,所以该文法为OPG.(+(i(的分析过程第4题文法G[S]为:S→S;G|GG→G(T)|HH→a|(S)T→T+S|S(1)构造G[S]的算符优先关系表,并判断G[S]是否为算符优先文法。
(2)给出句型a(T+S);H;(S)的短语、句柄、素短语和最左素短语。
北大编译原理chapter6
一个过程是递归的,如果同一过程的一 次新的活动可以在前面活动结束以前开始。
用一颗树来描绘控制进入和离开活动的 途径。这祥的树称作活动树。在一棵活动 树中:
1. b的左边当且仅当a的生存期发生在b 的生存期之前。
用活动树来讨论正在这个结点上的控 制。
9
图6.3 一棵活动树
s
r q(1,9)
p(1,9) q(1,3)
s r q(1,9)
p(1,9) q(1,3)
p(1,3)
q(2,3)
q(1,0)
图 6.4
12
控制栈中的活动都是活跃的,当前控制进入
的活动在栈顶,从栈顶活动到栈底活动的活动 序列是从活动树上当前结点通向根的路径上的
结点序列: s,q(1,9),q(l,3),q(2,3)
从栈底活动到栈顶活动的活动序列表示了 活动的生存期的嵌套关系。
(top-sp ,31)
:= t3 – f := (top-sp ,31) – (top-sp ,28)
编译结束,知道每个过程的活动记录的长度,
将其填写到相应的过程表中,运行时,调用哪 个过程,就在运行栈顶,推进那个过程的活动 记录(栈箭头加上活动记录长度)。
26
6.3 运行时刻存储分配策略
分配策略是: 1.静态分配; 2.栈式分配,或称栈式动态分配; 3.堆式分配,或称堆式动态分配。
一些问题
3
6.1.1 过程 源程序由一组过程组成,不同的程序设计
语言,由过程构成源程序的方法不同。 构成源程序的两个过程行文,要么是嵌套
的,要么是不相交的。
4
program sort(input,output);
var a : array[0..10] of integer;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第六章属性文法和语法制导翻译本章要点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. 出现在产生式________和出现在产生式________不由所给的产生式的属性计算规则进行计算,而是由其他产生式的属性规则计算或者由属性计算器的参数提供。
a. 左边的继承属性;b. 左边的综合属性;c. 右边的综合属性;d. 右边的继承属性5. 描述文法符号语义的属性,综合属性值的计算依赖于分析树中它的的属性值;a. 父结点b. 子结点c. 兄弟结点d. 父结点与子结点e. 父结点与兄弟结点6. 描述文法符号语义的属性,继承属性值的计算依赖于分析树中它的______的属性值。
a. 父结点b. 子结点c. 兄弟结点d. 父结点与子结点e. 父结点与兄弟结点7. 一般来说,对出现在产生式右边的和出现在产生式左边的都必须提供一个计算规则。
a. 综合属性,b. 继承属性,c. L-属性,d. R-属性8. 考虑非终结符A、B和C,其中A有一个继承属性a和一个综合属性b,B有综合属性c,C有继承属性d。
产生式A→BC可能的属性计算规则中,属性要在其它地方计算,不是在本产生式的属性计算规则中计算的。
a. C.d和A.b;b. A.a和A.b;c. A.a和B.c;d. C.d和A.a9. 通常使用的方法在每一个结点处使用语义规则计算综合属性的值。
a. 自顶向下,b. 自底向上,c. 从左到右,d. 从右到左;10. S-属性文法的计算中,设当前的栈顶由指针top指示,假设综合属性刚好在每次归约前计算的。
假定产生式为A XYZ,相应的语义规则为A.a:=f(X.x, Y.y,Z.z)。
在把XYZ归约成A以前,属性Z.z的值放在val[top]中,Y.y的值放在val[top-1]中,X.x的值放在val[top-2]中。
归约以后,A的状态存放在中(即X的位置)。
综合属性A.a的值存放在中。
a. state[top],val[top];b. state[top-1],val[top-1];c. state[top-2],val[top-2];d. state[top-3],val[top-3];11. 一个简单的翻译模式E→TRR→addop T {print(addop.lexeme)} R1|εT→num {print(num.val)}addop→+|-该文法的作用是。
a. 把一个带加号和减号的前缀表达式翻译成相应的后缀表达式b. 把一个带加号和减号的后缀表达式翻译成相应的前缀表达式c. 把一个带加号和减号的后缀表达式翻译成相应的中缀表达式;d. 把一个带加号和减号的中缀表达式翻译成相应的后缀表达式;12. 有一语法制导翻译如下所示:(第8章)S→bAb {print “1” }A→(B {print “2” }A→a {print “3” }B→Aa) {print “4” }若输入序列为b(((aa)a)a)b,则采用自下而上的分析方法,则输出是。
a. 32224441b. 34242421c. 12424243d. 3444221213. 在属性文法中,终结符只具有属性。
a. 传递b. 继承c. 抽象d. 综合14. 设,有以下左递归翻译模式A→A1Y {A.a:=g(A1.a,Y.y)}A→X {A.a:=f(X.x)}它的每一个文法符号都有一个综合属性,用相应的小写字母表示,g和f是任意函数。
消除左递归,再考虑语义动作,翻译模式变为:A→X { R.i:=f(X.x) }R { A.a:=R.s }R→Y { R1.i:=g(R.i, Y.y) }R1R→εa. { R.s:=R1.s } ,{ R.s:=R.i };b. { R.s:=R.i },{ R.s:=R1.s };c. { R.s:=R1.i } ,{ R.s:=R.s };d. { R.s:=R.s },{ R.s:=R1.i };15. ________________可用于一遍扫描的自上而下分析,而________________则适合于一遍扫描的自下而上分析。
a. S-属性文法,L-属性文法;b. 继承属性文法,综合属性文法;c. L-属性文法,S-属性文法;d. 综合属性文法,继承属性文法;一.答案:1. b;2. c;3.c,d;4. a,c;5. b;6. e;7. b,a;8. c;9. b;10. a;11. d;12. b;13. d;14. a;15. c;二、填空题:1. ________属性用于“自下而上”传递信息;而________属性用于“自上而下”传递信息。
2. 如果一属性文法不存在属性之间的________,那么称该文法为良定义的。
3. 按照________________的编译程序模型来理解语法制导翻译方法,所谓的语法制导翻译,直观上说,就是为文法中每个_____________配上一组语义规则,并在________________的同时执行这些语义规则。
4. 下面语义规则:T→T1*F T⋅val:=T1⋅val*F⋅val,改写成翻译模式为:。
5. S-属性文法中的每个文法符号,只含有________属性。
6. 与树遍历的属性计算方法不同,一遍扫描的处理方法是在语法分析的同时计算属性值,而不是语法分析构造语法树之后进行属性计算。
________________可用于一遍扫描的自上而下分析,而________________则适合于一遍扫描的自下而上分析。
7. 已知表达式文法的一条语法规则E→E1+T,对每个文法符号引入nptr属性,可以写出为该文法建立抽象语法树的、对应于这条规则的语义规则为:。
8. 在S-属性文法的基础上,LR分析器可以改造为一个翻译器,在对输入串进行语法分析的同时。
9. 通过在基础文法中新引入非终结符M,加入形式为____________的新的产生式,可以使嵌入的语义动作出现在产生式的末尾。
10. 属性计算规则中只能使用相应产生式中的文法符号的属性,这有助于在产生式范围内“封装”属性的依赖性。
然而,出现在产生式左边的和出现在产生式右边的不由所给的产生式的属性计算规则进行计算,它们由其他产生式的属性规则计算或者由属性计算器的参数提供。
11. 语义规则可能产生副作用(如产生代码),也可能不是变元的严格函数(入某个规则给出可用的下一个数据单元的地址)。
这样的语义规则通常写成。
12. 我们可以用一个来跟踪一个标识符,看它是出现在赋值号的左边还是右边,以确定是需要这个标识符的地址还是值。
13. 在自下而上语法分析中,若一个产生式匹配输入串成功,或者,在自下而上分析中,当一个产生式被用于进行归约时,,完成相关的语义分析和代码产生工作。
14. S-属性文法自下而上计算属性时,在分析栈中使用一个附加的域val来存放综合属性值。
文法符号是隐含在state中而不是存储在栈中。
当把文法符号放入栈中时,那么当第i个state 对应符号为A时,val[i]中就存放。
15. 对于一个属性文法,∀A→X1X2…X n∈P, 其每个语义规则中的每个属性都是一个综合属性;或者,X j(1≤j ≤ n)是一个继承属性,这个继承属性仅依赖于:①②则,该属性文法是L-属性文法。
二.答案1. 综合,继承;2. 循环依赖关系;3. 一遍扫描,产生式,语法分析;4. T→T1*F {T⋅val:=T1⋅val*F⋅val};6. L-属性文法,S-属性文法;7. E⋅nptr :=mknode(´+´,E1 ⋅ nptr,T ⋅nptr);8. 对属性进行计算;9. M→ε;10. 继承属性,综合属性;11. 过程调用或过程段;12. 继承属性;13. 此产生式相应的语义规则就被计算;14. 语法树中与结点A对应的属性值;15. 产生式中X j的左边符号X1,X2,…X j-1的属性;A的继承属性。
三、判断题:1. 非终结符只有综合属性,由词法分析器提供。
()2. S—属性文法一定是L—属性文法。
()3. 只含有综合属性的属性文法是S-属性文法。
()4. 只含有继承属性的属性文法称为-L属性文法。
( )5. 语法制导翻译可以基于语法分析树,也可以基于抽象语法树,两种情况所采用的基本方法是一样的。
()6. 翻译模式既适于自顶向下分析,又适于自底向上分析。
()7. 用于自顶向下分析的翻译模式,其基础文法中不能含有左递归。
()8. 在基础文法中增加标记非终结符不会导致新的语法分析冲突。
()9. 对L-属性文法,不用显式构造语法树就可以实现翻译。
()10. 在翻译模式中,和文法符号相关的属性和语义规则(语义动作),用花括号括起来,插入到产生式右部或左部的合适位置上。
()11. 语法制导定义中文法符号的一个属性,既可以是综合属性,同时又可以是继承属性。
()12. 在抽象语法树中,操作符和关键字都不作为叶子结点出现,而是把它们作为内部结点。