语法制导翻译概述

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
➢ 语法制导翻译法不论对自上而下分析或自下而上 分析都适用
❖ 翻译的任务:语法结构的静态语义分析和
正确性检查,若正确,则翻译成中间代码或目标 代码。
❖ 使用的方法:称作语法制导翻译。
❖ 基本思想(简言之):根据翻译的需要设置文
法符号的属性(这些属性代表与文法符号相关的
信息),以描述语法结构的语义。
例如,一个变量的属性有类型,层次,存储地址等 。表达式的属性有类型,值等。属性值的计算和产 生式相联系。随着语法分析的进行,执行属性值的 计算,完成语义分析和翻译的任务。
❖ 属性一般分为两类:综合属性和继承属性。 简单的说,综合属性用于“自下而上”传递 信息,而继承属性用于“自上而下”传递信 息。
❖ 属性加工加工的过程即是语义处理的过 程,对于文法的每一个产生式都配备了一组 属性的计算规则,则称为语义规则。
语法制导定义的形式
一个属性文法它包含一个上下文无关文法和一系列语 义规则,这些语法规则附在文法的每个产生式上。
在一个语法制导定义中,A→P都有与之相关
联的一套语义规则,规则形式为
b:= f(c1,c2,…,ck),
逆波兰、四元式、三元式、树型
6.1.1 逆波兰记号(后缀式)
❖ 将运算对象写在前面,把运算符号写在后面
表达式 a+b a+b*c (a+b)*c a=b*c+b*d
逆波兰式 ab+ abc*+ ab+c* abc*bd*+=
❖ 后缀式的计算机处理 ➢ 后缀式的最大优点是易于计算机处理 ➢ 处理过程:
可以使编译程序的结构清晰、简单、明确。源程序的一种内 部表示,不依赖目标机的结构,易于机械生成目标代码的中间表 示。
为什么要此阶段及使用原则
主要优点是可移植(与具体目标程序无关),且易于目标代码优化 原则:1、形式比较简单,容易翻译成相应的目标机器代码。
2、能充分反映源程序的特点。
中间代码的几种形式
ຫໍສະໝຸດ Baidu
产生式
EE+T E T T TF
T F F (E) F a
翻译成分
E=ET+ E=T T=TF T=F F=E F=a
❖ 确定输入a+aa的输出: (E,E)(E+T,ET+) (T+T,TT+) (F+T,FT+) (a+T,aT+) (a+TF,aFF+) (a+FF,aFF+) (a+aF,aaF+) (a+aa,aaa+)
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
6.1.3 四元式
❖ 由于三元式中的结果是用它的编号表示的,当在三 元式进行优化后,就要用一定的时间重新安排三元 式的编号,很费时间。为了防止优化后的重新编址 ,在三元式基础上增加了一个存放结果的单元,这 就形成了四元式子,是一种最常用的形式。
语句 a:=b+c GOTO L
逆波兰表示 abc+:= L jmp
If E then S1 else S2 ES1S2¥
备注
:=看作二目运算符
jmp 看 成 一 目 运 算 符,表示GOTO 把¥ 看成三目运 算符,表示if – then –else
逆波兰示例
• 例:
把下述产生式定义的算术表达式映射到后缀波兰表示 :
(1) t1:=-b (2) t2:=t1*c (3) t3=t2+d (4) t4=t3*e (5) t5=a+t4
❖ 同样要将算法语言翻译成相应的四元式,也 要将四元式扩充到其他运算符,如(jmp,_,L) 表示无条件转向第L条四元式。
6.1.4 汇编代码
汇编语言是依赖于机器的低级程序设计语言, 它是面向具体的计算机系统或相应的计算机 系列的,它和三元式相比有以下优点:
f是一个函数,而且
1.b是A的一个综合属性并且c1,c2,…,ck是
中的符号的属性,或者
2.b是中的符号的一个继承属性并且c1,c2,
…,ck是A或中的任何文法符号的属性。 在两种情况下,都说
属性b依赖于属性c1,c2,…,ck。
要特别强调的是:
(1)终结符只有综合属性,它由词法分析器提供; (2)非终结符既可以有综合属性也可以有继承属性 ,文法开始符号的所有继承属性作为属性计算前的初始 值。
语法制导翻译概述
第六章 语法制导翻译
❖ 6.1 中间代码的形式 ❖ 6.2 语法制导翻译的概述 ❖ 6.3 自底向上的制导翻译
6.1 中间代码(源程序的中间形式)
何谓中间代码:
(Intermediate code/
Intermediate representation/Intermediate language)
❖ 格式: (算符, 第一运算对象, 第二运算对象, 结果)
❖ 如: a=b*c+b*d (1) (*,b,c,t1) (2) (*,b,d,t2) (3) (+,t1,t2,t3) (4) (=,t3,-,a)
四元式的特点
❖ 类似于三地址指令 ❖ 四元式虽然比三元式多了一结果的引用,但有利于优
化和代码生成 ❖ 为了便于书写四元式也可以写成如下形式: ❖ <结果>:=<运算对象1><运算符><运算对象2> ❖ 则表达式a+(-b*c+d)*e的四元式为:
(1)能方便地翻译成目标机器指令。 (2)不必直接计算转移地址。 (3)可以使用各种数据表示法。
6.2 语法制导翻译的概述(如何把源
程序翻译成相应的中间代码)
➢ 基本思想: 在语法分析过程中,随着分析的步步进展,每当 使用一条产生式进行推导(对于自上而下分析) 或归约(对于自下而上分析),就执行该产生式 所对应的语义动作,完成相应的翻译工作。 语法制导翻译就是把语言的一些属性附加到代表 语言结构的文法符号上,这些属性值是由附加到 文法产生式的“语义规则”中计算的,也就是为 每个产生式配备翻译子程序,即语义子程序。
从左到右扫描后缀式,每碰到运算对象就推进栈; 碰到运算符就从栈顶弹出相应目数的运算对象施加 运算,并把结果推进栈。最后的结果留在栈顶。
例:表达式-b+c*d的后缀式 b@cd*+的计值过程
d
c
t2
t1
bt1
t1
t1= - b
t2= c*d t3= t1+t2
❖ 逆波兰表示法的扩充 逆波兰表示法很容易扩充到表达式以外的范围 例如:
相关文档
最新文档