语法制导翻译

合集下载

编译原理课件05语法制导翻译技术和中间代码生成

编译原理课件05语法制导翻译技术和中间代码生成

5.4 中间代码
四元式的特点: 1. 四元式出现的顺序和语法成份的计值 顺序相一致. 2. 四元式之间的联系是通过临时变量实 现的,这样易于调整和变动四元式. 3. 便于优化处理.
5.4 中间代码
编译系统中,有时将四元式表示成另一 种更直观,更易理解的形式——三地址代 码或三地址语句. 三地址代码形式定义为: result := arg1 OP arg2 三地址语句:语句中是三个量的赋值语句, 三地址语句 每个量占一个地址.
5.5 自下而上的语法制导翻译
例3 简单算术表达式翻译到四元式的 语义描述 例如,设有简单算术表达式的文法: E→E+E | E*E | (E) | i
T R / S T
c S a c
c R S
输入是bR / bTc / bSc /ac 输出为: 1 4 5 314 24 31 给出相应语义动作(翻 译方案) S→bTc { print "1"} { print "2"} S→a R T→R { print "3"} R→R/S { print "4"} R→S { print "5"}
5.1 概述
例如: 表达式 A+B*C 对运算对象进行类型检查, 对变 量进行先定义后使用检查 执行真正的翻译 如果静态语义正确, 语义处理则要执 行真正的翻译, 即生成程序的某种中间 代码的形式或直接生成目标代码.
5.1 概述
目前多数编译程序进行语义分析的方 法是采用语法制导翻译法 .它不是一种 采用语法制导翻译法 形式系统, 但它比较接近形式化. 语法制导翻译法使用属性文法为工具 来描述程序设计语言的语义.
5.4 中间代码

语法制导翻译

语法制导翻译
例:图5-7的一个拓扑排序 1,2,3,4,5,6,7,8,9
或1,3,5,2,4,6,7,8,9
编译原理
20
循环依赖Circular dependency
产生式 AB
语义规则 A.s := B.i B.i := A.s + 1
A A.s
B B.i
编译原理
21Biblioteka 属性计算次序构造输入的分析树, 构造属性依赖图, 对结点进行拓扑排序, 按拓扑排序的次序计算属性。
介绍语法制导翻译的实现方法。
编译原理
3
语法制导翻译的一般过程
输入符号串 分析树 依赖图 语义规则的计算顺序
一个句子的翻译过程可以与语法分析过程并行。
编译原理
4
5.1 语法制导定义
语法制导定义是对CFG的推广,每个文法符号都有 一个相关的属性集。
属性:语义信息。一个文法符号通常用一个或若干 个属性来描述它的语义信息。典型例子: ▪ 变量的数据类型 ▪ 表达式的值 ▪ 变量的存储位置 ▪ 程序的目标代码
F.val := digit.lexval
编译原理
13
图5-4
T.val = 15
F.val = 3
T′.inh = 3
.syn =15
digit.lexval =3
*
T1′.inh = 15
F.val = 5
.syn =15
digit.lexval = 5
编译原理
14
继承属性
一个结点的继承属性值由该结点的父结点和(或) 兄弟结点的属性决定。
分析树各结点属性的计算可以自底向上地完成。
编译原理
11
8+5*2 n的注释分析树 (annotated parse tree)

语法制导翻译

语法制导翻译
主要内容包括: 1. 语法制导翻译的基本概念 2. 中间代码简介 3. 符号表简介 4. 典型声明语句与可执行语句的翻译
2
4.1 语法制导翻译简介
语法与语义
1. 语法与语义的关系 语法是指语言的结构、即语言的“样子”;语义是指附着于语
言结构上的实际含意 ,即语言的“意义”。 ① 语义不能离开语法独立存在; ② 语义远比语法复杂; ③ 同一语言结构可包含多种含意,不同语言结构可表示相
② 若b是α中某文法符号Xi的属性,c1, c2, ..., ck是A的属性, 或者是α中其它文法符号的属性,则称b是Xi的继承属性。
③ 称(4.1)中属性b依赖于属性c1, c2, ..., ck。
④ 若语义规则的形式如下述(4.2),则可将其想像为产生式左 部文法符号A的一个虚拟属性。属性之间的依赖关系,在 虚拟属性上依然存在。
k := k+1;
9
4.1 语法制导翻译简介
产生式
语法制导定义
翻译方案
L→E
print(E.post)
print_post(post);
E → E1 + E2 E → num
E.post := E1.post || post(k) := '+'; E2.post || '+'; k := k+1;
1. 编译器各阶段的完整输出,均可以被认为是源程序的某种 中间表示。
2. 本章讨论的是中间代码生成器输出的中间表示,称之为中 间代码。
3. 中间代码实际上应起一个编译器前端与后端分水岭的作用。 4. 要求中间代码具有如下特性,以便于编译器的开发移植和
代码的优化: ① 便于语法制导翻译; ② 既与机器指令的结构相近,又与具体机器无关。 5. 中间代码的主要形式:树、后缀式、三地址码等。

属性文法和语法制导翻译

属性文法和语法制导翻译

id1
如果一属性文法不存在属性 之间的循环依赖关系,那么 称该文法为良定义的
T type
5 in L
4
real
7 in L y 8 ,
y6 id3 entry 3
9 in L y 10 ,
id2 entry 2
id1 entry 1
属性的计算顺序
无环有向图的拓扑排序
无环有向图中节点m1,m2,…,mk的拓扑排序是:若 mi→mj是从mi到mj的边,那么在此排序中mi先于mj 依赖图的任何拓扑排序都给出了一个分析树中各节点 语义规则计算的正确顺序,即在计算f之前,语义规则
real id1,id2,id3
语法制导翻译
基于属性文法的处理过程通常是:
对符号串进行语法分析,
构造语法分析树
根据需要遍历语法树并在语法树的各结点处按语义规 则进行计算。
这种由源程序的语法结构驱动的处理办法就是语法制 导翻译法。
在某些情况下,在进行语法分析的同时完成语义规则
的计算而无须明显地构造语法树或构造属性之间的依
real L.in=real ,
id3
L.in=real ,
id2
id1

产生式 D→TL T→int T→real L→L1 , id
L→id
语义规则 L.in := T.type T.type := integer T.type := real L1.in := L.in addtype(id.entry, L.in) addtype(id.entry, L.in)
为每个包括过程调用的语义规则引入一个虚综合属性b,把每条 语义规则都变成b=f(c1,c2,...,ck)的形式 依赖图的每个结点表示一个属性 边表示属性间的依赖关系。如果属性b依赖于属性c,那么从c到 b就有一条有向边

第8讲 语法制导翻译_1

第8讲 语法制导翻译_1
输入:
3*5+4n
副作用(Side effect)
语义规则
E.val=15 + T.val=4
print(E.val)
E.val = E1 .val + T.val E.val = T.val
T.val = T1val × F.val
T.val = F.val
T.val=15
F.val=4
T.val=3 * F.val=5 digit.lexval=4
如果一个SDD是S属性的,可以按照语法分析树节点的任何 自底向上顺序来计算它的各个属性值
S-属性定义可以在自底向上的语法分析过程中实现
L- 属 性 定 义
L-属性定义( 也称为L属性的SDD或L-SDD) 的 直观含义:在一个产生式所关联的各属性之间, 依赖图的边可以从左到右,但不能从右到左 ( 个SDD是L-属性定义,当且仅当它的每个属性要 么是一个综合属性,要么是满足如下条件的继承属 性:假设存在一个产生式A→X1X2…Xn,其右部符 号Xi (1 i n)的继承属性仅依赖于下列属性:
A的继承属性 产生式中Xi左边的符号 X1, X2, … , Xi-1 的属性 Xi本身的属性,但Xi 的全部属性不能在依赖图中形成环路
将每个产生式和一组语义规则相关联,用来计算 该产生式中各文法符号的属性值
文法符号的属性
综合属性 ( synthesized attribute) 继承属性 ( inherited attribute)
综 合 属 性 ( synthesized attribute)
在分析树结点 N上的非终结符A的综合属性只能通 过 N的子结点或 N本身的属性值来定义
两个概念
将语义规则同语法规则(产生式)联系起来要 涉及两个概念

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

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

剩余串 3+ 45# +45# +45# +45# +45# 5# 5# 5# 5# 5# #
主要动作
r6 r4 r2
r6 r4
r6 # # r3 r1 acc
表达式3 + 4 5的语法语义分析和计值过程
§5.3
中间语言
所谓中间语言,也称中间代码,是复杂性介 于源程序语言和机器语言的一种记号系统。一般 来说,快速编译程序直接生成目标代码,没有将 中间代码翻译成目标代码的额外开销。但是为了 使编译程序结构在逻辑上更为简单明确,使生成 的的目标代码更为高效,通常采用中间语言。 编译程序所使用的中间语言形式较多。常见 的逆波兰式、三元式、四元式和树形表示等。来自bcd
3. 间接三元式 为了尽量不改变三元式表,可以另设一张间 接码表来表示有关三元式在三元式表的 计值顺序。用这种方法获得的中间代码 称为间接三元式。
例如,表达式a := x+y z b := t-y z 的间接三元式表示如图所示。
三元式列表 (1)( ,y,z) (2)(+,x,(1)) (3)(:=,a,(2)) (4)(-,t,(1)) (5)(:=,—,(4))
§5.4 自底向上语法制导翻译
语法制导翻译分为自底向上和自底向下两种。 自底向上语法制导翻译方法就是在自底向上语法 分析过程中逐步执行语义规则。也就是在每次归 约的同时执行相应的语义动作。
5.4.1 简单算术表达式和赋值语句的翻译
简单算术表达式和赋值语句是指不含数组 元素、记录等复杂数据结构的算术表达式和赋值 语句。
简单算术表达式求值的属性文法。 例5.1 :
规则 1.S→E 2.E→E1+T 3.E→T 4.T→T1 F 5.T→T1 6.F→(E) 7.F→digit 语义规则 print(E.val) E.val := E1.val+T.val E.va1 := T.valv T.val := T1.val F.val T.val := T1.val F.val := E.val F.val := digit.lexval

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

E→E1 + T T→T1 * F F →id
E.val:=E1.val+T.val T.val:=T1.val*F.val F.val:=id.val
❖ 适宜在完成归约的时候进行
3. 典型处理方法
❖ 在产生式的右部的适当位置,插入相应的语义 动作,按照分析的进程,执行遇到的语义动作
D → T { L.in := T.type } L T → int { T.type := integer } T → real { T.type := real } L → { L1.in := L.in }L1,id{…} 语义——可以看成是相应文法符号的属性
表5.2 带有继承属性L.in的语法制导定义
产生式
语义规则
DTL
Lin:=T type
T int
T type :=integer
T real
T type :=real
L L1,id
L1 in :=L in addtype(id entry,L in)
L id
addtype(id entry,L in)
◆属性 继承属性:由该节点的兄弟节点及父节点的属性值计算出来;
◆依赖图 语义规则建立了属性之间的依赖关系,这些关系可
以用图来表示,这样的图称为依赖图。
5.1.1 语法制导定义的形式
在一个语法制导定义中,A→P都有与 之相关联的一套语义规则,规则形式为
b:= f(c1,c2,…,ck), f是一个函数,而且或者
❖ 适宜在进行推导时完成
语义翻译的流程

















实际上,编译中语义翻译的实现并不是 按图中的流程处理的;而是随语法分析

的进展,识别出一个语法结构,就对它
的语义进行分析和翻译。
5.1 语法制导定义(Syntax-directed definitions)
◆语法制导定义是对上下文无关文法的推广 ➢每个文法符号都有一个相关的属性集。 综合属性:通过分析树中其子节点的属性值计算出来;
1.b是A的一个综合属性并且c1,c2,…,ck 是中的符号的属性,或者
2.b是中某个符号的一个继承属性并且c1, c2,…,ck是A或中的任何文法符号的属性。
在两种情况下,都说属性b依赖于属性c1,c2,…,ck。
例5.1 台式计算器程序的语法制导定义(图5-2)
产生式
语义规则
LEn E E1+T E T T T1*F T F F (E) F digit
D
T4 type
in 5 L
real ,
in 7 L 8
6 id3 3 entry
in 9 L 10 ,
id2 2 entry
id1 1 entry
5.1.4 依赖图_获得语义规则的计算顺序
依赖图的构造方法
for 分析树中的每个结点n do for 与结点n对应的文法符号的每个属性a do 在依赖图中为a构造一个结点; for 分析树的每个结点n do for 结点n所用产生式对应的每条 语义规则 b:=f(c1,c2,…,ck ) do for i:=1 to k do 从结点ci到结点b构造一条有向边;
2. 代码结构
❖ 计算学科:对信息(数据表示)描述和变 换算法的系统研究
❖ 变换:源、目标以及源与目标的对应关系 ❖ 语句的代码结构 ❖ 语句分类:
说明语句——符号表的查填 可执行语句——指令代码
3. 典型处理方法
❖ 对应每一个产生式编制一个语义子程序, 当一个产生式获得匹配时,调用相应的 语义子程序实现语义检查与翻译
print(Eval)(可看作是L的虚属性) 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
5.1.2 综合属性
S-属性定义 ✓仅仅使用综合属性的语法制导定义。 ✓结点属性值的计算正好和自底向上分析建 立分析树结点同步进行。
例5-5 图5-5分析树的依赖图
T
4
type
real
D in 7
in 5
L
8
,
L
6 3 entry
id3
in 9
ห้องสมุดไป่ตู้
L
10
,
id1 1 entry
id2 2 entry
5.1.5 计算顺序
• ??为什么进行词法和语法分析 • ??用A→α进行归约表达的是什么意思 • 看:operand+term • E→E1+T • E1的值+T的值的结果作为E的值——即:取来
E1的值和T的值做加法运算,结果作为E的值
• E.val=E1.val+T.val
第五章 语法制导翻译
❖ 翻译的任务
首先是语义分析和正确性检查,若正确,则翻译成 中间代码或目标代码。
析方法,在建立每一个结点处使用语义规则来 计算综合属性值,即在用哪个产生式进行归约 后,就执行那个产生式的S-属性定义计算属性 的值,从叶结点到根结点进行计算。 5.1.3 继承属性
继承属性值是由此结点的父结点和/或兄弟 结点的某些属性值来决定的。
例5 . 3 变量说明的属性定义 int a,b,c
例 5 .2 输入:3*5+4n
L
Eval:=19
n
Eval:=15 +
Tval:=4
Tval:=15
Fval:=4
Tval:=3 * Fval:=5 digitlexval:=4
Fval:=3
digitlexval:=5
digitlexval:=3
◆综合属性值的计算方法 对于S-属性定义,通常使用自底向上的分
❖ 基本思想
根据翻译的需要设置文法符号的属性,以描述语法 结构的语义。
例如,一个变量的属性有类型,层次,存储地址等。 表达式的属性有类型,值等。
属性值的计算和产生式相联系。随着语法分析的进 行,执行属性值的计算,完成语义分析和翻译的任 务。
5.1 语法制导翻译概述
❖ 语法制导翻译的概念描述
在进行语法分析的同时,完成相应的语义处理
E→E1 + E2
E.val:=E1.val+E2.val
❖ 语法结构具有规定的语义
❖ 问题:如何根据被识别出的语法成分进行 语义处理?
1. 语义分析的任务
❖ 语义检查
例:类型、运算、维数、越界
❖ 语义处理
例:变量的存储分配 例:表达式的求值 例:语句的翻译(中间代码的生成)
❖ 总目标:生成等价的中间代码
相关文档
最新文档