编译原理 龙书 第二版 第5、6章
编译原理课后答案-第二版
第三章1、L(G[S])={ abc }2、L(G[N])={ n位整数或空字符串| n>0 }3、G[E]:E—>E+D | E-D | DD—>0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 94、L(G[Z])={ a n b n | n>0 }5、(1) 考虑不包括“0”的情况G[S]:S—>0S | ABC | 2 | 4| 6 | 8A—>1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9B—>AB | 0B | εC—>0 | 2 | 4 | 6 | 8考虑包括“0”的情况:G[S]:S—>AB | CB—>AB | CA—>0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9C—>0 | 2 | 4 | 6 | 8(2)方法1:G[S]:S—> ABC | 2 | 4 | 6 | 8A—>1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9B—>AB | 0B | εC—>0 | 2 | 4 | 6 | 8方法2:G[S]:S—>AB | CB—> AB | 0B | C | 0A—> 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9C—>2 | 4 | 6 | 86、设<表达式>为E,<项>为T,<因子>为F,注:推导过程不能省略,以下均为最左推导(1) E => T => F => i(4) E => E+T => T+T => T*F+T => F*F+T => i*F+T => i*i+T => i*i+F => i*i+i(6) E => E+T => T+T => F+T => i+T => i+T*F => i+F*F => i+i*F => i+i*I7、<表达式><表达式>*<表达式><表达式>+<表达式>i i i<表达式><表达式>+<表达式>i <表达式>*<表达式>i i8、是有二义性的,因为句子abc 有两棵语法树(或称有两个最左推导或有两个最右推导)最左推导1:S => Ac => abc 最左推导2:S => aB => abc 9、(1)(2) 该文法描述了变量a 和运算符+、*组成的逆波兰表达式10、(1) 该文法描述了各种成对圆括号的语法结构(2) 是有二义性的,因为该文法的句子()()存在两种不同的最左推导: 最左推导1:S => S(S)S => (S)S => ()S => ()S(S)S => ()(S)S => ()()S => ()()最左推导2:S => S(S)S => S(S)S(S)S => (S)S(S)S=> ()S(S)S => ()(S)S => ()()S => ()()11、(1) 因为从文法的开始符E 出发可推导出E+T*F ,推导过程如下:E => E+T =>E+T*F ,所以E+T*F 是句型。
编译原理第二版第五章答案
第五章第5章自顶向下语法分析方法练习(P99)1.文法S->a|^|(T)T->T,S|S(1) 对(a,(a,a)和(((a,a),^,(a)),a)的最左推导。
(3)经改写后的文法是否为LL(1)的?给出它的预测分析表。
(4)给出输入串(a,a)#的分析过程,并说明该串是否为G的句子。
(1) 对(a,(a,a)的最左推导为:S=>(T)=>(T,S) =>(S,S) =>(a,S) =>(a,(T)) =>(a,(T,S)) =>(a,(S,S))=>(a,(a,S)) =>(a,(a,a))对(((a,a),^,(a)),a) 的最左推导为:S=>(T) =>(T,S) =>(S,S) =>((T),S) =>((T,S),S) =>((T,S,S),S)=>((S,S,S),S) =>(((T),S,S),S) =>(((T,S),S,S),S) =>(((S,S),S,S),S)=>(((a,S),S,S),S) =>(((a,a),S,S),S) =>(((a,a),^,S),S) =>(((a,a),^,(T)),S) =>(((a,a),^,(S)),S) =>(((a,a),^,(a)),S) =>(((a,a),^,(a)),a)(3)改写文法为:0) S->a1) S->^2) S->( T )3) T->S N4) N->, S N5) N->ε对左部为N2的产生式可知:FIRST (->, S N2)={,}FIRST (->ε)={ε}FOLLOW (N2)={)}{,}∩ { )}=Ø所以文法是LL(1)的。
也可由预测分析表中无多重入口判定文法是LL(1)的。
清华大学编译原理第二版课后习答案
《编译原理》课后习题答案第一章第 4 题对下列错误信息,请指出可能是编译的哪个阶段(词法分析、语法分析、语义分析、代码生成)报告的。
(1) else 没有匹配的if(2)数组下标越界(3)使用的函数没有定义(4)在数中出现非数字字符答案:(1)语法分析(2)语义分析(3)语法分析(4)词法分析《编译原理》课后习题答案第三章第1 题文法G=({A,B,S},{a,b,c},P,S)其中P 为:S→Ac|aBA→abB→bc写出L(G[S])的全部元素。
答案:L(G[S])={abc}第2 题文法G[N]为:N→D|NDD→0|1|2|3|4|5|6|7|8|9G[N]的语言是什么?答案:G[N]的语言是V+。
V={0,1,2,3,4,5,6,7,8,9}N=>ND=>NDD.... =>NDDDD...D=>D......D或者:允许0 开头的非负整数?第3题为只包含数字、加号和减号的表达式,例如9-2+5,3-1,7等构造一个文法。
答案:G[S]:S->S+D|S-D|DD->0|1|2|3|4|5|6|7|8|9第4 题已知文法G[Z]:Z→aZb|ab写出L(G[Z])的全部元素。
答案:Z=>aZb=>aaZbb=>aaa..Z...bbb=> aaa..ab...bbbL(G[Z])={anbn|n>=1}第5 题写一文法,使其语言是偶正整数的集合。
要求:(1) 允许0 打头;(2)不允许0 打头。
答案:(1)允许0 开头的偶正整数集合的文法E→NT|DT→NT|DN→D|1|3|5|7|9D→0|2|4|6|8(2)不允许0 开头的偶正整数集合的文法E→NT|DT→FT|GN→D|1|3|5|7|9D→2|4|6|8F→N|0G→D|0第6 题已知文法G:<表达式>::=<项>|<表达式>+<项><项>::=<因子>|<项>*<因子><因子>::=(<表达式>)|i试给出下述表达式的推导及语法树。
编译原理(第2版)课后习题答案详解
第1 章引论第1 题解释下列术语:(1)编译程序(2)源程序(3)目标程序(4)编译程序的前端(5)后端(6)遍答案:(1)编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语言,则此翻译程序称为编译程序。
(2)源程序:源语言编写的程序称为源程序。
(3)目标程序:目标语言书写的程序称为目标程序。
(4)编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与目标机无关。
通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符号表管理等工作。
(5)后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,即目标代码生成,以及相关出错处理和符号表操作。
(6)遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。
第2 题一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程序的总体结构图。
答案:一个典型的编译程序通常包含8 个组成部分,它们是词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和错误处理程序。
其各部分的主要功能简述如下。
词法分析程序:输人源程序,拼单词、检查单词和分析单词,输出单词的机内表达形式。
语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。
语义分析程序:进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表中。
中间代码生成程序:按照语义规则,将语法分析程序分析出的语法单位转换成一定形式的中间语言代码,如三元式或四元式。
中间代码优化程序:为了产生高质量的目标代码,对中间代码进行等价变换处理。
目标代码生成程序:将优化后的中间代码程序转换成目标代码程序。
表格管理程序:负责建立、填写和查找等一系列表格工作。
表格的作用是记录源程序的各类信息和编译各阶段的进展情况,编译的每个阶段所需信息多数都从表格中读取,产生的中间结果都记录在相应的表格中。
编译原理chapter6 语法分析
可能有几处说明,语言的作用域规则规定:
在语句序列中引用的一个名字是在何处说
明的名字。
3 . 编译时,处理说明把名字及其属性信息填
写进符号表(add(id.entry,id.vul)); 处理引用
名字时,查找这个名字的属性信息
(lookup(id)),符号表管理程序根据语 言的
作用域规则,使 lookup(id)返回id的作用域
中绑定的属性信息。 精品文档
14
6.1.5名字与存储的绑定 名字与存储单元的绑定是指把源程序中的数 据名字映射到目标机存储单元的过程。 引进两个函数,environment和state。 environment把名字映射到一个存储单元上; state把存储单元映射到那里所存放的值上。 可以说,函数environment把一个名字映射为 一个l-value(左-值),而函数state把一个lvalue(左-值)映射为一个r-value(右-值)。 如图6.5所示。
精品文档
11
例6.2 栈和活动树的变化
栈 s Sr S q(1.9) S q(1.9) p(1,9) S q(1.9) q(1,3)
S q(1.9) q(1,3) p(1,3) S q(1.9) q(1,3) q(1,0)
S q(1.9) q(1,3) q(2,3)
s r q(1,9)
p(1,9) q(1,3)
用活动树来讨论正在这个结点上的控 制。
ห้องสมุดไป่ตู้
精品文档
9
s
图6.3 一棵活动树
r q(1,9)
p(1,9) q(1,3)
q(5,9)
p(5,9) q(5,5) q(7,9) p(1,3) q(1,0) q(2,3)
编译原理 龙书 第二版 第5、6章
2)E->T
E.type=T.type
3)T->num
T.type=integer
4)T->num.num
T.type=float
(2)
产生式
语义规则
1)E->E1+T
If E1.type ==T.type then E.type=E1.type
Else begin
E.type=float
105: goto–
6)按照产生式B->B1 || M B2进行归约
7)按照产生式B->(B1)进行归约
8)按照产生式B->B1 && M B2进行归约
9)各子表达式的truelist和falselist在上图中已标出
3)三元式序列
4)间接三元式序列
答:(1)抽象语法树
(2) 四元式序列
t1=b+c
t2=minus t1
t3=a+t2
op
Arg1
result
0
+
b
c
T1
1
minus
T1
T2
2
+
a
T2
T3
(3)三元式序列
op
Arg1
Arg2
0
+
b
c
1
minus
(0)
2
+
a
(1)
(4)间接三元式序列
10
(0)
E.type=T.type; E.val=T.val
3)T->num
T.type=integer; T.val=num
编译原理-第五章习题答案
上一页
下一页
11
例:5.3 文法:SaAcBe A bAb B d 句子:abbcde
步骤 (1) (2) (3) (4) (5) (6)
栈
# #a #ab #aA #aAb #aA #aAc #aAcd #aAcB #aAcBe #S
输入 abbcde# bbcde# bcde# bcde# cde# cde#
上一页
下一页
20
5)构造算符优先文法G的优先表的算法
思路:对文法中的每一个产生式的候选式检查,判断句型中相邻符号之间 的关系 来构造优先表; 具体算法: FOR 每条产生式P→X1X2…Xn FOR i=1 TO n-1 IF Xi,Xi+1∈VT,THEN Xi=Xi+1; IF i ≤n-2且Xi,Xi+2∈VT,Xi+1∈VN THEN Xi=Xi+2; IF Xi∈VT,Xi+1∈VN THEN FOR FIRSTVT(Xi+1)中的每个a Xi <. a; NEXT IF Xi∈VN,Xi+1∈VT THEN FOR LASTVT(Xi)中的每个a DO a .> Xi+1; NEXT NEXT NEXT
上一页
下一页
8
例:5.1 P85 文法: E→T|E+T T→F|T*F F→i|(E) 句型:i1*i2+i3其中:短语有i1、i2、i3、i1*i2、 i1*i2+i3 直接短语:i1、i2、i3;句柄:i1 例:5.2 P85 文法如上 E 句型:E+T*F+i 短语:E+T*F+i,E+T*F,T*F,i 直接短语:T*F和i E + 句柄:T*F
精品文档-编译原理基础(第二版)(刘坚)-第6章
第6章 代 码 生 成
【例6.3】 图6.1(b)中有三个循环: (1) B3自身是一个循环。 (2) B6自身是一个循环。 (3) { B2,B3,B4}是一个循环。 前两个循环仅有一个节点和一条指向自身的边。例如 B3构成一个以B3为入口节点的循环。根据定义6.3的第(2) 条性质,循环中必须有一条非空的指向入口节点的路径, 此处是从B3到B3。因为,单一节点B2没有一条从B2到B2的 边,所以它不是循环,因为在{B2}中没有从B2到其自身的 非空路径。
பைடு நூலகம்
第6章 代 码 生 成
为每个基本块构造一个节点,并且若B是C的前驱(或 者说C是B的后继),则从B到C有一条边,最终得到流图如 图6.1(b)所示。
入口指向基本块B1,因为B1包含程序的第一条指令。 B1的唯一后继是B2,因为B1不以无条件跳转结束且B2的头 指令紧随B1的结束之后。
第6章 代 码 生 成
定义6.1 一段顺序执行的语句序列被称为一个基本块, 其中,第一条语句被称为基本块的入口,最后一条语句被称为基本 块的出口。
由于基本块中的语句是被顺序执行的,因此基本块的控制 流总是从入口进入,从出口退出。任何一个复杂的程序控制流,均 可以划分为若干个基本块;极端情况下,一条语句构成一个基本块。 因此可以将一段完整的程序表示为一个程序流图。
候被使用。如果一个变量的值当前在寄存器中并且以后再也 不被使用,则该寄存器就可以分配给其他变量。
第6章 代 码 生 成
定义6.4 在形如(i) x := y op z的三地址码中,出现在 “:=”左边和右边的变量分别被称为对变量的定值和引用,i 被称为变量的定值点或引用点。若变量的值在i之后的代码序 列中被引用,则称变量在i点是活跃的。若变量x在i点被定值, 在j点被引用,且从i到j没有x的其他定值,则称j是i中变量x 的下次引用信息,所有这样的下次引用信息jk(k = 1, 2, …) 构成一个下次引用链。
龙书第六章参考答案
6.1 节的练习为下面的表达式构造DAG((x+y)-((x+y)*(x-y)))+((x+y)*(x-y))解答为下列表达式构造DAG,且指出他们每个子表达式的值编码。
假定+ 是左结合的。
1a+b+(a+b)2a+b+a+b3a+a+(a+a+a+(a+a+a+a))解答a+b+(a+b)1 id a2 id b3 + 1 24 + 3 3 a+b+a+b1 id a2 id b3 + 1 24 + 3 15 + 4 2 a+a+(a+a+a+(a+a+a+a))1 id a2 + 1 13 + 2 14 + 3 15 + 3 46 + 2 56.2 节的练习6.2.1将算数表达式a+-(b+c) 翻译成4抽象语法树5四元式序列6三元式序列7间接三元式序列解答抽象语法树四元式序列op arg1 arg20 + b c t11 minus t1 t22 + a t2 t3三元式序列op arg10 + b c1 minus (0)2 + a (1) 间接三元式序列op arg10 + b c1 minus (0)2 + a (1)instruction0 (0)1 (1)2 (2)参考间接三元式更详细的讲解6.2.2对下列赋值语句重复练习6.2.18 a = b[i] + c[j]9a[i] = b*c - b*d10x = f(y+1) + 211x = *p + &y解答a = b[i] + c[j]四元式0) =[] b i t11) =[] c j t22) + t1 t2 t33) = t3 a三元式0) =[] b i1) =[] c j2) + (0) (1)3) = a (2)间接三元式0) =[] b i1) =[] c j2) + (0) (1)3) = a (2)0)1)2)3)a[i] = b*c - b*d四元式0) * b c t11) * b d t22) - t1 t2 t33) []= a i t44) = t3 t4三元式0) * b c1) * b d2) - (0) (1)3) []= a i4) = (3) (2)间接三元式0) * b c 1) * b d 2) - (0) (1) 3) []= a i 4) = (3) (2) 0) 1) 2) 3) 4)x = f(y+1) + 2四元式0) + y 1 t11) param t12) call f 1 t23) + t2 2 t34) = t3 x三元式0) + y 11) param (0)2) call f 13) + (2) 24) = x (3)间接三元式0) + y 11) param (0)2) call f 13) + (2) 24) = x (3)0)1)2)3)4)参考数组元素的取值和赋值6.2.3 !说明如何对一个三地址代码序列进行转换,使得每个被定值的变量都有唯一的变量名。
清华大学编译原理第二版课后习答案
《编译原理》课后习题答案第一章第4题对下列错误信息,请指出可能是编译的哪个阶段(词法分析、语法分析、语义分析、代码生成)报告的。
(1)else 没有匹配的if(2)数组下标越界(3)使用的函数没有定义(4)在数中出现非数字字符答案:(1)语法分析(2)语义分析(3)语法分析(4)词法分析《编译原理》课后习题答案第三章第1题文法G=({A,B,S},{a,b,c},P,S)其中P 为:S→Ac|aBA→abB→bc写出L(G[S])的全部元素。
答案:L(G[S])={abc}第2题文法G[N]为:N→D|NDD→0|1|2|3|4|5|6|7|8|9G[N]的语言是什么?答案:G[N]的语言是V+。
V={0,1,2,3,4,5,6,7,8,9}N=>ND=>NDD.... =>NDDDD...D=>D......D或者:允许0开头的非负整数?第3题为只包含数字、加号和减号的表达式,例如9-2+5,3-1,7等构造一个文法。
答案:G[S]:S->S+D|S-D|DD->0|1|2|3|4|5|6|7|8|9第4题已知文法G[Z]:Z→aZb|ab写出L(G[Z])的全部元素。
答案:Z=>aZb=>aaZbb=>aaa..Z...bbb=> aaa..ab...bbbL(G[Z])={anbn|n>=1}第5题写一文法,使其语言是偶正整数的集合。
要求:(1)允许0打头;(2)不允许0打头。
答案:(1)允许0开头的偶正整数集合的文法E→NT|DT→NT|DN→D|1|3|5|7|9D→0|2|4|6|8(2)不允许0开头的偶正整数集合的文法E→NT|DT→FT|GN→D|1|3|5|7|9D→2|4|6|8F→N|0G→D|0第6题已知文法G:<表达式>::=<项>|<表达式>+<项> <项>::=<因子>|<项>*<因子><因子>::=(<表达式>)|i试给出下述表达式的推导及语法树。
编译原理课件(龙书为教材)
temp2=b+temp1
a=temp2
2014-9-4计算机学院
辛明影
13
代码生成阶段
生成可重定位的机器代码或汇编代码 Movf R2,c
Mult R2,d
Movf R1,b
Addf R2,R1
Movf a,R2
2014-9-4计算机学院
辛明影
14
1.3符号表管理 int a,b;
float e,f
语法分析
在词法分析的基础上,根据语言的语法规则, 把单词符号串组成各类语法单位. 具体的说,语法分析是在单词流的基础上建立 一个层次结构-----建立语法树
标识符 a
赋值语句 =
表达式 标识符 b
表达式 + 表达式 表达式 * 表达式
标识符 c
辛明影
标识符
d
10
2014-9-4计算机学院
语义分析阶段
2014-9-4计算机学院
辛明影
27
上述的定义是用文字来描述的,当设 计编译程序时,就要把它用形式的方式描 述出来,就要用到形式语言。 在现今多数程序设计语言中,单词符 号一般包括: 标识符、 基本字、 各类型的常数、 算符和界符等 正规式和有穷自动机是描述词法结 构和进行词法分析的有效工具
2014-9-4计算机学院
符号表是一个数据结构。 每个标识符在符号表中都有 一条记录 例:int a,b; 名字 a 记号 id1(25) 类型 int 种属 …… 简变 addr 0
b
id2(25)
int
辛明影
简变
4
16
2014-9-4计算机学院
符号表的接口: 符号表的作用就是存放字符串或词素 当一个字符串或词素被保存时,与之相对 应的记号也被保存
编译原理 龙书 第二版 第5、6章
4)L’->BL1’
L1’.m=L’.m*L’.m;L1’.side=L’.side
L1’.inh=L’.inh*L’.side+B*L1’.m
L’.syn=L1’.syn
5)L’->ε
L’.syn=L’.inh
6)B->0
B.val=0
7)B->1
B.val=1
练习5.3.1:下面是涉及运算符+和整数或浮点运算分量的表达式文法。区分浮点数的方法是看它有无小数点。
E-〉E+T|T T-〉num.num|num
1)给出一个SDD来确定每个项T和表达式E的类型
2)扩展(1)中得到的SDD,使得它可以把表达式转换成为后缀表达式。使用一个单目运算符intToFloat把一个整数转换为相等的浮点数
答:
(1)
产生式
语义规则
1)E->E1+T
If E1.type ==T.type then E.type=E1.type
2)四元式序列
3)三元式序列
4)间接三元式序列
答:(1)抽象语法树
(2) 四元式序列
t1=b+c
t2=minus t1
t3=a+t2
op
Arg1
Arg2
result
0
+
b
c
T1
1
minus
T1
T2
2
+
a
T2
T3
(3)三元式序列
op
Arg1
Arg2
0
+
b
c
1
minus
(0)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2)S->L1.L2
L1.side=2;L2.side=1; L1.inh=0;L1.m=1;L2.m=1/2;L2.inh=0
S.val=L1.syn+L2.syn;
3)L->BL’
L’.m=L.m*L.m;L’.side=L.side
L’.inh=L.inh*L.side+B*L.m
E-〉E+T|T T-〉num.num|num
1)给出一个SDD来确定每个项T和表达式E的类型
2)扩展(1)中得到的SDD,使得它可以把表达式转换成为后缀表达式。使用一个单目运算符intToFloat把一个整数转换为相等的浮点数
答:
(1)
产生式
语义规则
1)E->E1+T
If E1.type ==T.type then E.type=E1.type
L.syn=L’.syn
4)L’->BL1’
L1’.m=L’.m*L’.m;L1’.side=L’.side
L1’.inh=L’.inh*L’.side+B*L1’.m
L’.syn=L1’.syn
5)L’->ε
L’.syn=L’.inh
6)B->0
B.val=0
7)B->1
B.val=1
练习5.3.1:下面是涉及运算符+和整数或浮点运算分量的表达式文法。区分浮点数的方法是看它有无小数点。
11
(1)
12
(2)
op
Arg1
Arg2
0
+
b
c
1
minus
(0)
2
+
a
(1)
instruction
练习6.4.3:使用图6-22中的翻译方案,来翻译下列赋值语句
x=a[i][j]+b[i][j]
答:
假定数组a,b均为2*3规模的整型数组,且一个整数的宽度为4
x=a[i][j]+b[i][j]的注释语法分析树如下
C.false=NewLable();C.true=NewLable()
S1.next=S2.next=S.next
S.code=C.code
|| Lable(C.true) || S1.code
|| gen(‘goto’S.next)
|| Lable(C.false)|| S2.code
2) S->do S1 while (C)
105: goto–
6)按照产生式B->B1 || M B2进行归约
7)按照产生式B->(B1)进行归约
8)按照产生式B->B1 && M B2进行归约
9)各子表达式的truelist和falselist在上图中已标出
Begin=NewLable()
C.false=NewLable();C.true=NewLable()
S1.next=begin
S.code=Lable(begin)||S1.code
|| Lable(C.true)
|| gen(‘goto’begin)
3)S->’{’L‘}’;
L -> L1S
L->ε
答:
元文法消除左递归后可得到文法:
S->L.L|L L->BL’L’->BL’|ε B->0|1
使用继承属性L.side指明一个二进制位数在小数点的哪一边,2表示左边,1表示右边
使用继承属性m记录B的幂次
非终结符号L和L’具有继承属性inh、side、m和综合属性syn
产生式
语义规则
1)S->L
S.val=L.syn;
1)S->if (C) S1 else S2
2)S->do S1 while (C)
3)S->’{’L‘}’; L -> LS|ε
请注意,列表中的任何语句都可以包含一条从它的内部跳转到下一个语句的跳转指令,因此简单地为各个语句按序生成代码是不够的。
答:
产生式
语义规则
1) S->if (C) S1 else S2
S.syn=L.syn;
S.inh=L1.syn; L.syn=S.syn
L.inh=L.syn
第六章
练习6.1.1:为下面的表达式构造DAG
((x+y)-((x+y)*(x-y)))+((x+y)*(x-y))
答:DAG如下
练习6.2.1:将算术表达式a+ - (b+c)翻译成
1)抽象语法树
2)四元式序列
3)按B->E1 rel E2将c==d归约为B时语义动作相应的指令如下
102: if c==d goto–
103: goto–
4)产生式B->B1 || M B2中的标记非终结符号M记录了nextinstr的值,该值为104
5)按B->E1 rel E2将e==f归约为B时语义动作相应的指令如下
104: if e==f goto–
E.type=T.type; E.val=T.val
3)T->num
T.type=integer; T.val=num
4)T->num.num
T.type=float; T.val=num.num
练习DD。这里的每个产生式表示一个常见的C语言中的那样的控制流结构。你可能需要生成一个三地址语句来跳转到某个标号L,此时你可以生成语句goto L
elseE.type=float
2)E->T
E.type=T.type
3)T->num
T.type=integer
4)T->num.num
T.type=float
(2)
产生式
语义规则
1)E->E1+T
If E1.type ==T.type then E.type=E1.type
Else begin
E.type=float
a==b && (c==d || e==f)
答:
构造表达式的注释语法分析树如下
各产生式进行归约时产生的语义动作的相应指令如下
1)按B->E1 rel E2将a==b归约为B时语义动作相应的指令如下
100: if a==b goto–
101: goto–
2)产生式B->B1 && M B2中的标记非终结符号M记录了nextinstr的值,该值为102
3)三元式序列
4)间接三元式序列
答:(1)抽象语法树
(2) 四元式序列
t1=b+c
t2=minus t1
t3=a+t2
op
Arg1
Arg2
result
0
+
b
c
T1
1
minus
T1
T2
2
+
a
T2
T3
(3)三元式序列
op
Arg1
Arg2
0
+
b
c
1
minus
(0)
2
+
a
(1)
(4)间接三元式序列
10
(0)
第五章
练习5.1.1:
对于图5-1中的SDD,给出下列表达式对应的注释语法分析树:
1)(3+4)*(5+6)n
练习5.2.4:
这个文法生成了含“小数点”的二进制数:
S->L.L|L L->LB|B B->0|1
设计一个L属性的SDD来计算S.val,即输入串的十进制数值。比如,串101.101应该被翻译为十进制的5.625。提示:使用一个继承属性L.side来指明一个二进制位在小数点的哪一边。
If(E1.type==integerand T.type==float)then E1=intToFloat(E1)
Elseif(T.type==integer and E1.type==float) then T=intToFloat(T)
END
E.val = E1.val T.val +
2)E->T
x=a[i][j]+b[i][j]被翻译成的三地址代码如下如下
练习6.6.4:使用图6.6.5节中介绍的避免goto语句的翻译方案,来翻译下列表达式:
If (a==b && c==d || e==f) x==1;
答:
练习6.7.1:使用图6-43中的翻译方案翻译下列表达式。给出每个子表达式的truelist和falselist。你可以假设第一条被生成的指令地址是100.