编译原理6-4.1-L属性文法-翻译模式

合集下载

编译原理作业集-第六章-修订

编译原理作业集-第六章-修订

第六章属性文法和语法制导翻译本章要点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. 出现在产生式________和出现在产生式________不由所给的产生式的属性计算规则进行计算,而是由其他产生式的属性规则计算或者由属性计算器的参数提供。

L-属性文法和自顶向下翻译(1)

L-属性文法和自顶向下翻译(1)
T→num {print(num.val)}
8
翻译模式示例:把带加号和减号的中缀表
达式翻译成相应的后缀表达式
E→TR
R→addop T {print(addop.lexeme)} R1 | T→num {print(num.val)}
E
例:9-5+2
T
R
9 {print(‘9’)} -
T {print(‘-’)} R
15
产生式 语义规则
S→B
B.ps :=10
翻译模式
B→B1B2
S.ht :=B.ht B1.ps :=B.ps
B2.ps :=B.ps
S → {B.ps:=10} B {S.ht:=B.ht}
B.ht := max(B1.ht, B2.ht)
B→B1 sub B2 B1.ps :=B.ps B2.ps :=shrink(B.ps)
编译原理
第六章 属性文法和语法制导翻译
1
第六章 属性文法和语法制导翻译
属性文法 基于属性文法的处理方法 S-属性文法的自下而上计算 L-属性文法和自顶向下翻译
2
第六章 属性文法和语法制导翻译
属性文法 基于属性文法的处理方法 S-属性文法的自下而上计算 L-属性文法和自顶向下翻译
3
3. 产生式左边非终结符的综合属性只有在它所引用 的所有属性都计算出来以后才能计算。计算这种 属性的动作通常可放在产生式右端的末尾
S → A1A2 A→a
{A1.in:=1; A2.in:=2} {print(A.in)}
12
排版软件 TeX、LaTeX
The quadratic formula is b b2 4ac 2a

编译原理第六章:属性文法和语法制导翻译

编译原理第六章:属性文法和语法制导翻译
生综性仅合式依属A→赖性x于,1x:2或,…者x是n,xj其(1≤每j≤个n)语的义一规个则继中承的属每性个且属这性个或继者承是属
(1)产生式xj的左边符号x1,x2,…xj-1的属性; (2)A的继承属性 L-属性文法最大特点是产生式右部符号的继承属性不依赖于
其右部符号的任何属性。
注:S-属性文法一定是L-属性文法 • S-属性文法适合于一遍扫描的自下而上分析 • L-属性文法可用于一遍扫描的自上而下分析
3.翻译模式:给出了使用语义规则进行计算的次序,这样可 把某些实现细节表现出来,在翻译模式中,和文法符号 相关属性和语义规则(语义动作),用花括号{ }括起来, 插入到产生式右部的合适位置上。
复习题
名词术语: 属性文法、继承属性、综合属性 语法制导翻译、抽象语法树、翻译模式 S-属性文法、L-属性文法
第六章 属性文法和语法制导翻译
6.1 属性文法 6.2 基于属性文法的处理方法 6.3 S-属性文法的自下而上计算 6.4 L-属性文法和自顶向下翻译 6.5 自下而上计算继承属性
6.1 属性文法(属性翻译文法)
一.属性文法 1.属性文法定义
(上下文无关文法+属性/属性符号定义+属性规则定义) 即: 在上下文无关文法的基础上,为每个文法符号(终结 符或非终结符)配备若干相关的值(称为属性)。
表 6.2(P139) 带继承属性 L.in 的属性文法
产生式
语义规则
D→TL
L.in:=T.type
T→int
T.type:=integer
T→real
T.type:=real
L→L1,id
L1.in:=L.in
addtype(id.type,L.in)

《编译原理》重点知识总结

《编译原理》重点知识总结

《编译原理》知识点总结目录第一章引论第二章高级语言及其语法描述第三章语法分析——自上而下分析第四章属性文法和语法制导翻译第五章语义分析和中间代码产生第六章优化第一章引论一.编译程序(compiler):把某一种高级语言程序等价地转换成另一种低级语言程序(如汇编语言或机器语言程序)的程序二.编译程序的工作的五个阶段:词法分析、语法分析、中间代码产生、优化、目标代码产生1.词法分析任务: 输入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个单词符号。

依循的原则:构词规则描述工具:有限自动机FOR I := 1 TO 100 DO保留字标识符等符整常数保留字整常数保留字2.语法分析任务:在词法分析的基础上,根据语言的语法规则把单词符号串分解成各类语法单位。

依循的原则:语法规则述工具:上下文无关文法3.语义分析与中间代码产生任务:对各类不同语法范畴按语言的语义进行初步翻译。

(变量是否定义、类型是否正确等)依循的原则:语义规则中间代码:三元式,四元式,逆波兰记号,树形结构等。

是一种独立于具体硬件的记号系统。

例:将Z:=X + 0.618 * Y 翻译成四元式为(1) * 0.618 Y T1(2) + X T1 T2(3) := T2 _ Z4. 优化任务:对于前阶段产生的中间代码进行加工变换,以期在最后阶段产生更高效的目标代码。

依循的原则:程序的等价变换规则FOR K:=1 TO 100 DOBEGINM := I + 10 * K;N := J + 10 * K;END4.目标代码产生任务: 把中间代码变换成特定机器上的目标代码。

依赖于硬件系统结构和机器指令的含义目标代码三种形式:a)绝对指令代码: 可直接运行b)可重新定位指令代码: 需要连接装配c)汇编指令代码: 需要进行汇编第二章高级语言及其语法描述2.1.1语法词法规则:单词符号的形成规则。

a)单词符号是语言中具有独立意义的最基本结构。

语法制导翻译及属性文法-编译原理-06-(一)讲诉

语法制导翻译及属性文法-编译原理-06-(一)讲诉

5. S-属性定义(S-属性文法)
S-属性定义:仅包含综合属性的属性
文法(语法制导定义)
S-attributed S-attributed
Definition Grammar
如:算术表达式求值的属性文法
2018/11/19 25
非S-属性定义
D→T L
T→int
L.in := T.type
要解决的问题: 1. 纪录标识符的类型 2. 类型信息传递 方法:用T.type记录类 型信息,并传给L.in
14
例6-2 说明语句的属性文法
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 )
2018/11/19
F.val := E.val
F.val := digit.lexval lexval 是单词 digit 的属性
13
例6-2 说明语句的属性文法
说明语句的文法
D→TL T → int T → real L → L1,id L → id
2018/11/19
real operand, length, sum int add, sub, mult
是一种接近形式化的语义描述方法 长于描述静态语义、短于描述动态语义 每个语法符号有相应的属性符号 每个产生式有相应计算属性的规则
属性变量:=属性表达式
2018/11/19 8
属性文法举例
产生式 E → E1 + E2 属性(计算)规则/语义规则 E.val := E1.val + E2.val

编译原理compiler6语义分析

编译原理compiler6语义分析

◆语法制导定义是对上下文无关文法的推广
◆属性
综合属性 继承属性
◆依赖图 语义规则建立了属性之间的依赖关系,这
些关系可以用图来表示,这样的图称为依赖图。
4
6.1.1 语法制导定义的形式
在一个语法制导定义中,A→P都有与之相关
联的一套语义规则,规则形式为
b:= f(c1,c2,…,ck),
f是一个函数,而且
终极符则只能有综合属性,而不能有继承属性。
非终结符既可有综合属性也可有继承属性
1
图6.1 ห้องสมุดไป่ตู้法制导翻译的概观

输 入


义 规




号 串


的 计

一般来说,语义翻译可按图6.1 的流程处理。 实际上,编译中语义翻译的实现并不是按图6.1 的流 程处理的;而是随语法分析的进展,识别出一个语法 结构,就对它的语义进行分析和翻译。
19
6.2.2 建立表达式的语法树
建立表达式的语法树使用的函数
1. mknode(op,left,right) 建立一个运算符号结点,标 号是op,两个域left和right指向运算分量结点的指针。
2.mkleaf(id,entry) 建立一个标识符结点,由标号id标 识,一个域entry指向标识符符号表中相应的项。
val[ntop]:=val[top-2]*val[top]
val[ntop]:=val[top-1]
29
表6.5 输入串3*5+4n的语义分析过程
输入 state val
3*5+4n -
-
*5+4n 3
3

编译原理第六章属性文法和语法制导翻译

编译原理第六章属性文法和语法制导翻译

第六章 属性文法和语法制导翻译要紧内容:[1] 法制导翻译的大体思想; [2] 属性文法的大体概念; [3] 基于属性文法的处置方式;[4] 在自上而下分析和自下而上分析中的属性计算。

大体要求:[1] 明白得语法制导翻译和属性文法的大体思想和方式, [2] 把握属性的计算方式。

教学要点:本章中,咱们将第一介绍属性文法的大体概念,然后介绍基于属性文法的处置方式,讨论如安在自上而下分析和自下而上分析中实现属性的计算。

讲义摘要:6.1 属性文法一、语义分析的任务一、静态语义分析或静态审查。

例如,类型检查、操纵流检查(操纵流语句必需使操纵转移到合法的地址 )、维数检查、越界检查、名字的作用域分析 等。

二、动态语义处置。

若是静态语义正确,语义处置那么要执行真正的翻译。

例如,变量的存储分派;表达式的求值;语句的翻译(中间代码的生成)。

3、总目标:生成等价的中间代码二、属性文法 一、属性所谓属性,其涉及的概念比较普遍,经常使用以描述事物或人的特点、性质,品质等等。

比如,谈到一个 物体,能够用“颜色”描述它,谈起某人,能够利用“有幽默感“来形容他。

对编译程序利用的语法树的结点,能够用"类型"、"值"或"存储位置"来描述它。

二、属性文法(也称属性翻译文法)属性文法是Knuth 在1968年第一提出的。

它是在上下文无关文法的基础上,为每一个文法符号(终结符或非终结符)配备假设干相关的“值”(称为属性)。

这些属性代表与文法符号相关信息,例如它的类型、值、代码序列、符号表内容等等。

属性与变量一样,能够进行计算和传递。

属性加工的进程即是语义处置的进程。

关于文法的每一个产生式都配备了一组属性的计算规那么,称为语义规那么。

语义规那么所描述的工作能够包括属性计算、静态语义检查、符号表操作、代码生成等等。

3、属性文法的形式化概念形式上讲,一个属性文法是一个三元组:A=(G,V,F),其中 G:是一个上下文无关文法。

Part6编译原理-属性文法和语法制导翻译(天津大学)

Part6编译原理-属性文法和语法制导翻译(天津大学)
D T type 4 real 7 in 5 in L y 6
L y 8
,
id3 entry 3
9 in
L y 10
,
id2 entry 2
id1 entry 1
计算语义规则的方法
分析树法:
在编译时,这种方法从分析树所构成的依赖图的拓扑排序中得 到语义规则的计算顺序。
如果分析树的依赖图中有环路,这种方法将失败
抽象语法树的例子
产生式 E→E1 + T
语义规则 E.nptr := mknode(‘+’ , E1.nptr, T.nptr)
E→E1 – T
E→T T→(E) T→id T→num
E.nptr := mknode(‘-’ , E1.nptr, T.nptr)
综合属性值:通过分析树中其子节点的属性值计算出来的 继承属性值:由该节点的兄弟节点及父节点的属性值计算出来 的
依赖图
语义规则建立了属性间的依赖关系,这种关系用图来表示就是 依赖图 依赖图表示了语义规则的计算顺序
注释分析数
每个节点都有属性值的分析树叫做注释分析树 计算节点属性的过程称为注释或者装饰分析树
如果语法树有n个结点(因此最多有O(n)个属性),最 坏的情况整个遍历需要O(n2)时间。
树遍历的举例
产生式 语义规则
S→XYZ
Z.h := S.a
X.c := Z.g S.b := X.d – 2 Y.e := S.b
S a=0 X x Y y
初始状态
S a=0 Z z X x Y y
第一遍扫描
S-属性文法
S-属性文法
在语法树中,一个结点的综合属性的值由其子结点的 属性值决定。 仅使用综合属性的属性文法称为S-属性定义 S属性定义的分析树的分析方法——自底向上的在每个 节点用语义规则来计算综合属性值。

编译原理 语法制导翻译

编译原理 语法制导翻译
搜索方法:hash技术…
TinyC中的语法树
typedef enum {StmtK,ExpK} NodeKind; typedef enum {IfK,RepeatK,AssignK,ReadK,WriteK} StmtKind; typedef enum {OpK,ConstK,IdK} ExpKind; typedef enum {Void,Integer,Boolean} ExpType; #define MAXCHILDREN 3 typedef struct treeNode { struct treeNode * child[MAXCHILDREN]; struct treeNode * sibling; int lineno; NodeKind nodekind; union { StmtKind stmt; ExpKind exp;} kind; union { TokenType op; int val; char * name; } attr; ExpType type; /* for type checking of exps */ } TreeNode;
作为中间表示形式——分离分析与翻译
在进行语法分析的同时进行翻译存在缺
陷:
适合分析的文法可能未反映自然的语言结构 分析顺序可能与翻译顺序不一致
利用语法制导翻译方法来构造语法树
5.2.1 语法树
(抽象)语法树,压缩形式
关键字和运算符均在内部节点
链式结构会被压缩
语法树压缩例
digit.lexval:终结符只有综合属性,由词法分 析器提供 开始符号通常没有继承属性
5.1.2 综合属性
只有综合属性:S-属性定义
语法树自底向上计算属性

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

第六章_属性文法和语法制导翻译
如果一属性文法不存在属性之间的循环依 赖关系,那么称该文法为良定义的
6.2.1 依赖图
属性的计算次序
一个依赖图的任何拓扑排序都给出一个语法树中
结点的语义规则计算的有效顺序
属性文法说明的翻译是很精确的
基础文法用于建立输入符号串的语法分析树 根据计算语义规则建立依赖图
从依赖图的拓扑排序中,我们可以得到计算语义
addtype(id.type, L.in)
句子real id1,id2,id3的带注释的语法树
D
T T.type=real real L.in=real L L.in=real L , id3
L.in=real , L
id1
id2
6.2 基于属性文法的处理方法
输入串 语法树 依赖图 语义规则计算次序
X→x Y→y Z→z
假设S.a的初始值为0,输入串为xyz
S:a=0 b=0 S:a=0, X X:c=1 d=2
x
Y:e=0 Y f=0
Z:h=0 Z g=1
y
z
6.2.3 一遍扫描的处理方法
一遍扫描的处理方法是在语法分析的同时 计算属性值
所采用的语法分析方法
属性的计算次序
L-属性文法适合于一遍扫描的自上而下分 析 S-属性文法适合于一遍扫描的自下而上分 析
语法制导翻译即基于属性文法的处理过程通 常是这样的:对单词符号串进行语法分析, 构造语法分析树,然后根据需要遍历语法树 并在语法树的各结点处按语义规则进行计算。 由源程序的语法结构所驱动的处理办法就是 语法制导翻译法 语义规则的计算可能产生代码、在符号表中 存放信息、给出错误信息或执行其他动作。 对输入符号串的翻译就是根据语义规则进行 计算的结果。

编译原理-属性文法和语法制导翻译

编译原理-属性文法和语法制导翻译

编译原理-属性⽂法和语法制导翻译1.属性⽂法:在上下⽂⽆关⽂法的基础上,为每个⽂法符号引进⼀组属性,且让该⽂法中的重写规则附加上语义规则时,称该上下⽂⽆关⽂法为属性⽂法。

(属性⽂法往往以语法制导定义和翻译模式两种形式出现。

具体说明问度娘)注意:(1)属性与变量⼀样,可以进⾏计算和传递。

(2)属性加⼯的过程即是语义处理的过程。

(3)属性分为综合属性(⽤于“⾃下⽽上”传递信息)和继承属性(⽤于“⾃上⽽下”传递信息)。

(1. 语义规则的形式:产⽣式A—>α的语义规则的形式为b:=f(c1,c2,…,ck)。

就是属性b依赖于属性c1,c2,…,ck。

其中:f是⼀个函数;b—A的综合属性,且c1,c2,…,ck是α中⽂法符号的属性;b—α中某个⽂法符号的继承属性, 且c1,c2,…,ck是A或α中任何⽂法符号的属性.(2.VT—VN的属性(1) VT — 只有综合属性,由词法分析器提供.(2) VN — 既可有综合属性也可有继承属性; 开始符号S的所有继承属性作为属性计算前的初始值.(3.属性的计算/获得(1)由该产⽣式提供的计算规则计算获得:产⽣式右边的继承属性,产⽣式左边的综合属性。

(2)由其它产⽣式的属性规则计算或由属性计算器的参数提供:产⽣式左边的继承属性,产⽣式右边的综合属性2.综合属性:通常使⽤⾃底向上的⽅法(由⼦确⽗),S—属性⽂法:仅使⽤综合属性的属性⽂法.3.继承属性:⽤继承属性来表⽰程序设计语⾔结构中的上下⽂依赖关系很⽅便.(由⽗兄却该结点继承属性)4.基于属性⽂法的处理⽅法:(1.依赖图:继承属性和综合属性之间的相互依赖关系的有向图。

构造过程:为每个包含过程调⽤的语义引⼊⼀个虚综合属性b,改写为b=f(c1,c2,…,ck)的形式-->为每个属性设置⼀个结点--->若属性b依赖于属性c,则从属性c的结点有⼀条有向边连到属性b的结点。

(2. 属性的计算次序:(1)良定义的:若⼀个属性⽂法不存在属性之间的循环依赖关系,则称该⽂法为良定义的。

编译原理(4)语义_1(属性文法和语法制导翻译)

编译原理(4)语义_1(属性文法和语法制导翻译)
lexval是词法分析送来的整型内部值
表达式左侧的非终结符语义值来自于右侧语义的计算, 因此称为综合属性
4.2 属性文法(继承属性)
再举一例说明属性文法。一简单变量类型说明的文法G[D]如 下: G[D]: D→int L | float L
L→L, id | id
其对应的属性文法为 产生式
(1) D→TL (2) T→int (3) T→float (4) L→L(1),id
s3
# (1)
E7 →E(1) + E(2)
_
_
val[TOP]= val[+T9O*P5]#+val[TOPr+42]
#E
_7
+9*5#
s4
(2) E→E(1)*E(2)
val[TOP]=val[TOP]* val[TOP+2]
# E+
_7_
9*5#
s3
(3#) EE+→9(E(1)) _7_ _val[TOP]=val[TOP*+51#]
<布尔表达式e的逆波兰式><顺序号>BF 分别表示当e为真或假时转移到顺序号处。其中,布尔表达式 e的逆波兰式和顺序号是两个特殊的运算分量。
实例:条件语句的逆波兰表示
例如,条件语句if(m<n) k=i+1;else k=i−1的逆波兰式表示为 ((1)~(18)为单词编号)
(1) mn< (4) 13BF (6) ki1+= (11) 18BR (13) ki1−= (18) {if语句的后继语句}
4.3 几种常见的中间语言 (1) 赋值语句 “<左部> = <表达式>” 的逆波兰表示为

编译原理自顶向下翻译递归下降翻译(与“属性”有关文档共17张)

编译原理自顶向下翻译递归下降翻译(与“属性”有关文档共17张)
译模式。这样,许多属性文法可以使用自顶向 下分析来实现。
第2页,共17页。
算术表达式的左递归文法相应的翻译模式
E →E1+T E →E1-T E →T T →(E) T →num
{E. val := E1. val + T. val } {E. val := E1. val - T. val } {E. val := T. val } {T. val := E. val } {T. val := num. val }
第9页,共17页。删Fra bibliotek左递归后:引入非终结符R
E T { R.i := T.nptr }
R
{ E.nptr := R.s }
R +
T { R1.i := mknode(‘+’, R.i, T.nptr) }
R1
{ R.s := R1.s }
R -
T
{ R1.i := mknode(‘-’, R.i, T.nptr) }
{R.s := R.i }
{T.val := E. val } {T. val := num. val}
图6.14 消除左递归后的翻译模式
第4页,共17页。
对于自顶向下分析,我们假定动作是在处于相同位置上 的符号被展开(匹配成功)时执行的。
E
T.val=9
R.i=9
num.val=9
- T.val=5
A.a := g(g(f( X.x), Y1.y), Y2.y)
i := g(f(X.
Y1
R
{R.
R.i := g(f(X.x),Y .y) i R s
1
A.a := g(f( X.x), Y .y) Y 对每个非终结符A构造一个函数过程,1对A的每个继承属2性设置一个形式参数,函数的返回值为A的综合属性(作为记录,或指向记录的
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

L-属性文法
一个属性文法称为 L-属性文法 属性文法 如果对于每个产生式 A→X1X2…Xn, → 其每个语义规则中的每个属性或者是综合属性, 其每个语义规则中的每个属性或者是综合属性, 综合属性 或者是X 的一个继承属性 或者是 j(1<=j<= n)的一个继承属性 , 且这个继承属 的一个 性仅依赖于: 性仅依赖于: (1) 产生式 j的左边符号 1,X2,…,Xj-l的属性 产生式X 左边符号X , (2) A的继承属性 的继承属性 S-属性文法一定是 属性文法 属性文法一定是L-属性文法 属性文法一定是
2
R T print(‘+’) R
5
print(5)
print(2)
ε
4 把语义动作看作是终结符号 按深度优先次序遍历分析树,即得到 9 5 - 2 + 按深度优先次序遍历分析树,
图6.10 9-5+2 的说明动作的语法分析树 参考输出后缀式的属性文法☆ 参考输出后缀式的属性文法☆
只需要综合属性时 可以这样建立翻译模式: 只需要综合属性时, 可以这样建立翻译模式 为每一个语义规则建立一个包含赋值的动作 为每一个语义规则建立一个包含赋值的动作, 右边的末尾。 并把这个动作放在相应的产生式右边的末尾。 并把这个动作放在相应的产生式右边的末尾 例如,假设有下面的产生式和语义规则: 例如,假设有下面的产生式和语义规则: T →T1* F 建立翻译模式: 建立翻译模式: T →T1* F {T. val := T1. val * F. val} } T. val := T1.val * F. val
下面的翻译模式不满足上述三个条件中的第一个条件: 下面的翻译模式不满足上述三个条件中的第一个条件 不满足上述三个条件中的第一个条件 (1)产生式右边的符号的继承属性必须在这个符号以前 产生式右边的符号的继承属性必须在这个符号以前 产生式右边的符号的继承属性必须在这个符号 的动作中计算出来 中计算出来。 的动作中计算出来。 S→A1 A2 { A1. in:=1; A2. in:=2 } A→a { print(A. in) }
E
1
.val
图6.11 盒子的语法制导安放
表6.8 盒子大小和高度的属性文法 产 生 式 S→B B → B1 B2 继承属性ps影响 继承属性 影响 语 义 规 则 公式的高度 B.ps := 10; 综合属性B.ht代表 综合属性 代表 S.ht := B.ht B的高度 的高度 B1.ps := B.ps; B2.ps := B.ps; B.ht := max(B1.ht, B2.ht ) .ps减少 减少30% 使B2.ps减少30% B1.ps:=B.ps; B2.ps:= shrink(B.ps); 把盒子B 把盒子 2向下放置 B.ht := disp (B1.ht, B2.ht ) 查表获得 B.ht := text.h × B.ps
(a, a) 2 4
S.in=0 S S.out=5 1L4 ) {S. out := L. out + 1 }
{L. in := S. in + 1} (
{L1. in := L. in } 1 L 2 , {S. in := L1. out + 1 } 3 S 4 {L. out := S. out } {S. in := L. in } 1 S 2 {L. out := S. out } {S. out := S. in + 1; print (S. out) }
S → {B.ps := 10 } B {S.ht := B.ht } B → {B1.ps := B.ps } B1 {B2.ps := B.ps } B2 {B.ht := max(B1.ht, B2.ht ) } B → { B1.ps :=B.ps } B1 sub { B2.ps := shrink(B.ps) } B2 {B.ht := disp (B1.ht, B2.ht ) } B → text {B.ht := text.h × B.ps }
如果既有综合属性又有继承属性, 如果既有综合属性又有继承属性,在建立翻译模式时 综合属性又有继承属性 就必须满足三个条件 (1)产生式右边的符号的继承属性必须在这个符号以前 产生式右边的符号的继承属性必须在这个符号以前 产生式右边的符号的继承属性必须在这个符号 的动作中计算出来 中计算出来。 的动作中计算出来。 (2)一个动作不能引用这个动作右边的符号的综合属性。 一个动作不能引用这个动作右边的符号的综合属性。 一个动作不能引用这个动作右边的符号的综合属性 (3)产生式左边非终结符的综合属性只有在它所引用的 产生式左边非终结符 产生式左边非终结符的综合属性只有在它所引用的 所有属性都计算出来以后才能计算。 所有属性都计算出来以后才能计算。计算这种属性 的动作通常可放在产生式右端的末尾 右端的末尾。 的动作通常可放在产生式右端的末尾。
A→QR →
依赖于右部符号R的综合属性 的综合属性R.s 因为 Q.i 依赖于右部符号 的综合属性
6.4.1 翻译摸式
翻译模式( 翻译模式(Translation schemes) ) 一种适合语法制导翻译的另一种描述形式。 一种适合语法制导翻译的另一种描述形式。 在翻译模式中, 在翻译模式中,和文法符号相关的属性和语义 规则(语义动作),用花括号{}括起来, ),用花括号{}括起来 规则(语义动作),用花括号{}括起来,插 入到产生式右部的合适位置上 的合适位置上。 入到产生式右部的合适位置上。
a {S. out := S. in + 1;
print (S. out) }
a
思考: 属性 S′ → {S. in := 0 } S S → {L. in := S. in + 1 } ( L ) {S. out := L. out + 1 } in和out的 和 的 S → a {S. out := S. in + 1; print (S. out) } 含义是什么? 含义是什么 L → {L1. in := L. in } L1 , {S. in := L1. out + 1 } S {L. out := S. out } L → {S. in := L. in } S {L. out := S. out }
L-属性文法
L-属性文法可通过一次遍历就计算出所有属性值。 属性文法可通过一次遍历就计算出所有属性值。 属性文法可通过一次遍历就计算出所有属性值 诸如LL(1)这种自上而下分析方法的分析过程,从概 这种自上而下分析方法的分析过程, 诸如 这种自上而下分析方法的分析过程 念上说可以看成是深度优先 深度优先建立语法树的过程 念上说可以看成是深度优先建立语法树的过程 我们可以在自上而下语法分析的同时实现L-属性文 自上而下语法分析的同时实现 我们可以在自上而下语法分析的同时实现 属性文 法的计算。 法的计算。
第六章 属性文法和语法制导翻译
6.1 6.2 6.3 6.4 6.5 属性文法 基于属性文法的处理方法 S-属性文法的自下而上计算 属性文法的自下而上计算 L-属性文法和自顶向下翻译 属性文法和自顶向下翻译 自下而上计算继承属性
L6.4 L-属性文法和自顶向下翻译
6.4.1 翻译模式 6.4.2 自顶向下翻译 6.4.3 递归下降翻译器的设计
S A a print(A.in) 1 a A {A1. in:=1; A2. in:=2} = } 3 print(A.in) 2
该属性还没有定义
可以改为
S→ {A1. in:=1} A1 { A2. in:=2 } A2 =
S→ {A1. in:=1} A1 { A2. in:=2 } A2 =
S′ → {S. depth := 0 } S ′ S → {L. depth := S. depth + 1 } ( L ) S → a { print (S. depth) } L → {L1. depth := L. depth } L1 , {S. depth := L. depth } S L → {S. depth := L. depth } S ( a , ( a , a) ) 1 2 2
S 0 ( L1 ) S 1 ( L2 ) S2 a
L1 , S 1 a
L2 , S2 a
补充例2 补充例2 为文法 G: S → ( L ) | a L→L,S|S 写一个翻译方案,打印出每个a在句子中是第几个字符 写一个翻译方案,打印出每个 在句子中是第几个字符 例如,当句子是 ( a , ( a , ( a , a ) , (a) ) )时, 例如, 时 8 10 14 打印的结果是 2 5
B → B1 sub B2
B → text
非终结符B(表示盒子 代表一个公式 非终结符 表示盒子)代表一个公式, 表示盒子 代表一个公式, 产生式B→ 代表两个盒子并置, 产生式 →BB 代表两个盒子并置, B→B1 sub B2 代表B2的大小比B1的小,并且放在下角标的位置 → 代表 的大小比 的小 并且放在下角标的位置
S
{A1. in:=1} = 1 a
A
{A2. in:=2} 3 print(A.in) a 2
A print(A.in) 4
例: 给定一个L-属性文法, 建立一个满足上述 给定一个L 属性文法,
三个条件的翻译模式。 三个条件的翻译模式。
基于数学格式语言EQN 基于数学格式语言 E sub 1 .Val 给定输人 EQN把E,1和.val分别按不同的大小放在相关 把 , 和 分别按不同的大小放在相关 的位置上,如图所示。 的位置上,如图所示。
S′ → {S. depth := 0 } S ′ S → {L. depth := S. depth + 1 } ( L ) S → a { print (S. depth) } L → {L1. depth := L. depth } L1 , {S. depth := L. depth } S L → {S. depth := L. depth } S
相关文档
最新文档