ch8-语法制导翻译和中间代码生成(2)

合集下载

第08章 语法制导翻译和中间代码生成

第08章 语法制导翻译和中间代码生成

第08章语法制导翻译和中间代码生成《编译原理》课后习题答案第八章第 8 章语法制导翻译和中间代码生成第 1 题给出下面表达式的逆波兰表示(后缀式): (1)a*(-b+c)(2) if(x+y)*z=0 then s∶=(a+b)*c else s∶=a*b*c 答案:给出下面表达式的逆波兰表示(后缀式): (1) ab-c+*(2)xy+z*0=sab+c*:=sab*c*:=¥(注:¥表示 if-then-else 运算)如果写成这样: xy+z*0=sab+c*:=sabc**:=¥,则是错误的,因为写表达式和赋值语句的中间代码序列,或是写它们的代码生成过程,必须注意按照算符优先序进行,这实际上是按照 LR 分析过程进行的。

例如:写出赋值语句 a:=a+b*c*(d+e)的四元式中间代码,当前四元式序号为 100。

不能写成:100 (+,d,e,t1) 101 (*,b,c,t2) 102 (*,t2,t1,t3) 103 (+,a,t3,t4) 104(:=,t4,-,a) 应该写成:100 101 102 103 104(*,b,c,t1) (+,d,e,t2) (*,t1,t2,t3) (+,a,t3,t4) (:=,t4,-,a)第 2 题请将表达式-(a+b)*(c+d)-(a+b+c)分别表示成三元式、间接三元式、四元式序列、树形、逆波兰,当前序号为 100。

答案:三元式: 100 (+, a, b)101 (+, c, d) 102 (* , (1), (2))盛威网()专业的计算机学习网站 1《编译原理》课后习题答案第八章103 104 105 106 (-, (3), /) (+, a, b) (+,(5),c) (- (4), (6))间接三元式:间接三元式序列 100 (+,a, b) 101 102 103 104 105(+,c, d) (*,(1), (2)) (-,(3), /) (+,(1), c) (-,(4), (1))间接码表 (100) (101) (102) (103) (100) (104) (105)或者:间接三元式:100 (+,a, b) 101 (+,c, d) 102 (*,(1), (2)) 103 (-,(3), /) 104 (+,(1), c) 105 (-,(4), (1))间接码表:100 101 102 103 100 104 105四元式:100 (+, a, b, t1) 101 (+, c, d, t2) 102 (*, t1, t2, t3) 103 (-, t3, /, t4) 104 (+, a, b, t5) 105 (+, t5, c, t6) 106 (-, t4, t6, t7) 树形:盛威网()专业的计算机学习网站 2《编译原理》课后习题答案第八章逆波兰:ab+cd+*-ab+c+-[典型例题]:写出 if A and B and C > D thenif Aelse G:=G+1; 的四元式序列, 翻译过程中, 采用 then 与 else 的最近匹配原则。

CH8 静态语义分析和中间代码生成

CH8 静态语义分析和中间代码生成

E int { E.place := newtemp; E.code := gen (E.place ‘:=’ int .val) }
E real { E.place := newtemp; E.code := gen (E.place ‘:=’ real .val) } E E1 + E2 { E.place := newtemp; E.code := E1.code || E2.code || gen (E.place ‘:=’ E1.place ‘+’ E2.place) }
S.P
词法分析程序
符 号 表 管 理 语法分析程序 错 误 处 理
语义分析、生成中间代码
代码优化 生成目标程序 O.P
编译原理
2017年5月5日
第8章 静态语义分析和中间代码生成
符号表
静态语义分析 中间代码生成
编译原理
2017年5月5日
符号表
符号表(symbol tables)
• 名字信息建立后加入/更改符号表 名字信息如:种类,类型,偏移地址,占用空间等 • 需要获取名字信息时,查找符号表 • 符号表的组织可以体现名字作用域规则
编译原理
2017年5月5日
每个作用域各自的符号表
例:右边程序在处理到/*here*/时
的作用域栈如下所示
const a=25; var x,y; procedure p; var z; begin …… end; procedure r; var x, s; procedure t; var x; begin …… end; begin /*here*/ …… end; begin …… end.
E (E1) { E.place := E1.place ; E.code := E1.code } 编译原理 2017年5月5日

第8章 语法制导翻译和中间代码生成2013

第8章 语法制导翻译和中间代码生成2013

图1 3*5+4的注释分析树
14
第8章
语法制导翻译和中间代码生成
D
继承属性
例2. 类型定义的语法制导定义(L.in为继承属性)。
产生式
(1)DTL (2)Tint
语义规则
L.in:=T.type T.type:=integer
Type
T L1 id1
L
(3)Treal T.type:=real
9
第8章 语法制导翻译和中间代码生成
3 语法制导定义
一个结点的综合属性值是从其子结点的综合属性值计算得来的,综 合属性用于自下而上传递信息;而继承属性则是由语法树中该结点 的父结点和位于其左边的兄弟结点的属性值计算出来的,继承属性 用于自上而下传递信息。 (1)非终结符既可有综合属性也可有继承属性,但文法开始符号 没有继承属性。 (2)终结符只有综合属性,它们由词法分析程序提供。 我们将每个结点都带有属性值的语法分析树称为注释分析树。计算 结点属性值的相关活动称为注释或装饰语法树。
21
8.2.1 翻译文法
如何构造翻译文法? 翻译文法的构造方法可通过对输入文法修改得到。对输入文法 的产生式,在其右部的适当位置插入动作符号就形成翻译文法。因 此,翻译文法产生的动作序列实际上是受输入语言的文法控制的。 按语法制导翻译的方法来实现语言的翻译,就要根据输入语言 的文法,分析各条产生式的语义,即分析他们要求计算机所完成的 操作,分别编出完成这些操作的子程序或程序段(称为语义子程序 或语义动作),并把这些子程序或程序段的名字作为动作符号插入 到输入文法各产生式右部的适当位置上,从而实现翻译文法。
10
第8章 语法制导翻译和中间代码生成
3 语法制导定义
定义1 语法制导定义

第八章 语法制导翻译和中间代码生成

第八章 语法制导翻译和中间代码生成

目标代码
5
语义分析
语义分析的任务:在词法分析和语法分析的基础上,
盛 威 网 : 专 业 的 计 算 机 学 习 网 站
分析所写源程序的含义,在理解含义的基础上为生成 相应的目标代码作好准备或直接生成目标代码。 1)静态语义检查 例:类型检查、运算、维数、越界 2)语义翻译(具体的动作) 例:语句的翻译(中间代码或目标代码生成)
16
简化定义
对每个产生式,设属性定义性出现的集合为
盛 威 网 : 专 业 的 计 算 机 学 习 网 站
若Xi是产生式左部非终结符(即i=0),则称属性 Xi.a是综合属性(Synthesized Attributes) 若Xi出现在产生式的右部(即i≠0 ),则称Xi.a是 继承属性(Inherited Attributes)
2
教学内容
第一节
盛 威 网 : 专 业 的 计 算 机 学 习 网 站
属性文法 语法制导翻译概论 中间代码的形式 简单赋值语句的翻译 布尔表达式的翻译 控制语句的翻译 说明语句的翻译 数组和结构的翻译
3
第二节 第三节 第四节 第五节 第六节 第七节 第八节
盛 威 网 : 专 业 的 计 算 机 学 习 网 站
2.组成
语法树上的每个节点的所有属性在依赖图上各有 一个节点,如果属性y依赖于属性x,那么从x的节点 到y的节点有一条有向边。 【注】如果语法树一节点的属性y依赖某个节点的属 性x,那么属性y的语义产生式的计算必须在属性x的 语义产生式的计算之后进行。 24
盛 威 网 : 专 业 的 计 算 机 学 习 网 站
13
盛 威 网 : 专 业 的 计 算 机 学 习 网 站
3、文法规则number→number digit ,表明文法的个 数不止一个。我们必须表示出这个文法规则左边符 号的值和右边符号的值之间的关系。通过使用下标 进行区分,将文法写成如下形式: number1→number2 digit

第08章语法制导翻译和中间代码生成

第08章语法制导翻译和中间代码生成
28
常用的中间语言
• 三地址代码(四元式) 三地址代码(四元式) • 语法结构树(三元式) 语法结构树(三元式) • 后缀式
特点
• 形式简单、语义明确、便于翻译 形式简单、语义明确、 • 独立于目标语言
29
三元式和树形表示
• 每个三元式由三个部分组成,分别是:算符op, 每个三元式由三个部分组成,分别是:算符op, op 第一运算对象ARG1和第二运算对象ARG2 ARG1和第二运算对象ARG2。 第一运算对象ARG1和第二运算对象ARG2。运算 对象可能是源程序中的变量, 对象可能是源程序中的变量,也可能是某个三 元式的结果,用三元式的编号表示。 元式的结果,用三元式的编号表示。 • 表达式的树形表示很容易实现:简单变量或常 表达式的树形表示很容易实现: 数的树就是该变量或常数自身,如果表达式e1 数的树就是该变量或常数自身,如果表达式e1 e2的树分别为T1和T2,那么e1+e2 e1*e2, 的树分别为T1 e1+e2, 和e2的树分别为T1和T2,那么e1+e2,e1*e2, e1的树分别为 的树分别为: -e1的树分别为:
9
–lexval 是单词 digit 的属性 lexval
例8-3 3*5+4 的
语法树与属性计算
L Print(19) E.val=19
E.val=15 T.val=15 T.val=3 F.val=3 digit.lexval=3 *

T.val=4 F.ቤተ መጻሕፍቲ ባይዱal=4
F.val=5 dgit.lexval=5
• 用中间语言过渡的好处: 用中间语言过渡的好处:
–便于编译系统的实现、移植、代码优化 便于编译系统的实现、移植、 便于编译系统的实现

语法制导翻译和中间代码生成

语法制导翻译和中间代码生成
addtype(id.entry,L.in)
继承属性L.in
语 义 规 则
语句: real id1, id2, id3 的分析树,采用自上而下的分析方法
产 生 式
D TL
T int
T real
L L1,id
L id
L.in:=T.type
T.type=integer
F.val=3
F.val=5
digit.lexval=4
digit.lexval=5
digit.lexval=3
+
*
3*5+4的带注释的分析树
如果一个语法制导定义仅仅使用综合属性,则称这种语法制导定义为S属性定义。通常采用自底向上的方法对其分析树加注释,即从树叶到树根,按照语义规则计算每个节点的属性值。
表达式文法 E→T+T| T or T T → n | true | false
E → T1 + T2 { T1.type = int AND T2.type = T1. type E.type :=int } E → T1 or T2 { T1.type = bool AND T2.type= T1.type E.type :=bool } T → n { T.type := int } T → true { T.type := bool } T → false { T.type := bool }
T.type:=real
L1.in:=L.in
addtype(id.entry,L.in)
addtype(id.entry,L.in)
D
L.in= real
L.in= real
L.in= real
T.type=real

第语法制导翻译和中间代码生成演示文稿

第语法制导翻译和中间代码生成演示文稿
的非终结符,这种属性称作综合属性。
单词digit仅有综合属性,它的值是由词法分析程序提供的。
和产生式L→E相联的语义规则是一个过程,打印由E产生的表达式的值。我 们可以理解为L的属性是空的或是虚的。
第十八页,共141页。
例 8.3 描述说明语句中各种变量的类型信息的语义规则。
产生式 (1)D→TL (2)T→int (3)T→real
这里 f是一个函数,且对于产生式A , (1) b或者是A的一个综合属性并且c1,c2,…,ck是产生式
右边文法符号的属性;
(2) b或者是产生式右边某个文法符号的一个继承属性并 且c1,c2,…,ck是A或产生式右边任何文法符号的属性。
在两种情况下,我们都说属性b依赖于属性c1,c2,…, ck。
一个属性文法包含一个上下文无关文法和一系列 语义规则,这些语义规则附在文法的每个产生式上。
所谓语法制导的翻译指的是在语法分析过程中, 完成这些语义规则描述的动作,从而实现语义处理。
第八页,共141页。
8.1.1 属性文法定义
定义1: 形式上讲,属性文法是一个三元组 :A=(G,V,F),
其中:
G:是一个上下文无关文法;
V:有穷的属性集,每个属性与文法的一个终结符或非终结符相 连,这些属性代表与文法符号相关信息;
F:关于属性的属性断言或一组属性的计算规则(称为语义 规则) 。 断言或语义规则与一个产生式相联,只引用该产
生式左端或右端的终结符或非终结符相联的属性。
第九页,共141页。
定义2: 一个属性文法是一个三元组:A=(G,V,F ),其中 G --基础文法(一个上下文无关文法) V --每个文法符号有一组属性 F --每个文法产生式A有一组形式为

精品课程编译原理-PPT课件第8章 语法制导与中间代码生成

精品课程编译原理-PPT课件第8章  语法制导与中间代码生成

(3)一致性检查。在很多场合要求对象只能被 定义一次。例如Pascal语言规定同一标识符在一 个分程序中只能被说明一次,同一case语句的标 号不能相同,枚举类型的元素不能重复出现等等。
(4)上下文相关性检查。比如,变量名字必 须先声明后引用;
(5)名字的作用域分析。各变量的作用域可 能是不一样的,要通过分析明确各变量的作用域。
例子: a:=b*c+b*d的相应三元组
①(*, b, c) b*c ②(*, b, d) b*d ③(+, (1),(2)) b*c+b*d ④(:=,(3), a) a:=b*c+b*d
例子:tri(A*B+C) =tri(A*B)||tri(c)||2:(+,①≥,C) =1:(*, A,B) A*B 2:(+,①,C) A*B+C
8.2.2 S-属性文法和自下而上翻译 一般的属性文法的翻译器很难建立,然 而L-属性文法的翻译器很容易建立。
L-属性文法的一个特例叫S-属性文法。 S-属性文法是只含有综合属性的属性文法。
8.2.3 L-属性文法在自下而上分析中实现 L-属性文法允许一次遍历就计算出所以的 属性值。
8.3 中间代码的形式
3*5+6的带注释的分析树
只使用综合属性.
T.val=3 F.val=3
E.val=15 T.val=15
*
L
E.val=21
+
F.val=5
T.val=6 F.val=6 digit.lexval=6
digit.lexval=5
digit.lexval=3
3*5+6的带注释的分析树
继承属性
一个结点的继承属性值是由此结点的父结点和/或兄弟结 点的某些属性来决定的。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
15
数值表示法- 数值表示法-用数值表示逻辑值
布尔表达式: 布尔表达式: or( 0) 1 or(0 and not 0)or 0 的计算过程是 1 or(0 and not 0)or 0 or( 0) or( 1) =1 or(0 and 1)or 0 =1 or 0 or 0 =1 or 0 =1
代表id表示的单词。 代表id表示的单词。 代表id表示的单词
语义函数lookup() 5)语义函数lookup()
是否出现在符号表中,若是则返回 审查 是否出现在符号表中,若是则返回 在符号表的入口指针, nil。 在符号表的入口指针,否则返回 nil。
4
有关语义子程序中涉及的语义变量、 有关语义子程序中涉及的语义变量、 语义过程及函数说明( 语义过程及函数说明(续)
3)语义过程 emit(T:=arg1 op arg2)
的功能是产生一个四元式并填入四元式表中。 emit 的功能是产生一个四元式并填入四元式表中。
4)语义变量 语义变量
17
【例】 a<b关系表达式的翻译方式 < 关系表达式的翻译方式
+ 分别写作 int+ 和 real+ ; * 分别写作 int* 和 real* ;
表示将整型运算对象转换成实型。 一目算符 inttoreal 表示将整型运算对象转换成实型。
10
E→E1+E2的带类型检查的语义动作 → 的带类型检查的语义动作
else if E1.type=int and E2.type=real then begin E.placeu==newtemp; newtemp; if E1.type=int ‘=’ ‘inttoreal’ E1.place); emit(u and E2.type=int then begin emit(E.place ‘=’ u ‘real+’ E2.place); emit(E.place ‘=’ E1.place ‘int+’ E2.place); E.type = real; E.type = int; end end else if E1.type=real and E2.type=int then begin else if E1.type=real and E2.type=real then begin u = newtemp; emit(E.place‘=’ ‘inttoreal’‘real+’ E2.place); emit(u ‘=’ E1.place E2.place); E.type = real; emit(E.place ‘=’ E1.place ‘real+’ u); end E.type = real; end
12
运算符的优先级
关系运算符的优先级相同, 关系运算符的优先级相同 , 其运算优先级低于 任何算术运算符。 任何算术运算符。 布尔运算符的运算顺序一般为 ┐、∧、∨,且 服从左结合, ∧ 和 ∨ 服从左结合,布尔算符的运算优先级低于 任何关系运算符(注意, 任何关系运算符(注意,此处的运算优先级约定不同 语言) 于 C 语言)。
3
有关语义子程序中涉及的语义变量、 有关语义子程序中涉及的语义变量、 语义过程及函数说明
1)语义变量E 1)语义变量E.place 语义变量
E.place表示存放 E 值的变量名在符号表中的入口地址 place 表示存放 或临时变量名的整数码。 或临时变量名的整数码。
2)语义函数 newtemp
每次调用函数newtemp 时返回一个代表新临时变量的整数 每次调用函数 newtemp时返回一个代表新临时变量的整数 newtemp 临时变量名按产生的顺序可设为T 码;临时变量名按产生的顺序可设为T1、T2、……。 。
约定:当两个不同类型的量进行运算时, 约定:当两个不同类型的量进行运算时,必须首先将整型
量转换为实型量。 量转换为实型量。
9
类型转换的语义处理
为了进行类型转换的语义处理,增加语义变量, 为了进行类型转换的语义处理,增加语义变量,用E.type 的类型信息, type的值或为 int或为 real。 表示 E 的类型信息,E.type的值或为 int或为 real。 区别整型加( 和实型加( 方法: 区别整型加(乘)和实型加(乘)方法:
5
赋值语句到四元式的语义描述
(1) S→id:=E { p:=lookup(); if(p==nil) error(); else emit(p‘:=’E.place); } { E.place:=newtemp; emit(E.place’:=’E(1).place’+’E(2).place);} { E.place:=newtemp; emit(E.place’:=’E(1).place’*’E(2).place);} { E.place:=newtemp; emit(E.place’:=’’uminus ’E(1).place);} { E.place:= E(1).place ;} { p:=lookup(); if(p!=nil) E.place:=p; else error(); }
--回顾四元式中间代码 --回顾四元式中间代码
四元式是由四部分组成: 四元式是由四部分组成: i)(op,arg1,arg2, (i)(op,arg1,arg2,ti) 其中, 为运算符;arg1、arg2为运算对象 为运算对象; ti为运 其中,op 为运算符;arg1、arg2为运算对象; ti为运 算结果。 算结果。运算对象和运算结果可以是用户自己定义的变量也 可以是编译程序引进的临时变量。 可以是编译程序引进的临时变量。 可以使用变量名字本身表示运算对象arg1 arg2, arg1和 可以使用变量名字本身表示运算对象arg1和arg2,用ti 表示结果。实际实现中,它们为指向符号表的某一登录项 表示结果。实际实现中,它们为指向符号表的某一登录项 指针),或是一个临时变量的整数码 ),或是一个临时变量的整数码。 (指针),或是一个临时变量的整数码。
13
1、布尔表达式的翻译方法
布尔表达式的作用: 布尔表达式的作用:
1)计算逻辑值; 计算逻辑值; 2)用做改变控制流语句中的条件表达式。 用做改变控制流语句中的条件表达式。
例如:if-then, 例如:if-then,
if-then-else, if-then-else, whilewhile-do 语句中的表达式。 语句中的表达式。
_X_T1_ _X_T1_ _ _X_T1_ _C _X_T1_ _C _X_T1_ _C_ _X_T1_ _C_D _X_T1_ _C_D _X_T1_ _T2 _X_T1_ _T2_ _X_T1_T2 _X_T3 _X (*,T1,T2,T3) (=,T3, _,X) (+,C,D,T2)
8
具有不同类型的赋值语句的语义描述
11
8.5 布尔表达式的翻译
布尔运算符 运算符 ┐、∧、∨, not、and、 或not、and、or !、&& &&、 或!、&&、|| <=、==、 <、<=、==、 !=、>=、 !=、>=、> 运算对象 布尔变量, 布尔变量,常量或 关系表达式 算术表达式
关系表达式
通用表达式: 对布尔运算、 关系运算、 通用表达式 : 对布尔运算 、 关系运算 、 算术运算的运算 对象的类型不区分布尔型或算术型; 对象的类型不区分布尔型或算术型;假定不同类型的变换工 作将在需要时强制执行。 作将在需要时强制执行。
1
8.4 简单赋值语句的翻译
简单算术表达式是一种仅含简单变量的算术表达式。 简单算术表达式是一种仅含简单变量的算术表达式。 简单变量指普通变量和常数, 简单变量指普通变量和常数, 但不含数组元素及结构引 等复合型数据结构。 用等复合型数据结构。 简单算术表达式的计值顺序与四元式出现的顺序相同, 简单算术表达式的计值顺序与四元式出现的顺序相同, 很容易翻译成四元式形式, 很容易翻译成四元式形式,对这些翻译方法稍加修改也可产 生三元式形式。 生三元+D)# C+D)# +D)# +D)# D)# )# )# )# # # # # (5) (3) (1) (6) (2) (6)
#i=E* #i=E*( #i=E*(i #i=E*(E #i=E*(E+ #i=E*(E+i #i=E*(E+E #i=E*(E #i=E*(E) #i=E*E #i=E #S
14
布尔表达式文法G[E]: : 布尔表达式文法
E→E and E∣E or E∣not E∣(E)∣true|false∣i rop i ∣ ∣ ∣ ∣ ∣ 计算布尔表达式的值的两种方法: 计算布尔表达式的值的两种方法: 1. 一般计算法(算术表达式的计算):按照布尔表达式的运 一般计算法(算术表达式的计算): ):按照 算顺序,步步计算出各部分的真假值, 算顺序,步步计算出各部分的真假值,最后计算出整个表达 式的值。 式的值。 表示, 表示。 假设逻辑值 true 用 1 表示,false 用 0 表示。 2. 采取某种优化措施,只计算部分表达式。 采取某种优化措施,只计算部分表达式。 例如: B, 例如: A ∨ B, A ∧ B 在计算A B时 的值为1 在计算A ∨ B时,若A 的值为1,那么 B 的值就无需再计算 的值为何结果, 了,因为不管 B 的值为何结果,A ∨ B 的值都为 1。 在计算 A ∧ B 时,若发现 A 值为0,则 B 值也无需计算, 值为0 值也无需计算, B的值一定为 A ∧ B的值一定为 0。
返回
16
【例】布尔表达式 a ∨ b ∧ ┐c 翻译
四元式序列: 四元式序列:
(1) t1 = ‘┐’ c ┐ (2) t2 = b ‘∧’ t1 ∧ (3) t3 = a ‘∨’ t2 ∨
相关文档
最新文档