编译程序的功能和组织结构
16
语法制导定义的形式
一个属性文法它包含一个上下文无关文法和一系列语 义规则,这些语法规则附在文法的每个产生式上。
在一个语法制导定义中,A→P都有与之相关
联的一套语义规则,规则形式为
b:= f(c1,c2,…,ck),
f是一个函数,而且
1.b是A的一个综合属性并且c1,c2,…,ck是
中的符号的属性,或者
25
D
图6. 5
T4 type
in 5 L
real ,
in 7 L 8
6 id3 3 entry
in 9 L 10 ,
id2 2 entry
id1 1 entry
26
语法制导翻译的实现途径
以自下而上( LR分析)的语法制导翻译来说明 ➢ 将LR分析器能力扩大,增加在归约后调用语义规
则的功能
➢ 增加语义栈,语义值放到与符号栈同步操作的语 义栈中,多项语义值可设多个语义栈 ,栈结构为:
(Intermediate code/
Intermediate representation/Intermediate language)
可以使编译程序的结构清晰、简单、明确。源程序的一种内 部表示,不依赖目标机的结构,易于机械生成目标代码的中间表 示。
为什么要此阶段及使用原则
主要优点是可移植(与具体目标程序无关),且易于目标代码优化 原则:1、形式比较简单,容易翻译成相应的目标机器代码。
(4) (=,t3,-,a)
10
四元式的特点
• 类似于三地址指令 • 四元式虽然比三元式多了一结果的引用,但有利于优
化和代码生成 • 为了便于书写四元式也可以写成如下形式: • <结果>:=<运算对象1><运算符><运算对象2> • 则表达式a+(-b*c+d)*e的四元式为:
(1) t1:=-b (2) t2:=t1*c (3) t3=t2+d (4) t4=t3*e (5) t5=a+t4
11
• 同样要将算法语言翻译成相应的四元式, 也要将四元式扩充到其他运算符,如 (jmp,_,L)表示无条件转向第L条四元式。
12
6.1.4 汇编代码
汇编语言是依赖于机器的低级程序设计语 言,它是面向具体的计算机系统或相应 的计算机系列的,它和三元式相比有以 下优点:
(1)能方便地翻译成目标机器指令。 (2)不必直接计算转移地址。 (3)可以使用各种数据表示法。
24
表6.2 带有继承属性L.in的语法制导定义
产生式
语义规则
DTL T int T real L L1,id
L id
Lin:=T type T type :=integer T type :=real L1 in :=L in addtype(id entry,L in) addtype(id entry,L in)
18
语义规则所描述的工作可以包括属性计算、静态语义检
查、符号表操作、代码生成等。语义规则可能产生副作
用(如产生代码),也可能不是变元的严格函数(如某
个规则给出可用的下一个数据单元的地址)。这样的语
义规则通常写成过程调用,或过程段。
综合属性:
在语法树中,一个结点的综合属性的值由其子结点
的属性值确定。因此,通常使用自底向上的方法在每一
每个文法符号和一个属性值val 联系,属性值的设置 和语法结构的语义以及翻译程序的需要有关。 20
综合属性
S-属性定义
唯独只使用综合属性的语法制导定义。
结点属性值的计算正好和自底向上分析建立 分析树结点同步进行。
例 6 .2 输入:3*5+4n
21
例 6 .2 输入:3*5+4n
L
Eval:=19
例如,一个变量的属性有类型,层次,存储地址等。
表达式的属性有类型,值等。属性值的计算和产生
式相联系。随着语法分析的进行,执行属性值的计
算,完成语义分析和翻译的任务。
15
• 属性一般分为两类:综合属性和继承属性。 简单的说,综合属性用于“自下而上”传递 信息,而继承属性用于“自上而下”传递信 息。
• 属性加工加工的过程即是语义处理的过 程,对于文法的每一个产生式都配备了一组 属性的计算规则,则称为语义规则。
n
Eval:=15 +
Tval:=4
Tval:=15
Fval:=4
Tval:=3 * Fval:=5 digitlexval:=4
Fval:=3 digitlexval:=3
digitlexval:=5
LEn
E E1+T E T T T1*F T F F (E) F digit
22
◆综合属性值的计算方法
从左到右扫描后缀式,每碰到运算对象就推进栈; 碰到运算符就从栈顶弹出相应目数的运算对象施加 运算,并把结果推进栈。最后的结果留在栈顶。
例:表达式-b+c*d的后缀式 b@cd*+的计值过程
d
c
t2
t1
bt1
t1
t1= - b
t2= c*d t3= t1+t2
5
• 逆波兰表示法的扩充 逆波兰表示法很容易扩充到表达式以外的范围 例如:
➢ 语法制导翻译法不论对自上而下分析或自下而上 分析都适用
14
❖ 翻译的任务:语法结构的静态语义分析和
正确性检查,若正确,则翻译成中间代码或目标 代码。
❖ 使用的方法:称作语法制导翻译。
❖ 基本思想(简言之):根据翻译的需要设置文
法符号的属性(这些属性代表与文法符号相关的
信息),以描述语法结构的语义。
print(Eval) E val := E1 val+T val E val := T val T val := T1 val*F val T val := F val F val := E val F val := digitlexval
例如:把 左例中的 类型扩充 到 int和
real。
8
6.1.2 三元式和树形表示
• 格式: (算符, 第一运算对象, 第二运算对象)
• 如:
a=b*c+b*d
=
(1) (*,b,c)
a
+
(2) (*,b,d)
(3) (+,(1),(2)) (4) (=,(3),a)
*
*
b
c
b
d
9
6.1.3 四元式
• 由于三元式中的结果是用它的编号表示的,当在三 元式进行优化后,就要用一定的时间重新安排三元
个结点处使用语义规则计算综合属性的值。仅仅使用综
合属性的属性文法称S—属性文法。
继承属性:
在语法树中,一个结点的继承属性由此结点的父结
点和/或兄弟结点的某些属性确定。用继承属性来表示
程序语言结构中的上下文依赖关系很方便。
19
例6.1 台式计算器程序的语法制导定义(表6.1)
产生式
语义规则
S’E E E1+T E T T T1*F T F F (E) F digit
2、能充分反映源程序的特点。
中间代码的几种形式
逆波兰、四元式、三元式、树型
3
6.1.1 逆波兰记号(后缀式)
• 将运算对象写在前面,把运算符号写在后面
表达式 a+b a+b*c (a+b)*c a=b*c+b*d
逆波兰式 ab+ abc*+ ab+c* abc*bd*+=
4
• 后缀式的计算机处理 后缀式的最大优点是易于计算机处理 处理过程:
式的编号,很费时间。为了防止优化后的重新编址,
在三元式基础上增加了一个存放结果的单元,这就 形成了四元式子,是一种最常用的形式。
• 格式: (算符, 第一运算对象, 第二运算对象, 结果)
• 如: a=b*c+b*d (1) (*,b,c,t1) (2) (*,b,d,t2)
(3) (+,t1,t2,t3)
编译程序的功能和组织结构
表处理
前 端中 中后目端
源 程 序
词语语间间标 法法义代代代 分分分码码码 析析析生优生
目 标 程 序
成化成
错误处理
1
第六章 语法制导翻译
❖ 6.1 中间代码的形式 ❖ 6.2 语法制导翻译的概述 ❖ 6.3 自底向上的制导翻译
2
6.1 中间代码(源程序的中间形式)
何谓中间代码:
•
安全放在第一位,防微杜渐。20.11.15 20.11.1 517:48:2117:4 8:21No vember 15, 2020
2.b是中的符号的一个继承属性并且c1,c2,…,
ck是A或中的任何文法符号的属性。 在两种情况下,都说
属性b依赖于属性c1,c2,…,ck。
17
要特别强调的是: (1)终结符只有综合属性,它由词法分析器提供; (2)非终结符既可以有综合属性也可以有继承属性,
文法开始符号的所有继承属性作为属性计算前的初始值。 一般来讲,对出现在产生式右边的继承属性和出现在
对于s-属性定义 通常使用自底向上的分析方法
在建立 每一个 结点处
使用语义规 则来计算
综合 属性值
即在 用哪个产生式进行归约后,就执行 那个产生式的s-属性定义计算属性的值,
从叶结点到根结点进行计算。
23
继承属性
继承属性值是由此结点的父结点和/或 兄弟结点的某些属性值来决定的。
例 变量说明的类型定义 int a,b,c
•
人生得意须尽欢,莫使金樽空对月。1 7:48:21 17:48:2 117:48 11/15/2 020 5:48:21 PM