1.24k likes | 1.36k Views
第四章 语法制导翻译. 语义分析的任务 在词法分析和语法分析的基础上,分析所写源程序的含义,在理解含义的基础上为生成相应的目标代码作好准备或直接生成目标代码。 语义检查、语义处理 (1)语义检查 例:类型、运算、维数、越界 (2)语义处理 例:变量的存储分配 例:表达式的求值 例:语句的翻译(中间代码的生成). 第四章 语法制导翻译. 本章内容 介绍一种形式化的语义描述方法: 语法制导翻译方法 及其两种具体形式: (1)语法制导定义(语义的抽象说明)
E N D
第四章 语法制导翻译 • 语义分析的任务 在词法分析和语法分析的基础上,分析所写源程序的含义,在理解含义的基础上为生成相应的目标代码作好准备或直接生成目标代码。 语义检查、语义处理 (1)语义检查 例:类型、运算、维数、越界 (2)语义处理 例:变量的存储分配 例:表达式的求值 例:语句的翻译(中间代码的生成)
第四章 语法制导翻译 • 本章内容 • 介绍一种形式化的语义描述方法: 语法制导翻译方法及其两种具体形式: (1)语法制导定义(语义的抽象说明) (2)翻译方案(语义规则的计算次序) • 介绍语法制导的翻译的实现方法。
属性 1、定义:代表与文法符号(Vt或Vn )相关的信息。属性可以为任何特性。 例如:变量的类型、层次,存储地址;表达式类型,值;程序的目标代码等。 2、属性值:与属性相关的信息,可以在语法分析过程中计算和传递。 3、属性的表示:X.属性值 产生式的左、右部有相同的符号时用下标或上标来区别。 例 E→E1+T {E.val:=E1.val+T.val}
属性 4、属性加工的过程即语义的处理过程 5、属性值分成不相交的两类: 综合属性(synthesized attribute)继承属性(inherited attribute)。在语法树中, 一个结点的综合属性值由子结点的属性值来计算; 一个结点的继承属性值是由该结点兄弟结点和/或父结点的属性值来计算。 注意: 终结符只有综合属性,由词法分析程序提供; 非终结符既有综合属性和继承属性。 每个文法符号的继承属性和综合属性之交集为空集。
语义规则 • 为文法的每一个规则配备的计算属性的计算规则,称为语义规则。 • 每个文法符号具有一组属性,文法的每一个产生式A→β都有与其相关的语义规则的集合,每条语义规则的形式为: b=f (c1, c2, …,ck) • 通常,语义规则中的函数f写成表达式的形式。有时,语法制导定义中的某些语义规则就是为了产生代码,这样的语义规则一般写成过程调用的形式。在这种情况下,可以把语义规则看成是定义相关非终结符的虚拟综合属性
属性文法 • 对某上下文无关文法,当为每个文法符号引进一组属性,且让文法中的产生式规则附加对属性进行处理的语义规则时,称该文法为属性文法。 • 根据不同属性文法于法成分的语义,可以设计对不同语法成分进行翻译的属性文法。 • 属性文法形式为: 文法规则(产生式) 语义规则 规则1 相关的属性等式 ... ... 规则n 相关的属性等式
4.1 语法制导的定义 例:简单算术表达式的语法制导定义 1.编制算术表达式的文法 2.引入属性表示语义信息 将值 val 作为表达式 E、项 T 和因子 F 的属性 3.用语义规则描述表达式的求值
4.1 语法制导的定义 • Val:表示非终结符的整数值,综合属性 • lexval 是单词 digit 的属性
4.1 语法制导的定义 4.1.1 语法制导定义的形式 • 基础文法 • 每个文法符号有一组属性 • 每个文法产生式A 有一组形式为b := f(c1, c2, …, ck )的语义规则,其中f是函数,b和c1, c2, …, ck是该产生式文法符号的属性 • 综合属性:如果b是A的属性,c1 , c2 , …, ck是产生式右部文法符号的属性或A的其它属性。 • 继承属性:如果b是产生式右部某个文法符号X的属性。
4.1 语法制导的定义 4.1.2 综合属性 1、S属性定义:仅仅使用综合属性的语法制导定义
4.1 语法制导的定义 2、注释分析树 例:8+5*2 的注释分析树 L E.val = 18 E.val = 8 T.val = 10 + F.val = 2 T.val = 5 * T.val = 8 digit.lexval = 2 F.val = 5 F.val = 8 digit.lexval = 8 digit.lexval = 5
L n E.val = 18 E.val = 8 T.val = 10 + F.val = 2 T.val = 5 * T.val = 8 digit.lexval = 2 F.val = 5 F.val = 8 digit.lexval = 8 digit.lexval = 5 4.1 语法制导的定义 分析树各结点属性的计算可以自下而上地完成
L n E.val = 18 E.val = 8 T.val = 10 + F.val = 2 T.val = 5 * T.val = 8 digit.lexval = 2 F.val = 5 F.val = 8 digit.lexval = 8 digit.lexval = 5 4.1 语法制导的定义 分析树各结点属性的计算可以自下而上地完成
L n E.val = 18 E.val = 8 T.val = 10 + F.val = 2 T.val = 5 * T.val = 8 digit.lexval = 2 F.val = 5 F.val = 8 digit.lexval = 8 digit.lexval = 5 4.1 语法制导的定义 分析树各结点属性的计算可以自下而上地完成
L n E.val = 18 E.val = 8 T.val = 10 + F.val = 2 T.val = 5 * T.val = 8 digit.lexval = 2 F.val = 5 F.val = 8 digit.lexval = 8 digit.lexval = 5 4.1 语法制导的定义 分析树各结点属性的计算可以自下而上地完成
L n E.val = 18 E.val = 8 T.val = 10 + F.val = 2 T.val = 5 * T.val = 8 digit.lexval = 2 F.val = 5 F.val = 8 digit.lexval = 8 digit.lexval = 5 4.1 语法制导的定义 分析树各结点属性的计算可以自下而上地完成
L n E.val = 18 E.val = 8 T.val = 10 + F.val = 2 T.val = 5 * T.val = 8 digit.lexval = 2 F.val = 5 F.val = 8 digit.lexval = 8 digit.lexval = 5 4.1 语法制导的定义 分析树各结点属性的计算可以自下而上地完成
L n E.val = 18 E.val = 8 T.val = 10 + F.val = 2 T.val = 5 * T.val = 8 digit.lexval = 2 F.val = 5 F.val = 8 digit.lexval = 8 digit.lexval = 5 4.1 语法制导的定义 分析树各结点属性的计算可以自下而上地完成
L n E.val = 18 E.val = 8 T.val = 10 + F.val = 2 T.val = 5 * T.val = 8 digit.lexval = 2 F.val = 5 F.val = 8 digit.lexval = 8 digit.lexval = 5 4.1 语法制导的定义 分析树各结点属性的计算可以自下而上地完成
L n E.val = 18 E.val = 8 T.val = 10 + F.val = 2 T.val = 5 * T.val = 8 digit.lexval = 2 F.val = 5 F.val = 8 digit.lexval = 8 digit.lexval = 5 4.1 语法制导的定义 分析树各结点属性的计算可以自下而上地完成
L n E.val = 18 E.val = 8 T.val = 10 + F.val = 2 T.val = 5 * T.val = 8 digit.lexval = 2 F.val = 5 F.val = 8 digit.lexval = 8 digit.lexval = 5 4.1 语法制导的定义 分析树各结点属性的计算可以自下而上地完成
L n E.val = 18 E.val = 8 T.val = 10 + F.val = 2 T.val = 5 * T.val = 8 digit.lexval = 2 F.val = 5 F.val = 8 digit.lexval = 8 digit.lexval = 5 4.1 语法制导的定义 分析树各结点属性的计算可以自下而上地完成
L n E.val = 18 E.val = 8 T.val = 10 + F.val = 2 T.val = 5 * T.val = 8 digit.lexval = 2 F.val = 5 F.val = 8 digit.lexval = 8 digit.lexval = 5 4.1 语法制导的定义 注释分析树:结点的属性值都标注出来的分析树
4.1 语法制导的定义 4.1.3继承属性 例. 考虑下面类似C语言中变量声明的简单文法: D→T L T→ int |float L→L , id|id
D L.in = integer T.type = integer , L.in = integer id3 int , L.in = integer id2 id1 4.1 语法制导的定义 int id1, id2, id3的注释分析树
D T L in 5 4 type 6 , int L id3 in 7 8 3 entry , L in 9 10 id2 2 entry id1 1 entry 4.1 语法制导的定义 4.1.4 属性依赖图 int id1, id2, id3的分析树的依赖图 D TLL.in := T.type
D T L in 5 4 type 6 , int L id3 in 7 8 3 entry , L in 9 10 id2 2 entry id1 1 entry 4.1 语法制导的定义 4.1.4 属性依赖图 int id1, id2, id3的分析树的依赖图 LL1,idL1.in := L.in; addtype (id.entry, L.in )
D T L in 5 4 type 6 , int L id3 in 7 8 3 entry , L in 9 10 id2 2 entry id1 1 entry 4.1 语法制导的定义 4.1.5 属性计算次序 拓扑排序:结点的一种排序,使得边只会从该次序中先出现的结点到后出现的结点。 例:1,2,3,4,5,6,7,8,9,10
D T L in 5 4 type 6 , int L id3 in 7 8 3 entry , L in 9 10 id2 2 entry id1 1 entry 4.1 语法制导的定义 属性计算次序 构造输入的分析树
D T L in 5 4 type 6 , int L id3 in 7 8 3 entry , L in 9 10 id2 2 entry id1 1 entry 4.1 语法制导的定义 属性计算次序 构造输入的分析树,构造属性依赖图
D T L in 5 4 type 6 , int L id3 in 7 8 3 entry , L in 9 10 id2 2 entry id1 1 entry 4.1 语法制导的定义 属性计算次序 构造输入的分析树,构造属性依赖图,对结点进行拓扑排序
D T L in 5 4 type 6 , int L id3 in 7 8 3 entry , L in 9 10 id2 2 entry id1 1 entry 4.1 语法制导的定义 属性计算次序 构造输入的分析树,构造属性依赖图,对结点进行拓扑排序,按拓扑排序的次序计算属性。
例5 . 6 图5 . 5的拓扑排序是: 1, 2, 3,4,5,6,7,8,9,10 a4:=real; a5:=a4; addtype(id3entry,a5); a7:=a5; addtype(id2entry,a7); a9:=a7; addtype(id1entry,a9);
◆语义规则的计算方法 1 .分析树法: 输入串 分析树 依赖图 计算次序 2.基于规则的方法:在构造编译器时,用 手工或专门的工具来分析语义规则,确定 属性值的计算顺序。 3. 忽略语义规则的方法:在分析过程中翻 译,那么计算顺序由分析方法来确定而 表面上与语义规则无关。实际上,限制 语法制导定义,使属性值的计算顺序能 和语法分析过程同步进行。
+ if-then-else * 8 S2 B S1 2 5 4.2 S属性定义的自下而上计算 4.2.1语法树 • 语法树是分析树的浓缩表示:算符和关键字是作为内部结点。 • 语法制导翻译可以基于分析树,也可以基于语法树 • 单非产生式链消失 • 语法树的例子:
4.2 S属性定义的自下而上计算 4.2.2构造语法树的语法制导定义
E.nptr T.nptr + E.nptr F.nptr T.nptr * T.nptr F.nptr F.nptr id num id 指向符号表中a的入口 指向符号表中b的入口 * + id id num 5 4.2 S属性定义的自下而上计算 a+5*b的语法树的构造
E.nptr T.nptr + E.nptr F.nptr T.nptr * T.nptr F.nptr F.nptr id num id 指向符号表中a的入口 指向符号表中b的入口 * + id id num 5 4.2 S属性定义的自下而上计算 a+5*b的语法树的构造
E.nptr T.nptr + E.nptr F.nptr T.nptr * T.nptr F.nptr F.nptr id num id 指向符号表中a的入口 指向符号表中b的入口 * + id id num 5 4.2 S属性定义的自下而上计算 a+5*b的语法树的构造
E.nptr T.nptr + E.nptr F.nptr T.nptr * T.nptr F.nptr F.nptr id num id 指向符号表中a的入口 指向符号表中b的入口 * + id id num 5 4.2 S属性定义的自下而上计算 a+5*b的语法树的构造
E.nptr T.nptr + E.nptr F.nptr T.nptr * T.nptr F.nptr F.nptr id num id 指向符号表中a的入口 指向符号表中b的入口 * + id id num 5 4.2 S属性定义的自下而上计算 a+5*b的语法树的构造
E.nptr T.nptr + E.nptr F.nptr T.nptr * T.nptr F.nptr F.nptr id num id 指向符号表中a的入口 指向符号表中b的入口 * + id id num 5 4.2 S属性定义的自下而上计算 a+5*b的语法树的构造
E.nptr T.nptr + E.nptr F.nptr T.nptr * T.nptr F.nptr F.nptr id num id 指向符号表中a的入口 指向符号表中b的入口 * + id id num 5 4.2 S属性定义的自下而上计算 a+5*b的语法树的构造
E.nptr T.nptr + E.nptr F.nptr T.nptr * T.nptr F.nptr F.nptr id num id 指向符号表中a的入口 指向符号表中b的入口 * + id id num 5 4.2 S属性定义的自下而上计算 a+5*b的语法树的构造
E.nptr T.nptr + E.nptr F.nptr T.nptr * T.nptr F.nptr F.nptr id num id 指向符号表中a的入口 指向符号表中b的入口 * + id id num 5 4.2 S属性定义的自下而上计算 a+5*b的语法树的构造
4.2 S属性定义的自下而上计算 4.2.3 S属性的自下而上计算 将LR分析器增加一个域来保存综合属性值。 top 栈 state val
4.2 S属性定义的自下而上计算 4.2.3 S属性的自下而上计算 将LR分析器增加一个域来保存综合属性值。 若产生式A→XYZ的语义规则是 A.a := f (X.x, Y.y, Z.z) top 栈 state val
4.2 S属性定义的自下而上计算 4.2.3 S属性的自下而上计算 将LR分析器增加一个域来保存综合属性值。 若产生式A→XYZ的语义规则是 A.a := f (X.x, Y.y, Z.z), 那么归约后: top top 栈 state val
4.2 S属性定义的自下而上计算 台式计算器的语法制导定义改成栈操作代码 top 栈 state val
4.2 S属性定义的自下而上计算 台式计算器的语法制导定义改成栈操作代码 top 栈 state val