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

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

_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
具有不同类型的赋值语句的语义描述
--回顾四元式中间代码 --回顾四元式中间代码
四元式是由四部分组成: 四元式是由四部分组成: i)(op,arg1,arg2, (i)(op,arg1,arg2,ti) 其中, 为运算符;arg1、arg2为运算对象 为运算对象; ti为运 其中,op 为运算符;arg1、arg2为运算对象; ti为运 算结果。 算结果。运算对象和运算结果可以是用户自己定义的变量也 可以是编译程序引进的临时变量。 可以是编译程序引进的临时变量。 可以使用变量名字本身表示运算对象arg1 arg2, arg1和 可以使用变量名字本身表示运算对象arg1和arg2,用ti 表示结果。实际实现中,它们为指向符号表的某一登录项 表示结果。实际实现中,它们为指向符号表的某一登录项 指针),或是一个临时变量的整数码 ),或是一个临时变量的整数码。 (指针),或是一个临时变量的整数码。
id.name代表id表示的单词。 代表id表示的单词。 代表id表示的单词
语义函数lookup(id.name) 5)语义函数lookup(id.name)
是否出现在符号表中,若是则返回id.name 审查 id.name 是否出现在符号表中,若是则返回id.name 在符号表的入口指针, nil。 在符号表的入口指针,否则返回 nil。
约定:当两个不同类型的量进行运算时, 约定:当两个不同类型的量进行运算时,必须首先将整型
量转换为实型量。 量转换为实型量。
9
类型转换的语义处理
为了进行类型转换的语义处理,增加语义变量, 为了进行类型转换的语义处理,增加语义变量,用E.type 的类型信息, type的值或为 int或为 real。 表示 E 的类型信息,E.type的值或为 int或为 real。 区别整型加( 和实型加( 方法: 区别整型加(乘)和实型加(乘)方法:
1
8.4 简单赋值语句的翻译
简单算术表达式是一种仅含简单变量的算术表达式。 简单算术表达式是一种仅含简单变量的算术表达式。 简单变量指普通变量和常数, 简单变量指普通变量和常数, 但不含数组元素及结构引 等复合型数据结构。 用等复合型数据结构。 简单算术表达式的计值顺序与四元式出现的顺序相同, 简单算术表达式的计值顺序与四元式出现的顺序相同, 很容易翻译成四元式形式, 很容易翻译成四元式形式,对这些翻译方法稍加修改也可产 生三元式形式。 生三元式形式。
12
运算符的优先级
关系运算符的优先级相同, 关系运算符的优先级相同 , 其运算优先级低于 任何算术运算符。 任何算术运算符。 布尔运算符的运算顺序一般为 ┐、∧、∨,且 服从左结合, ∧ 和 ∨ 服从左结合,布尔算符的运算优先级低于 任何关系运算符(注意, 任何关系运算符(注意,此处的运算优先级约定不同 语言) 于 C 语言)。
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。
一个表达式中可能会出现各种不同类型的变量或常数, 一个表达式中可能会出现各种不同类型的变量或常数 , 并不一定是同一种类型。 并不一定是同一种类型 。 即编译程序还应执行如下的语义动 作:对表达式中的运算对象应进行类型检查。 对表达式中的运算对象应进行类型检查。 如不能接受不同类型的运算对象的混合运算, 则应指 如不能接受不同类型的运算对象的混合运算 , 出错误; 出错误; 如能接受混合运算,则应进行类型转换的语义处理。 如能接受混合运算,则应进行类型转换的语义处理。
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
5
赋值语句到四元式的语义描述
(1) S→id:=E { p:=lookup(id.name); 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(id.name); if(p!=nil) E.place:=p; else error(); }
3
有关语义子程序中涉及的语义变量、 有关语义子程序中涉及的语义变量、 语义过程及函数说明
1)语义变量E 1)语义变量E.place 语义变量
E.place表示存放 E 值的变量名在符号表中的入口地址 place 表示存放 或临时变量名的整数码。 或临时变量名的整数码。
2)语义函数 newtemp
每次调用函数newtemp 时返回一个代表新临时变量的整数 每次调用函数 newtemp时返回一个代表新临时变量的整数 newtemp 临时变量名按产生的顺序可设为T 码;临时变量名按产生的顺序可设为T1、T2、……。 。
输入串
X=−B*(C+D)#
归约产生 式
符号栈 # #i #i= #i=− _ _X _X_
语义栈
四元式
=−B*(C+D)# −B*(C+D)# B*(C+D)# *(C+D)# *(C+D)# *(C+D)#
_X_ _ _X_ _B _X_ _B _X_T1
7
(6) (4)
#i=−i #i=−E #i=E
11
8.5 布尔表达式的翻译
布尔运算符 运算符 ┐、∧、∨, not、and、 或not、and、or !、&& &&、 或!、&&、|| <=、==、 <、<=、==、 !=、>=、 !=、>=、> 运算对象 布尔变量, 布尔变量,常量或 关系表达式 算术表达式
关系表达式
通用表达式: 对布尔运算、 关系运算、 通用表达式 : 对布尔运算 、 关系运算 、 算术运算的运算 对象的类型不区分布尔型或算术型; 对象的类型不区分布尔型或算术型;假定不同类型的变换工 作将在需要时强制执行。 作将在需要时强制执行。
17
【例】 a<b关系表达式的翻译方式 < 关系表达式的翻译方式
4
有关语义子程序中涉及的语义变量、 有关语义子程序中涉及的语义变量、 语义过程及函数说明( 语义过程及函数说明(续)
3)语义过程 emit(T:=arg1 op arg2)
的功能是产生一个四元式并填入四元式表中。 emit 的功能是产生一个四元式并填入四元式表中。
4)语义变量id.name 语义变量id.name
13
1、布尔表达式的翻译方法
布尔表达式的作用: 布尔表达式的作用:
1)计算逻辑值; 计算逻辑值; 2)用做改变控制流语句中的条件表达式。 用做改变控制流语句中的条件表达式。
例如:if-then, 例如:if-then,
if-then-else, if-then-else, whilewhile-do 语句中的表达式。 语句中的表达式。
(uminus,B, _,T1)
(C+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
6
(2) E→E(1)+E(2) (3) E→E(1)*E(2) (4) E→−E(1) (5) E→(E(1)) (6) E→id
语义工作包括对变量进行“先定义后使用”检查工作。 语义工作包括对变量进行“先定义后使用”检查工作。
【例】试分析赋值语句 X= −B*(C+D) 的语法制导翻译过程。 的语法制导翻译过程。
返回
16
【例】布尔表达式 a ∨ b ∧ ┐c 翻译
四元式序列: 四元式序列:
(1) t1 = ‘┐’ c ┐ (2) t2 = b ‘∧’ t1 ∧ (3) t3 = a ‘∨’ t2 ∨
注意:如下的四元式的直观表达形式。 注意:如下的四元式的直观表达形式。
(jump,-,-,L) ) (jrop,B,C,L) goto L if B rop C goto L
2
考虑文法G[S]: : 考虑文法 S→id:=E E→E+E∣E*E∣−E∣(E)∣id ∣ ∣ ∣ ∣
代表“赋值语句” 文法G[S] G[S]是一个二义 非终结符 S 代表“赋值语句”,文法G[S]是一个二义 文法, 文法,但通过确定运算符的结合性及规定运算符的优先级可 避免二义性的发生。 避免二义性的发生。 为了实现由赋值语句到四元式的翻译, 为了实现由赋值语句到四元式的翻译,需要给文法加上 语义子程序,以便在进行归约的同时执行对应的语义子程序。 语义子程序,以便在进行归约的同时执行对应的语义子程序。
源自文库
+ 分别写作 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
相关文档
最新文档