第六章 语义分析和语法制导翻译

合集下载

第6章语法制导

第6章语法制导
• 方法
–编写说明语句的文法 编写说明语句的文法 –将类型信息作为类型描述 T 的属性 type 将类型信息作为类型描述 in。 和变量表 L 的属性 in。
• 目的
–分析说明语句 D,为变量指定类型 分析说明语句
13
addtype
addtype
addtype
例:real id1,id2,id3 的分析树和 属性计算 14
2
语义分析的任务
• 语义检查
–例:类型、运算、维数、越界 例 类型、运算、维数、
• 语义处理
–例:变量的存储分配 例 –例:表达式的求值 例 –例:语句的翻译(中间代码的生成) 例 语句的翻译(中间代码的生成)
• 总目标:生成等价的中间代码 总目标:
3
处理方法
• 对应每一个产生式编制一个语义子程序, 对应每一个产生式编制一个语义子程序, 当一个产生式获得匹配时, 当一个产生式获得匹配时,调用相应的语 义子程序实现语义检查与翻译。 义子程序实现语义检查与翻译。 • 在产生式的右部的适当位置,插入相应的 在产生式的右部的适当位置, 语义动作,按照分析的进程, 语义动作,按照分析的进程,执行遇到的 语义动作。 语义动作。
第六章
• • • • •
属性文法和语法制导翻译
语法制导翻译概述 属性文法 翻译模式 自顶向下翻译方法 自底向上翻译方法
1
6.1 语法制导翻译概述
• 语法制导翻译以属性文法为基础 • 语法结构具有规定的语义 • 在进行语法分析的同时,完成相应的语 在进行语法分析的同时, 义处理 • ???如何根据被识别出的语法成分进 ???如何根据被识别出的语法成分进 行语义处理
消除左递归后的翻译模式: 消除左递归后的翻译模式: E → T {R.i := T.val} R{E.val:=R.s} R → + T {R1 .i:=R.i+T.val} } R → - T {R1 .i:=R.i+T.val} } R → ε {R.s:=R.i} R T → num T → ( E )

6-1-语义分析和语法制导翻译

6-1-语义分析和语法制导翻译
(Inherited Attributes)。
2022/2/4
7
属性文法的定义
定义6.3 属性文法AG是一个四元组:AG=(G,A,R,B), 其中, G是已简化的CFG;
A=∪X∈VA(X)是属性的有限集合;
R= ∪p∈PR(p)是属性定义规则的有限集;
B=∪p∈PB(p)是条件的有限集合,B(p)用于描述使R(p)有效 的条件;
1.每个文法符号和语义动作符X都有一个相关的有限属性集合A(X),且每 个属性都有一个允许值的集合(属性的值域,可以是无限集)。
2.非终结符和动作符的属性可分为继承属性与综合属性两类。
3.继承属性的定义规则为:
①开始符号的继承属性具有指定的初始值;
②对于给定的产生式p:Y→X1X2…Xn∈P,Xi的继承属性值由p中其它符号 的属性值进行计算:Xi.a=f(Y.b, Xk1.ak1,…,Xkm.akm) i{k1,…,km}
2022/2/4
2
中间代码
中间代码生成:
–指把单词符号串形式的源程序转换为另一种等价的便于 代码优化处理和目标代码生成表示。
两个主要问题:
–如何描述语言的语义(语法制导翻译方法); – 中间代码如何表示(逆波兰表示、三元式、四元式等)。
2022/2/4
3
语法制导翻译方法概述
语法制导翻译方法
– 在语法分析过程中,随着分析的步步进展,根据每个产生式所对应的 语义子程序进行翻译(产生中间代码)的方法。
– 实质就是根据文法中每个产生式的语义,为其配备若干个语义子程序, 对所要完成的功能进行描述。
产生式语义:
– 由组成该产生式所有文法符号的语义决定。
语义:
– 文法符号X的语义信息,称之为语义属性或简称为属性。 – 可用形如X.ATTR的记号来表示文法符号X的相关语义属性。

2019年六章语法制导翻译与属文法.ppt

2019年六章语法制导翻译与属文法.ppt
2019/4/24 16
继承属性


当分析树的结构同源代码的抽象语法不“匹 配”时,继承属性将非常有用。下面的例子 可以说明怎样用继承属性来解决这种不匹配 问题,产生这种不匹配的原因是因为文法通 常是为语法分析而不是为翻译设计的。 例6.2


考虑如何在自顶向下的分析过程中计算3*5和 4*8*9这样的表达式项 消除左递归之后的算数表达式文法的一个子集: T→FT ' T '→*FT1' T '→ε F→digit

概念术语





综合属性:节点的属性值是通过分析树中该 节点或其子节点的属性值计算出来的 继承属性:节点的属性值是由该节点、该节 点的兄弟节点或父节点的属性值计算出来的 固有属性:通过词法分析直接得到的属性 依赖图:描述属性之间依赖关系的图,根据 语义规则来构造 注释分析树:节点带有属性值的分析树
2019/4/24
7
6.1 语法制导翻译概述

一个文法符号X所携带的语义信息称为X的语 义属性,简称为属性,它是根据翻译的需要设 置的(对应分析树结点的数据结构),主要用于 描述语法结构的语义。

一个变量的属性有类型、层次、存储地址等 表达式的属性有类型、值等。
2019/4/24
8
6.1 语法制导翻译概述
2019/4/24 22
依赖图的构造方法
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的有向边;

06第6章语法制导翻译技术概论

06第6章语法制导翻译技术概论

① E→E+T ② E→T ③ T→T*F ④ T→F
⑤ F→(E) ⑥ F→a ⑦ F→b ⑧ F→c
① E→E+T@+ ② E→T ③ T→T*F@* ④ T→F
⑤ F→(E) ⑥ F→a@a ⑦ F→b@b ⑧ F→c@c
2020/11/13
8
语法制导翻译的基本思想 通俗地讲,以语法分析为基础,伴随语法分析的各个步骤,执 行相应的语义动作。 具体方法: 1.将文法符号所代表的语言成分的意思,用隶属于该文法符 号的属性表示; 2.用语义规则(语义规则的执行就是语义动作)规定产生式所 代表的语言成分之间的关系(即属性之间的关系),即用语义 规则实现属性计算。 3.语义动作(语义规则的执行): 在语法分析的适当时刻(如推导或归约)执行附在对应产生 式上的语义规则,以实现对语言结构语义的处理,如计算、查 填符号表、生成中间代码、发布出错信息等。
10
-对改写后文法的每个非终结符号编写一个函数。
代标 码代 优码 化生
目 标 代 码


➢ 词法分析和语法分析仅仅对源程序做形式变换和检查。
➢ 语义分析检查程序语义是否正确。
➢ 中间代码生成将语义分析后的结果翻译成代码。
☻上述工作过程采用串行处理方式 ☻实际应用中语法分析、语义分析、中间代码生成采用并
行处理方式
2020/11/13
3
并行处理方式:
消除左递归得到: E→TE’ E’ →+T@+E’|ε T→FT’ T’ →*F @* T’|ε F→(E)|a@a| b@b| c@c
求FIRST集和 FOLLOW集不 考虑动作符号
FIRST(TE’)={(,a,b,c} FIRST(+T@+E’)={+} FOLLOW(E’)={#,)} FIRST(FT’ )={(,a,b,c} FIRST(*F @* T’)={*} FOLLOW(T’)={#,+,)} FIRST((E))={(} FIRST(a@a)={a} FIRST(b@b)={b} FIRST(c@c)={c}

最新六章语法制导翻译与属文法

最新六章语法制导翻译与属文法

2021/1/11
10
典型处理方法二
翻译模式
通过将属性与文法符号关联,并将语义规则插入到产生式 的右部来描述语言结构的翻译方案
在产生式的右部的适当位置,插入相应的语义动 作,按照分析的进程,执行遇到的语义动作
D → T { L.inh := T.type } L
T → int { T.type := integer }
这两种情况下,都说属性b依赖于属性c1,c2,…,ck
2021/1/11
14
例6.1 台式计算器的语法制导定义
产生式 LEn E E1+T E T T T1*F T F F (E) F digit
语义规则 print(Eval)(可看作是L的虚属性) Eval := E1val+Tval Eval := Tval Tval := T1val+Fval Tval := Fval Fval := Eval Fval := digitlexval
E→E1 + E2
E.val:=E1.val+E2.val
语法结构具有规定的语义
问题:如何根据被识别出的语法成分进行 语义处理?
亦即怎样将属性值的计算及翻译工作同产生式 相关联?
2021/1/11
9
典型处理方法一
语法制导定义
通过将属性与文法符号关联、将语义规则与产生 式关联来描述语言结构的翻译方案
2021/1/11
16
继承属性
当分析树的结构同源代码的抽象语法不“匹 配”时,继承属性将非常有用。下面的例子 可以说明怎样用继承属性来解决这种不匹配 问题,产生这种不匹配的原因是因为文法通 常是为语法分析而不是为翻译设计的。
例6.2

语义分析与语法制导翻译

语义分析与语法制导翻译
/* newtemp => t1 => E.place */ => E11.code || gen( ‘t2:= 0 -’ E11.place )
/* newtemp => t2 => E1.place */
|| E21.code || E22.code || gen( ‘t3:=’ E21.place’*’E22.place )
9
8
三地址代码
一般形式 x := y op z
其中 x, y, z 为变量名、常数或编译 产生的临时变量
四元式(op, x, y, z)
种类:x := y op z
双目运算
x := op y
单目运算
x := y
赋值
if x relop y goto l
条件转移
其他三地址代码
goto l param x call p, n (n是参数个数) return x x := y[i] x[i] := y x := &y x := *y *x = y
注释: || 表示代码序列的连接

例 6-7:
翻译 a:= -c+b*34
id := E
E1 +
E2

E 11 E 21 *
E 22
id id
num
结果:开始符号的属性 S.code
1) 找出分析树中使用的产生式规则 2) 根据产生式的语义规则,代换公式中的
各属性 3) 反复使用 1) 和 2) 改写公式,最后得
如:算术表达式求值的属性文法
L-属性定义:
其属性可用深度优先的顺序从左 至右计算
对于所有 A→X1 X2 … Xn Xi 属性计算仅使用A X1 X2 …

第6章 语法制导翻译和语义分析详述

第6章 语法制导翻译和语义分析详述
随着编译的进展,对语法分析产生的语法树进行语义分析,且分析 的结果用中间代码描述出来。对于一棵等待翻译的语法树,它的各个结 点都是文法中的一个符号X,该X可以是终结符或非终结符。根据语义处 理的需要,在用产生式A→αXβ进行归约或推导时,应能准确而恰当地表 达文法符号X在归约或推导时的不同特征。
例如,判断变量X的类型是否匹配,要用X的数据类型来描述;判断 变量X是否存在,要用X的存储位置来描述;而对X的运算,则要用X的 值来描述;因此,语义分析阶段引入X的属性,如X.type、X.place、X.val 等来分别描述变量X的类型、存储位置以及值等不同的特征。
其值由说明中的关
in:继承属性,
键字确定
产生式 (1)D→TL (2)T→int (3)T→float
(4)L→L1,id
(5)L→id
语义规则 {L.in = T.type;} {T.type = int;} {T.type = float;} {L1.in = L.in; addtype(id.entry,L.in); } {addtype(id.entry,L.in);}
(3)常见的中间代码形式
①后缀式(逆波兰表示式) ②图表示法 ❖ 抽象语法树 ❖ DAG图 ③三地址代码 ❖ 四元式 ❖ 三元式 ❖ 间接三元式
2、 常见的中间代码形式
(4)后缀式(逆波兰式)
①定义 后缀式表示法(逆波兰表示法),由波兰逻辑学家卢卡西维奇
(Lukasiewicz)发明,它把运算量(操作数)写在前面,把运算符写在 后面(后缀)的一种表达式表示方法。其归纳定义如下: a) 如果E是一个变量或常数,则E的后缀式是E自身。 b) 如果E是E1 op E2 形式的表达式,op是二元操作符,则E的后缀式为 E1´E2´op,其中E1´,E2´分别是E1和E2的后缀式。 c) 若E是(E1)形式的表达式,则E的后缀式就是E1的后缀式。

语法制导翻译

语法制导翻译
➢ 终结符至少有一种属性,即词文。它还可能具有其 它属性,例如无符号数123,单词“123”就是它的 词文,而其数值以及它的类型(整型)是它的其它 两个属性。终结符的属性是其内在性质.
➢ 非终结符的属性是从其它符号的属性经计算而得的, 即由其它符号的属性定义的。
属性依赖关系
各个文法符号的属性之间,可能存在某种依赖关系,这种依赖关 系可用属性规则(语义规则)定义。
的语法制导翻译技术。
5.2 属性文法与属性翻译文法
➢ 语法制导翻译方法的实质,就是根据文法中每个产 生式所蕴含的语义,为其配备一个(或多个)处理 语句或子程序,对所要完成的功能进行描述。
➢ 产生式的语义是由组成该产生式的文法符号的语义
所决定的。 ➢ 将这些语义以“属性”的形式附加到各个文法符号
上,再根据产生式所蕴含的语义,给出每个文法符 号的属性的求值规则,从而形成一种附带有语义属 性的前后文无关文法,即属性文法。
➢ 文法符号X的语义信息我们称之为语义属性或简称为属性 (Attributes)。
➢ 我们用形如的记号来表示文法符号X的相关语义属性。 ➢ 如果一个文法符号X在一产生式中多次出现,为了在语义上能够对其
进行区分,可添加不同的上标。
文法符号及其语义属性
➢ 文法符号X的语义信息我们称之为语义属性

或简称为属性(Attributes)。 ( + , c, d )
同的上标。 (2)
(j,- ,-,3)
PLACE=NewTemp();
+
‘+’
用这A里➢(需X)假表定例示原X如的布所尔,有文表属达法性式的的G集计[合算E。过]:程中不含有任何的副作用。 它的产一生般形式式为:(op,arg1,arg2,r语esu义lt) 子程序
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
addtype( id.entry, L.in )
将语义动作中的计算向前移,使继承属性的计 算出现在其文法符号之前
翻译模式的设计
D → T { L.in := T.type } L T → int { T.type := integer } T → real { T.type := real } L → { L1.in := L.in } L1 , id { addtype(id.entry, L.in) } L → id { addtype(id.entry, L.in) }
/* newtemp => t3 => E2.place */
|| gen( „t1:=t2+t3‟ ) || gen( „a:=t1‟ ) => gen( „t2:= 0 - c‟ ) || gen( „t3:=b*34‟ ) /* „c‟ => E11.place */ /* „b‟ => E21.place */
指针运算
6.3 赋值语句的翻译
翻译的需求
充分了解各种语言现象的语义
包括:控制结构、数据结构、单词 充分了解它们的实现方法
目标语言的语义
了解中间代码的语义 了解运行环境
实现赋值语句的翻译
语义过程
产生一条中间代码 产生新的临时变量
gen(code) newtemp
属性设置
中间代码序列 存储位置
A→X1 X2 … Xn
属性计算仅使用A X1 X2 … Xi-1 的属性
如:说明语句的属性文法
翻译模式 (Translation Schemes)

特征
规定在语法分析中使用语义规则进行计算
的次序
保证当动作使用某属性时,该属性必须是
可用的

实现方法
将语义动作插入到产生式中的某个位置
addtype
id3
addtype
例6-4:real id1,id2,id3 的
分析树和属性计算
S-属性定义:
仅包括综合属性
对于所有A
→ X1 X2 …Xn, 的属性
A的属性计算仅用X1…Xn
如:算术表达式求值的属性文法
L-属性定义:
其属性可用深度优先的顺序从左
至右计算
对于所有 Xi
断言和谓词
例6-1: 计算器的算法设计

需求:算术表达式的求值 设计:
编制算术表达式的文法 引入属性表示语义信息
将值
val 作为表达式 E、项 T 和因子 F 的属性
用语义规则描述表达式的求值
属性文法(语法制导定义)
产生式
L → E E → E1 + T E → T
T → T1 * F T → F F → ( E ) F → digit
code
place
赋值语句的四元式翻译
S → id := E S.code := E.code || gen( id.place':='E.place ) E → E1 + E2 E.place := newtemp;
E.code := E1.code || E2.code ||
gen(E.place':='E1.place'+'E2.place)
例6-2:说明语句的类型信息统计

说明语句的作用
支持语义分析,提供语义检查的依据

设计
编写说明语句的文法
将类型信息作为类型描述
T 的属性 type
和变量表 L 的属性 in。

目的
分析说明语句
D,获取变量的类型信息
描述类型信息提取的属性文法
产生式 D → T L 语义规则 L.in := T.type
变量名、过程名
建立运行环境
6.1Βιβλιοθήκη 属性文法语义分析与语法制导翻译的描述方法
属性文法的定义:

A=(G,V,F)
是上下文无关文法


属性的有穷集
关于属性的断言和谓词
用法
针对语义,为文法符号设置属性
终结符使用单词的属性
为每个产生式设置语义规则
通过描述各属性的关系 将语义分析和翻译步骤定义为产生式的
E.val=15 T.val=15 T.val=3 F.val=3 digit.attr=3 *

T.val=4 F.val=4
F.val=5 digit.attr=5
digit.attr=4
D T.type=real real L.in=real id1
addtype
L.in=real L.in=real , , id2
1 2
5 6 7 8
三地址代码
一般形式
其中
x := y op z
x, y, z 为变量名、常数或编译 产生的临时变量
四元式(op,
x, y, z)
双目运算
种类:x := y op z
x := op y
x := y
单目运算
赋值
if x relop y goto l
条件转移
其他三地址代码
goto l param x call p, n (n是参数个数) return x x := y[i] x[i] := y x := &y x := *y *x = y 无条件转移 实在参数 过程调用 过程返回 数组运算
从其兄弟结点和父结点的属性值计算出来的 如:L.in
固有属性(单词属性)
属性的计算
构造语法分析树,填加响应的语义规则 综合属性
自底向上按照语义规则来计算各结点的综
合属性值
继承属性
需要探讨计算次序
例6-3:3*5+4 的
语法树与属性计算
L Print(19) E.val=19
6.2
中间语言
用于编译程序
源程序经过语义分析被译成中间代
码序列
(中间语言的语句)
用中间语言过渡的好处:
便于编译系统的实现、移植、代码
优化
常用的中间语言

三地址代码(四元式) 语法结构树(三元式)

后缀式
特点 形式简单、语义明确、便于翻译 独立于目标语言
语法制导编译
描述方法
T → int T → real
L → L1,id L → id
entry addtype
T.type := „integer‟ T.type := „real‟
L1.in := L.in
addtype( id.entry, L.in )
addtype( id.entry, L.in ) 单词 id 的属性(符号表入口) 在符号表中为变量填加类型信息
习题
1. 下列文法是一个二进制数的文法。试根据 该文法,编写一个语法制导定义,描述由 S 生成的二进制数的数值计算。 S -> L . L L -> L B | B B -> 0 | 1 2. 参照下列表达式文法编写语法制导定义, 描述表达式的类型计算。要求在不同精度的 数的计算中,结果取精度高的类型。 E -> E + T | T T -> n.n | n

id := E1 - E 11 E + E 21
例 6-7:
翻译 a:= -c+b*34
E2 * E 22
id
id
num
结果:开始符号的属性 S.code

1)
找出分析树中使用的产生式规则
2) 根据产生式的语义规则,代换公式中的 各属性 3) 反复使用 1) 和 2) 改写公式,最后得 到代码生成语句组成的公式
是语法结构树指针
id.entry
num.val
是名字的表项入口
是数值 建中间结点
树构造函数
mknode mkleaf
建叶结点
生成语法树的属性文法
产生式 S→id:=E 语义规则 S.p:= mknode(':=', mkleaf(id, id.entry), E.p)
E→E1+E2 E.p:= mknode('+', E1.p, E2.p) E→E1*E2 E.p:= mknode('*', E1.p, E2.p) E→ -E1 E→ (E1) E→ id E→ num E.p:= mknode('-', 0, E1.p) E.p:= E1.p E.p:= mkleaf(id, id.entry) E.p:=mkleaf(num,num.val)
/* „34‟ => E22.place */
|| gen( „t1:=t2+t3‟ ) || gen( „a:=t1‟ ) /* „ ‟ => E21.code => E22.code */
表达式翻译中的其他问题
运算类型检查
利用符号表保存的名字类型
类型自动转换
填加专用指令
临时变量空间的统计
例6-6:a := b * (- c) + b *
(- 34) 的语法结构树
root
:= id a +
* id b * id b
- 0 id c - 0 num 34
地址
0 1
算符
操作数
操作数
2
语法结构树的 三元式表示
3 4
5
6 7
8
9 10
id id * id num * + id :=
b c 0 0 b 34 0 4 3 a 9
attr print(
语义规则 print( E.val )
相关文档
最新文档