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

合集下载

第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. 属性文法,基于属性文法的处理方法;2. S-属性文法的自下而上计算;3. L-属性文法的自顶向下翻译;4. 自下而上计算继承属性;本章目标掌握和理解属性方法、基于属性文法的处理方法、S-属性文法和自下而上计算、L-属性文法和自顶向下翻译、自下而上计算继承属性等内容。

本章重点1.语法制导翻译基本思想。

2.语义规则的两种描述方法:语法制导的定义和翻译方案。

语法制导的定义没有指明语义规则的计算次序,而翻译方案显式给出语义规则(或叫语义动作)的计算次序和位置。

3.基于属性文法的处理方法,综合属性定义(S属性定义)和L属性定义。

4.设计简单问题的语法制导定义和翻译方案,这是本章的重点和难点。

这种设计可看成是一种程序设计,是一种事件驱动形式的程序设计,因此它比一般的编程要难得多。

这里的事件是句子中各种语法结构的识别。

5.语义规则的三种计算方法:分析树方法、基于规则的方法和忽略规则的方法。

6.S属性的自下而上计算(边语法分析边属性计算,忽略规则的方法)。

7.L属性的自上而下计算(边语法分析边属性计算,忽略规则的方法)。

8.递归计算(先语法分析后属性计算,基于规则的方法)。

本章难点1. 设计简单问题的语法制导定义和翻译方案;作业题一、单项选择题:1. 文法开始符号的所有________作为属性计算前的初始值。

a. 综合属性b. 继承属性c. 继承属性和综合属性d. 都不是2. 对应于产生式A→XY继承属性Y.y的属性计算,可能正确的语义规则是________。

a. A.a:=f(X.x,Y.y);b. )Y.y:=f(A.a,Y.y);c. Y.y:=f(X.x);d. A.a:=f(Y.y);3. 描述文法符号语义的属性有两种,一种称为__ __,另一种称为__ ___。

a. L-属性b. R-属性c. 综合属性d. 继承属性4. 出现在产生式________和出现在产生式________不由所给的产生式的属性计算规则进行计算,而是由其他产生式的属性规则计算或者由属性计算器的参数提供。

6-第六章_语义分析-1-2-3节

6-第六章_语义分析-1-2-3节

2.语义分析程序 2.语义分析程序
为每个产生式,构造一个语义子程序Subi , 为每个产生式,构造一个语义子程序Sub 语义程序包括: 针对每一条产生式) 语义程序包括:⑴ Subi (针对每一条产生式) 公共子程序) ⑵ Comj (公共子程序)
语法分析程序 Par1,Par2…Park 语义 分析 程序 Sub1 Sub2 Ret1,Ret2…Reth
L.in= real L.in= real , , id2 id3
L.in= real id1
语 义 规 则 L.in:=T.type T.type=integer T.type:=real L1.in:=L.in;addtype(id.entry,L.in) ; addtype(id.entry,L.in)

Subn 中间代码Leabharlann Com1… Com m
例:E→E1 + E2 入口参数(Par) (Par): .PLACE, 入口参数(Par): E1.PLACE, E2.PLACE (存放E1 、E2 的值的单元地址) 存放E 的值的单元地址) 返回参数(Ret): E.PLACE (存放E值的单元地址) 返回参数(Ret): (存放E值的单元地址) (Ret) 存放 生成中间代码 ( +, E1.PLACE, E2.PLACE, E.PLACE)
例: E → E1 + E2 E .code —— E的中间代码序列 E .val —— E的值 存放E E .PLACE —— 存放E的值的单元地址
说明: 不同的中间代码形式、不同的语言成份, 说明: 不同的中间代码形式、不同的语言成份, 使用的属性不同。 使用的属性不同。
属性 • 综合属性(synthesized attribute) 综合属性(synthesized

语法制导翻译概述

语法制导翻译概述
从左到右扫描后缀式,每碰到运算对象就推进栈; 碰到运算符就从栈顶弹出相应目数的运算对象施加 运算,并把结果推进栈。最后的结果留在栈顶。
例:表达式-b+c*d的后缀式 b@cd*+的计值过程
d
c
t2
t1
bt1
t1
t1= - b
t2= c*d t3= t1+t2
❖ 逆波兰表示法的扩充 逆波兰表示法很容易扩充到表达式以外的范围 例如:
从叶结点到根结点进行计算。
继承属性
继承属性值是由此结点的父结点和/或 兄弟结点的某些属性值来决定的。
例 变量说明的类型定义 int a,b,c
表6.2 带有继承属性L.in的语法制导定义
产生式
语义规则
DTL T int T real L L1,id
in) L id
Lin:=T type T type :=integer T type :=real L1 in :=L in addtype(id entry,L
(1)能方便地翻译成目标机器指令。 (2)不必直接计算转移地址。 (3)可以使用各种数据表示法。
6.2 语法制导翻译的概述(如何把源
程序翻译成相应的中间代码)
➢ 基本思想: 在语法分析过程中,随着分析的步步进展,每当 使用一条产生式进行推导(对于自上而下分析) 或归约(对于自下而上分析),就执行该产生式 所对应的语义动作,完成相应的翻译工作。 语法制导翻译就是把语言的一些属性附加到代表 语言结构的文法符号上,这些属性值是由附加到 文法产生式的“语义规则”中计算的,也就是为 每个产生式配备翻译子程序,即语义子程序。
❖ 属性加工加工的过程即是语义处理的过 程,对于文法的每一个产生式都配备了一组 属性的计算规则,则称为语义规则。

第6章 属性文法和语法制导翻译

第6章 属性文法和语法制导翻译
D
T T.type=real real L L.in=real L.in=real , L L.in=real , L id1 id2
产生式 D→TL T→int T→real 语义规则 L.in:=T.type T.type:=integer T.type:=real addtype(id.entry,L.in) addtype(id.entry,L.in)
产生式 N→S1.S S→S1B S→B B→0 B→1 语义规则 {N.v=S1.v+S.v*2-S.L} {S.v=S1.v*2+B.v,S.L=S1.L+1 } {S.v=B.v,S.L=1} {B.v=0} {B.v=1}
S
S B
.
S
S
B
B
1
1
B
0
1
23
1 属性文法
举例3:文法G(N):N→S.S S→SB S→B 1. 方案1:计算综合属性S.L N→S1.S N {N.v=S1.v+S.v*2-S.L} S→S1B S2 . {S.v=S1.v*2+B.v, S.L=S1.L+1} S1 B S→B {S.v=B.v, S.L=1} B 1 B→0{B.v=0} B→1{B.v=1} 1 B→0 B→1
产生式 N→S1.S S→S1B S→B B→0 B→1 语义规则 {N.v=S1.v+S.v,S1.f=1,S.f=2-S.L} {S.L=S1.L+1,S1.f=S.f*2,B.f=S.f,S.v=S1.v+B.v} {S.L=1,B.f=S.f,S.v=B.v} {B.v=0} {B.v=B.f}
第6 章 属性文法和语法制导翻译
语义分析 静态语义分析 类型检查、控制流检查、一致性检查 名字的作用域分析 动态语义分析 栈溢出 数组越界

Chapt6_第6章语法制导翻译技术详解

Chapt6_第6章语法制导翻译技术详解
Y
INPUTSYM=下 一 个 符 号
INPUTSYM='i'
Y OUT("i")
N error
E
N
INPUTSYM=')'
Y
INPUTSYM=下 一 个 符 号
INPUTSYM=下 一 个 符 号
error
F→(E)|i@i
出口
处理F的递归下降翻译程序流程图
6.3 自顶向下语法制导翻译
自顶向下的语法制导翻译有递归下降翻译和 LL(1)翻译。
第6章 语法制导翻译技术
语义往往是上下文有关的,只宜于用口语描述,语 义形式化很困难。目前,比较流行的语义描述和语义 处理方法是语法制导翻译技术。 语法制导翻译技术
基础:形式描述的属性翻译文法 特点:把语法与语义分开,但又在语法分析的同 时进行相应的语义工作 提高了实用性
6.1 翻译文法
例: 设计一个翻译器,它能将中缀表达式翻译成波兰后 缀表达式。
E→E+T@+
E→T
T→T*F@* 解 : 去 掉 文 法
T→F
中的左递归,
F→(E)
修改后文法为:
F→i@i
E→T{+T@+}
注:@为输出 T→F{*F@*} 其后的符号串。
F→(E)|i@i
处理E的递归下降翻译程序流程图
T→F{*F@*} 处理T的递归下降翻译程序流程图
F
N
INPUTSYM='('
6.3 自顶向下语法制导翻译
假如翻译器的分析栈的栈顶符号为A,且当前输入符号为 a,那么将发生的动作是弹出A,@zD@yc@xB@wa@v入栈。 由于此时栈顶为动作符号@v,因此@v出栈,并执行由该动作 符号所规定的操作,对于该符号串翻译文法就是要输出v,即 out(v)。紧接着,a出栈,读下一个符号c。然后,动作符号 @w为栈顶,因此@w出栈,并执行由该动作符号所规定的操 作,对于该符号串翻译文法就是要输出w,即out(w)。

语法制导翻译

语法制导翻译

语法制导翻译
语法制导翻译是一种将源语言(通常为自然语言)的语法结构与目标语言的语法结构相对应的翻译方法。

它通过语法分析器和语法制导翻译器来实现。

在语法制导翻译中,源语言和目标语言的语法规则被定义成一个或多个上下文无关文法。

语法制导翻译的主要思想是在语法分析树中嵌入翻译动作,并通过语法制导翻译器将源语言转换为目标语言。

语法制导翻译器的主要任务是对每个语法分析树节点进行翻译动作的定义,并将这些翻译动作与语法分析器的分析过程相结合,最终生成目标语言的语法结构。

语法制导翻译是机器翻译领域的一种重要研究方向,它可以有效地解决自然语言翻译中的语言差异和歧义问题。

同时,它也是编译原理、计算机语言学等领域中的基础性问题。

第6章 属性文法及语法制导翻译 (编译原理 陈火旺)讲诉

第6章  属性文法及语法制导翻译 (编译原理 陈火旺)讲诉
7

(1) 终结符只有综合属性,它由词法分析器提供

属性文法的说明(1)
P136
例如 digit.lexval 表示单词符号“数”的词法值 id.entry 表示单词符号“标识符”的符号表入口


(2) 非终结符既可以有综合属性也可以有继承 属性,在属性文法的语义规则中计算 (3) 关于属性计算的规定
A
A X1X2…Xn b:=f(c1,c2,…,ck)
A.b
带注释的 语法树
14
X1 X2 … Xn
X1.c1 X2 .c2 … Xn . ck
两种属性:继承属性
• 继承属性用于“自上而下”传递信息。 • 继承属性:在语法树中,一个结点的继承属 性由此结点的父结点和(或)兄结点的某些属 性确定。 • 可以用继承属性来表示程序语言结构中的上 下文依赖关系。 • 继承属性的计算可以结合自上而下的语法分 析进行。 A. c
A X1 … X … Xn
A X1X2…Xn b:=f(c1,c2,…,ck)
k
X1.c1 … X.b
… Xn
17
6.2 基于属性文法的处理方法 • 属性文法: 产生式 语义规则 .
A α b:=f(c1,c2,…,ck) • 语义规则的计算可以执行任何翻译动作。对输入串 的翻译也就是根据语义规则进行计算得出结果。 • 属性文法是比较抽象的翻译说明,隐藏了一些实现 细节, 主要是无须指明翻译时语义规则的计算次序。 • 本节讨论语义规则的计算方法,指明属性文法中语 义规则的计算次序,从而把语义规则改造为计算属 性的语义程序,把静态的语义规则改写为可动态执 行的语义动作 --- 语法制导翻译方法。
4
6.1 属性文法
• 属性文法, 也称属性翻译文法或语法制导定义, 是Knuth在1968年首先提出来的。 • 属性:在上下文无关文法的基础上为每个文法 符号X(终结符或非终结符)配备若干个相关的 “值”---这些“值”就称为文法符号X的属性。 • 属性值的设置和语法结构的语义以及翻译程序 的需要有关。 • 属性代表与文法符号相关语义信息,如类型、 值、代码序列、符号表内容等
  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 )
相关文档
最新文档