编译原理课件05语法制导翻译技术和中间代码生成
合集下载
编译原理-语法制导翻译和中间代码生成
--entry 单词 id 的属性,在符号表的位 置
--addtype 在符号表中为变量添加类型信26 息
翻译方案的设计
• 将语义动作中的计算向前移,使继承属性的 计算出现在其文法符号之前
D → T { L.in := T.type } L T → int { T.type := integer } T → real { T.type := real } L → { L1.in := L.in }
• 属性文法 –接近形式化的语义描述方法
4
属性文法(attribute grammar)的定义
属性文法是一个三元组:A=(G,V,F),其中
G:是一个上下文无关文法。
V:有穷的属性集,每个属性与文法的一个终结符或非终结 符关联,这些属性代表与文法符号相关信息,比如它的类 型、值、代码序列、符号表内容等等。属性与变量一样, 可以进行计算和传递。属性加工的过程即是语义处理的过 程。
30
后缀式(逆波兰表示)
• 操作数 1,操作数 2,运算符
• 例 8-8 a := b *( - c )+ b *( - 34 )的后缀 式: a b c - * b 34 - * + :=
31
三元式
操作符op,运算对象1 arg1,运算对象2 arg2 例 :赋值语句 a := b *(- c)+ b *( - 34) 的三元式:
编译原理 第5章语法制导的翻译
23
5.2.1 依赖图
依赖图描述了某棵特定的分析树上的各个属 性实例之间的信息流(计算顺序)
从实例a1到实例a2的有向边表示计算a2时需要 a1的值。(必须先计算a2,再计算a1)
24
5.2.1 依赖图
依赖图的构造方法 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构造一条有向边;
32
受控的副作用
受控副作用的例子
L→En
变量声明的SDD中的副作用
通过副作用打印出E的值 总是在最后执行,且不会影响其它属性的求值 addType将标识符的类型信息加入到标识符表中。 只要标识符不被重复声明,标识符的类型信息总是正确的。
print(E.val)
33
5.3 语法制导的翻译方案
10
5.1 语法制导定义
5.语法制导的翻译 在产生式体中加入语义动作,并在适当的时 候执行这些语义动作
E→E1+T
{print ‘+’;}
11
5.1.1 继承属性和综合属性
编译原理(龙书)习题(5,6,7,8)章 ppt课件
为了求小数部分的值,引入L的综合属性b记录2的 L
的位数次幂值(2 length of L)
S L1.L2 S.val = L1.val +L2.val / L2.b; S L S.val = L.val; L L1 B L.val = L1.val *2 + B.val;
L.b = L1.b*2; L B L.val = B.val; L.b = 2; B 0 B.val = 0; B 1 B.val = 1;
5.2.4 这个文法生成了含“小数点”的二进制:
S L.L | L L LB | B B 0|1
设计一个L属性的SDD来计算S.val,即输入串的十进制数值。 比如,串101.11应该被翻译为十进制数5.635。提示:使 用一个继承属性L.side来指明一个二进制位在小数点的哪 一边。
2
ppt课件
exp 为原表达式的字符串,s 为求导后的字符串。 || 为串联接符。
ppt课件
9
ppt课件
10
ppt课件
11
5.4.3 下面的SDT计算了一个由0和1组成的串的值。它把输入 的符号串当作按照正二进制数来解释。
B B10{B.val 2 B1.val} | B11{B.val 2 B1.val 1} | 1{B.val 1}
1)一个repeat语句,repeat S while B 2)一个for循环语句,for (S1 ; B ; S2) S3
第8讲 语法制导翻译_1
例
产生式 (1) L E n
(2) E E1 + T (3) E T (4) T T1 * F (5) T F
(6) F ( E )
(7) F digit
语义规பைடு நூலகம் L.val = E.val E.val = E1.val + T.val E.val = T.val
T.val = T1.val × Fval
T.val = F.val F.val = E.val F.val = digit.lexval
第五章 语法制导翻译
语法制导定义SDD
哈尔滨工业大学 陈鄞
第五章 语法制导翻译
SDD的求值顺序
哈尔滨工业大学 陈鄞
SDD的求值顺序
SDD为CFG中的文法符号设置语义属性。对于 给定的输入串x,应用语义规则计算分析树中各 结点对应的属性值
每个S-属性定义都是L-属性定义
L-SDD的正式定义
一个SDD是L-属性定义,当且仅当它的每个属性要
么是一个综合属性,要么是满足如下条件的继承属
性:假设存在一个产生式A→X1X2…Xn,其右部符 号Xi (1 i n)的继承属性仅依赖于下列属性:
A的继承属性
为什么不能是综合属性?
产生式中Xi左边的符号 X1, X2, … , Xi-1 的属性 Xi本身的属性,但Xi 的全部属性不能在依赖图中形成环路
第5章 语法制导翻译和中间代码生成
§5.1 属性文法
属性文法的形式定义:一个属性文法形式 上可定义为一个三元组A,A=(G,V,F)。其中 G表示一个上下文无关文法;V表示属性的有穷集; F表示有关属性的断言或谓词的有穷集。 属性可以分为综合属性和继承属性两类。 综合属性一般用于自下而上传递信息,而继承属 性常常用于自上而下传递信息。
算术表达式-x+y z 的逆波兰 例5.3 : 式为x @ yz +,在栈中的计值过程如图 所示。
z
t1:=-x
x
y
t2:=y z
t2 t1
t3:=t1+t2 t3
源自文库
同时y、z入栈 t1
逆波兰式的计值过程
5.3.2 三元式和树形表示
三元式是中间语言的另一种形式,每个三元 式由三个部分组成:算符op,运算对象arg1,运 算对象arg2。三元式的一般格式为:(i)(op, arg1,arg2)。其中(i)为序号。如表达式-a b+c d可用三元式表示为: (1)(@ , a , - ) (2)( , (1), b ) (3)( , c , d )
1. 四元式 在编译过程产生的各种中间语言中,四元 式是比较普遍采用的一种形式。与三元式类似, 四元式由四个部分组成,算符op ,运算对象 arg1和arg2,运算结果t。 四元式的一般格式为: (i) (op, arg1, arg2, t) 其中,(i)为序号,运算对象和运算结 果可以是用户自己定义的变量,也可以是编译 程
《编译原理》第5章 语法制导翻译
+
5.2.4 表达式的无环有向图
◆无环有向图 (Directed Acyclic Graph,简称dag) 用途:提取表达式中的公共子表达式, 以取得目标程序的局部优化。 方法:执行mknode和mkleaf时,检查是 否已有相同的结点,若有,则返回相应结 点的指针。
例5.9 表达式 a+a*(b-c)+(b-c)*d 的dag
5.2.1 语法树
产生式s→if B then S1 else S2的语法树 if-then-else / | \ B S1 S2 赋值语句的语法树 assignment variable expression 在语法树中,运算符号和关键字都不在叶结点, 而是在内部结点中出现。
5.2.2 构造表达式的语法树
分析树法: 输入串→分析树→依赖图→计算次序 基于规则的方Hale Waihona Puke Baidu: 在构造编译器时,用手工或专 门的工具来分析语义规则,确定属性值的计算顺序。 忽略语义规则的方法:在分析过程中翻译,那么 计算顺序由分析方法来确定而表面上与语义规则无 关。这种方法限制了能被实现的语法制导定义的种 类。 后两种方法不必显式构造依赖图,因此时空效率 更高。
语义处理
总目标:生成等价的中间代码
2. 代码结构
计算学科:对信息(数据表示)描述和变 换算法的系统研究 变换:源、目标以及源与目标的对应关系 语句的代码结构 语句分类: 说明语句——符号表的查填 可执行语句——指令代码
5.2.4 表达式的无环有向图
◆无环有向图 (Directed Acyclic Graph,简称dag) 用途:提取表达式中的公共子表达式, 以取得目标程序的局部优化。 方法:执行mknode和mkleaf时,检查是 否已有相同的结点,若有,则返回相应结 点的指针。
例5.9 表达式 a+a*(b-c)+(b-c)*d 的dag
5.2.1 语法树
产生式s→if B then S1 else S2的语法树 if-then-else / | \ B S1 S2 赋值语句的语法树 assignment variable expression 在语法树中,运算符号和关键字都不在叶结点, 而是在内部结点中出现。
5.2.2 构造表达式的语法树
分析树法: 输入串→分析树→依赖图→计算次序 基于规则的方Hale Waihona Puke Baidu: 在构造编译器时,用手工或专 门的工具来分析语义规则,确定属性值的计算顺序。 忽略语义规则的方法:在分析过程中翻译,那么 计算顺序由分析方法来确定而表面上与语义规则无 关。这种方法限制了能被实现的语法制导定义的种 类。 后两种方法不必显式构造依赖图,因此时空效率 更高。
语义处理
总目标:生成等价的中间代码
2. 代码结构
计算学科:对信息(数据表示)描述和变 换算法的系统研究 变换:源、目标以及源与目标的对应关系 语句的代码结构 语句分类: 说明语句——符号表的查填 可执行语句——指令代码
第5课 词法分析、符号表、中间代码生成
第二章 一个简单的语法制导翻译器
词法分析
词法分析器:Lexer 图2-34、图2-35
第二章 一个简单的语法制导翻译器
package lexer; //文件Lexer.java import java.io.*; import java.util.*; public class Lexer { public int line = 1; private char peek = ' '; private Hashtable words = new Hashtable(); void reserve(Word t) {words.put(t.lexeme, t);} public Lexer () { reserve(new Word(Tag.TRUE, "true")); reserve(new Word(Tag.FALSE, "false")); } public Token scan() throws IOException { for( ; ; peek = (char)System.in.read() ) { if(peek == ' ' || peek == '\t') continue; else if(peek == '\n') line = line + 1; else break; }
第五章 语法制导翻译(1)
第五章 语法制导翻译
1
在文法中,文法符号通常都有明确的意义,文法符 号之间也有确定的语义关系。
用属性描述语义信息,用语义规则描述属性之间的 关系,将语义规则与语法规则相结合。
语法制导翻译(Syntax-Directed Translations): 在语法分析的过程中计算语义属性值。
编译原理
L.in := T.type
T. type := integer
T float
L L1, id L id
T. type := float
L1.in := L.in; addtype (id.entry, L.in ) addtype (id.entry, L.in )
29
ቤተ መጻሕፍቲ ባይዱ
id.entry : 指向符号表的id表目的指针,由词法分析得到 编译原理
编译原理 18
图5-7
T val 9
F val 3 digit lexval 1
*
inh 5 T′
syn 8 inh 6 T1′ syn 7
F val 4 digit lexval 2
编译原理
19
5.2.2 属性求值的顺序
拓扑排序:结点的一种排序,若mimj是从mi到mj 的边,那么在此排序中mi先于mj。 有向图变成线形排序 例:图5-7的一个拓扑排序 1,2,3,4,5,6,7,8,9 或1,3,5,2,4,6,7,8,9
1
在文法中,文法符号通常都有明确的意义,文法符 号之间也有确定的语义关系。
用属性描述语义信息,用语义规则描述属性之间的 关系,将语义规则与语法规则相结合。
语法制导翻译(Syntax-Directed Translations): 在语法分析的过程中计算语义属性值。
编译原理
L.in := T.type
T. type := integer
T float
L L1, id L id
T. type := float
L1.in := L.in; addtype (id.entry, L.in ) addtype (id.entry, L.in )
29
ቤተ መጻሕፍቲ ባይዱ
id.entry : 指向符号表的id表目的指针,由词法分析得到 编译原理
编译原理 18
图5-7
T val 9
F val 3 digit lexval 1
*
inh 5 T′
syn 8 inh 6 T1′ syn 7
F val 4 digit lexval 2
编译原理
19
5.2.2 属性求值的顺序
拓扑排序:结点的一种排序,若mimj是从mi到mj 的边,那么在此排序中mi先于mj。 有向图变成线形排序 例:图5-7的一个拓扑排序 1,2,3,4,5,6,7,8,9 或1,3,5,2,4,6,7,8,9
编译原理01-本讲教学课件(PDF文档)_3
S-SDD
语义规则
L.val = E.val 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 = digit.lexval
SDT
(1) L E n { L.val = E.val} (2) E E1 + T{E.val = E1.val + T.val} (3) E T { E.val = T.val} (4) T T1 * F { T.val = T1.val × F.val} (5) T F { T.val = F.val} (6) F ( E ) { F.val = E.val} (7) F digit { F.val = digit.lexval}
{stack[top-2].val = stack[top-2].val × stack[top].val ; top=top-2; }
{stack[top-2].val = stack[top-1].val; top=top-2; }
输入: 3*5+4
状态 符号属性
0 $_ 2 T 135
SLR自动机
产生式
例(1)E′ → E
(2)E → E1 + T
(3) E → T (4) T → T1 * F
《编译原理课程教案》第5章:中间代码生成
5.2中间代码的几种形式
• 1、逆波兰式: –运算对象写在前,运算符写在后(后缀表示形式) 例:a+b ab+ + (a+b)*c ab+c* a+b*c abc*+ a:=b*c+b*d abc*bd*+:= a b –优点:易于计算机处理
利用栈,将扫描到的运算对象入栈,碰到运算符: 若是双目运算符,则对栈顶的两个运算对象实施该运算 并将运算结果代替这两个运算对象进栈; 若是单目运算符,对栈顶元素,执行该运算,将运算结 果代替该元素进栈,最后结果即栈顶元素。
• 语义分析和翻译的方法:语义表示较流行 的方法仍然是属性文法,翻译方法是语法 制导的翻译。
属性文法
• 属性文法:是在上下文无关文法的基础上,为 每个文法符号(含终结符和非终结符)配备若干 个属性值,对文法的每个产生式都配备了一组 属性计算规则(称为语义规则)。在语法分析过 程中,完成语义规则所描述的动作,从而实现 语义处理。 • 属性:代表与文法符号相关的信息,如类型、 值、代码序列、符号表的内容等。与变量一样, 可以进行计算和传递,属性的加工过程就是语 义的处理过程。
3
12
r6
-15-4 9 3
10
print(E.val) +4# 1.E→E1+T E.val:=E1.val+t.val +4# E E→T T 2. E.val:=T.val 4# 3.T→T1*F T.val:=T 1.val * F.val 4.T→F T.val:=F.val # 5.F→(E) F.val:=E.val # .lexval F F→ i digit F.val:=digit 6.
编译原理:语法制导翻译和中间代码生成
使用符号来表示变量、常量和操 作符等,用于描述程序的特定语 义。
抽象语法树
以树的形式组织代码的结构,表 示程序在语法和语义上的结构。
四元式
使用四元组来表示中间代码的指 令和操作数,以便进行翻译和执 行。
中间代码生成的优化技术
1 常量折叠
对于常量表达式,将wenku.baidu.com直 接计算为常量的值,以减 少运行时的开销。
2 公共子表达式提取
3 死代码消除
识别和提取重复出现的子 表达式,以减少冗余计算。
移除无效或永远无法被访 问到的代码,以提高程序 的执行效率。
结论和总结
语法制导翻译和中间代码生成是编译原理中的关键步骤,为程序的解释和执行提供了基础。 通过合理的优化技术和中间代码的生成,可以提高程序的效率和可移植性。
中间代码生成的常用方法
三地址码
使用类似于三元表达式的形式 来表示指令,使得生成的代码 更加简洁和高效。
间接中间代码
通过引入临时变量和临时操作 符的方式,将复杂的表达式转 化为更简单的形式。
基于栈的代码生成
将表达式的计算过程用栈来组 织,以实现表达式的计算和结 果的存储。
中间代码表示的形式和结构
符号表达式
语法制导翻译的步骤和原理
1
语法分析
通过词法分析和语法分析,将源程序转化为语法树。
2
语义分析
抽象语法树
以树的形式组织代码的结构,表 示程序在语法和语义上的结构。
四元式
使用四元组来表示中间代码的指 令和操作数,以便进行翻译和执 行。
中间代码生成的优化技术
1 常量折叠
对于常量表达式,将wenku.baidu.com直 接计算为常量的值,以减 少运行时的开销。
2 公共子表达式提取
3 死代码消除
识别和提取重复出现的子 表达式,以减少冗余计算。
移除无效或永远无法被访 问到的代码,以提高程序 的执行效率。
结论和总结
语法制导翻译和中间代码生成是编译原理中的关键步骤,为程序的解释和执行提供了基础。 通过合理的优化技术和中间代码的生成,可以提高程序的效率和可移植性。
中间代码生成的常用方法
三地址码
使用类似于三元表达式的形式 来表示指令,使得生成的代码 更加简洁和高效。
间接中间代码
通过引入临时变量和临时操作 符的方式,将复杂的表达式转 化为更简单的形式。
基于栈的代码生成
将表达式的计算过程用栈来组 织,以实现表达式的计算和结 果的存储。
中间代码表示的形式和结构
符号表达式
语法制导翻译的步骤和原理
1
语法分析
通过词法分析和语法分析,将源程序转化为语法树。
2
语义分析
编译原理课件-第5章Syntax-Directed Translation
following form, for all the grammar rules of the language.
Xi.aj = fij(X0.a1,…,X0.ak, …, X1.al, …, Xn-1.a1, …Xn.ak) Where fij is a mathematical function of its arguments
factor (val =3)
number (val = 3)
பைடு நூலகம் ● example
3) 已知变量声明文法如下,请对float x, y进行语义分析。 decl type var-list typeint|float var-listid,var-list|id
解: grammar rule decltype var-list typeint type float var-list1id,var-list2
term1.val=term2.val*factor.val term.val=factor.val
factor.val=exp.val
factor.val=number.val
the parse tree (34-3)*42
term (val = 31)
factor (val = 31)
(
exp (val = 34-3=31)
the process of computing an attribute and associating its computed value with the language construct in question. ● Binding time联编时间
Xi.aj = fij(X0.a1,…,X0.ak, …, X1.al, …, Xn-1.a1, …Xn.ak) Where fij is a mathematical function of its arguments
factor (val =3)
number (val = 3)
பைடு நூலகம் ● example
3) 已知变量声明文法如下,请对float x, y进行语义分析。 decl type var-list typeint|float var-listid,var-list|id
解: grammar rule decltype var-list typeint type float var-list1id,var-list2
term1.val=term2.val*factor.val term.val=factor.val
factor.val=exp.val
factor.val=number.val
the parse tree (34-3)*42
term (val = 31)
factor (val = 31)
(
exp (val = 34-3=31)
the process of computing an attribute and associating its computed value with the language construct in question. ● Binding time联编时间
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5.4 中间代码
例如 X= a*b+c/d 的 四元式序列:
(1) (2) (3) (4) ( *, ( /, ( +, ( =, a, c, b, d, T1 ) T2 ) T3 ) X )
T1 , T2 , T3 , - ,
相应的三地址语句序列为: (1)T1=a*b (3)T3=T1+T2 (2)T2=c/d (4)X=T3
5.1 概述
例如: 表达式 A+B*C 对运算对象进行类型检查, 对变 量进行先定义后使用检查 执行真正的翻译 如果静态语义正确, 语义处理则要执 行真正的翻译, 即生成程序的某种中间 代码的形式或直接生成目标代码.
5.1 概述
目前多数编译程序进行语义分析的方 法是采用语法制导翻译法 .它不是一种 采用语法制导翻译法 形式系统, 但它比较接近形式化. 语法制导翻译法使用属性文法为工具 来描述程序设计语言的语义.
c R S
5.5 自下而上的语法制导翻译
{ print "1"} { print "2"} { print "3"} { print "4"} { print "5"} R 翻译结果为: R / 1 4 5 314 24 31
b
S→bTc S→a T→R R→R/S R→S
S
b R / S T b
E E.val = 47 E E.val = 7 7 + E E.val = 40 * E E.val = 5 5
E E.val = 8 8
5.4 中间代码
3. 编译中常用的中间代码: 逆波兰式 三元式 四元式 树形表示
5.4 中间代码
逆波兰式 逆波兰式除去了原表达式中的括号, 并将运算对象写在前面,运算符写在后 面,因而又称为后缀式 后缀式. 后缀式 例如: 中缀表达式 a*b (a+b)*(c+d) 逆波兰式 ab* ab+cd+*
5.4 中间代码
当计算机自左到右顺序扫描逆兰波 式时,若当前符号是运算对象则进栈, 若当前符号是运算符,设为K元运算符, 则将栈顶的K个元素依次取出,同时进 行K元运算,并将运算结果置于栈顶, 表达式处理完毕时,其计算结果自然呈 现在栈顶.
5.4 中间代码
逆波兰式ab+c*的处理过程如下图:
b a
{7+8*5,3+8,6*5,…} 5.3 语法制导翻译概述
例如,设有简单算术表达式的文法: E→E+E | E*E | (E) | digit 为文法每一产生式设计相应的求值的语义 描述(语义动作): 1.E → E(1)+E(2) {E.val =E(1).val +E(2).val} 2.E → E(1)*E(2) {E.val =E(1).val*E(2).val} {E.val =E(1).val} 3.E → (E(1)) {E.val =Lex.digit} 4.E → digit
5.4 中间代码
例1. –a + b * ( –c + d )的逆波兰式 a@ bc @ d + * +
5பைடு நூலகம்4 中间代码
–a + b * ( –c + d )的四元式表示 t1= @ a t2= @ c t3= t2 + d t4= b* t3 t5= t1+ t4
5.4 中间代码
例2. i↑( i /( i – i ) )的逆波兰式 i i i i – /↑ i↑( i /( i – i ) )的四元式 t1= i – i t2= i / t1 t3= i ↑ t2
5.4 中间代码
间接三元式 (1) 间接三元式表: 用来存放各三元式本身. (2) 间接码表: 按执行各三元式的顺序,依次 列出各三元式在三元式表中的位置. 注意 : 间接三元式表中不存放重复的 三元式. 三元式.
5.4 中间代码
例如 语句 X= (A+B)*C Y= D↑(A+B)
三元式序列 (1) ( + , A , B ) (2) ( * , (1) , C ) (3) ( = , X , (2) ) (4) ( + , A , B ) (5) (↑ , D , (4) ) (6) ( = , Y, (5) ) 间接三元式 间接码表 三元式表 (1) (1) ( + , A , B ) (2) (2) ( * , (1) , C ) (3) (3) ( = , X , (2) ) (1) (4) (↑ , D , (1) ) (4) (5) ( = , Y, (4) ) (5)
1.E → E(1)+E(2) 2.E → E(1)*E(2) 3.E → (E(1)) 4.E → digit
{E.val =E(1).val +E(2).val} {E.val =E(1).val*E(2).val} {E.val =E(1).val} {E.val =Lex.digit} 句子 7+8*5
5.4 中间代码
树形表示 A * B + C*D + *
A B C
树形表示是三元式的翻版
(3)+
*
D A
(1)* BC
(2)* D
末端结点表示一个运算对象, 每一个内 结点表示一个一元或二元运算符.
5.4 中间代码
四元式主要由四部分组成: 四元式 (OP,arg1, arg2, result) 其中OP是运算符, arg1,arg2分别是第一和第二两个运算对象. 当OP是一目运算时,常常将运算对象定义 为arg1.
5.4 中间代码
四元式的特点: 1. 四元式出现的顺序和语法成份的计值 顺序相一致. 2. 四元式之间的联系是通过临时变量实 现的,这样易于调整和变动四元式. 3. 便于优化处理.
5.4 中间代码
编译系统中,有时将四元式表示成另一 种更直观,更易理解的形式——三地址代 码或三地址语句. 三地址代码形式定义为: result := arg1 OP arg2 三地址语句:语句中是三个量的赋值语句, 三地址语句 每个量占一个地址.
第5章
语法制导翻译技术和中间 代码生成
5.1 概述 5.2 属性文法 5.3 语法制导翻译概述 5.4 中间语言 5.5 自下而上语法制导翻译 5.6 递归下降语法制导的翻译 本章小结
5.1 概述
语义分析的任务: 静态语义审查 审查每个语法结构的静态语义, 审查每个语法结构的静态语义 即验证语法结构合法的程序,是否 即验证语法结构合法的程序 是否 真正有意义. 真正有意义
5.4 中间代码
例如 a+b*c 的 三元式序列: (1) ( * , b , c) (2) ( + , a , (1) ) 运算对象是指向符号表的某一项或指向 三元式表的某一项.
5.4 中间代码
三元式的特点: 1. 三元式出现的顺序和语法成份的 计值顺序相一致. 2. 三元式之间的联系是通过指示器 实现的.
采用自下而上语法制导翻译,给出输入串 bR / bTc / bSc / ac的翻译结果
5.5 自下而上的语法制导翻译
分析: 首先对输入串 bR / bTc / bSc /ac画 出语法树: 再考虑归约时 执行相应语义 动作
R R / b S b R / S T b T R / S T c S a c
5.2 属性文法
1. 属性文法 (1) 属性 对文法的每一个符号, 引进一些属 性, 这些属性代表与文法符号相关的信 息, 如类型,值,存储位置等.与属性 相关的信息, 即属性值,可以在语法分析 过程中计算和传递.
5.2 属性文法
属性加工的过程即是语义的处理过程. 属性加工的过程即是语义的处理过程. 属性分为两类: 综合属性和继承属性. 综合属性其计算规则按"自下而上"方 式进行, 即规则左部符号的某些属性根 据其右部符号的属性和(或)自己的其他 属性计算而得.
5.2 属性文法
继承属性其计算规则按"自上而下"方 式进行, 即规则右部符号的某些属性根 据其左部符号的属性和(或)右部其他符 号的某些属性计算而得.
5.2 属性文法
(2) 属性文法 属性文法包含一个上下文无关文法和 一系列语义规则. 语义规则: 为文法的每一个规则配备的计算属性 的计算规则, 称为语义规则(描述语义处 理的加工动作) .
5.2 属性文法
这些语义规则附在文法的每个产生 式上,在语法分析过程中, 执行语义规则 描述的动作, 从而实现语义处理.也就 , 是说, 附在文法的每个产生式上语义规 则描述了语义处理的加工动作. 目前流行的语义描述和语义处理的 方法主要是属性文法和语法制导翻译方 法.
5.3 语法制导翻译概述
2. 语法制导翻译法 (1) 语法制导翻译法 的基本思想 为文法的每个产生式都配备一个语义 动作或语义子程序. 在语法分析的过程中,每当使用一条 产生式进行推导或归约时,就执行相应 产生式的语义动作, 从而实现语义处理.
5.3 语法制导翻译概述
S→…… {… … } … …… A→xy {… … } …… … 语义处理的 加工动作 a1 a2 a3 …ai ai+1 …an
语法制导翻译法使用属性文法为工具 来说明程序设计语言的语义.
5.3 语法制导翻译概述
(2) 语法制导翻译法 在语法分析过程中,依随分析的过程, 根据每个产生式所对应的语义子程序(或 语义规则描述的语义处理的加工动作)进 行翻译的方法.
5.4 中间代码
例如 X= a*b+c/d 的 四元式序列: (1) ( *, a, b, T1 ) (2) ( /, c, d, T2 ) (3) ( +, T1, T2, T3 ) (4) ( =, T3, -, X ) 四元式的第四个分量result是编译程序 为存放中间运算结果而临时引进的变量, 常称为临时变量,如Ti,也可以是用户 自定义变量,如X.
c
T1
T1
T2
5.4 中间代码
逆波兰形式可以推广到其他语法结构: 赋值语句 V=E 条件语句 if E S1 ; else S2 逆波兰式 VE= 逆波兰式 ES1S2¥
第5章 语法制导翻译技术和中间代 码生成
三元式和树形表示
三元式主要由三部分组成: 三元式 (OP,arg1, arg2) 其中OP是运算符, arg1,arg2分别是第一和第二两个运算对象. 当OP是一目运算时,常常将运算对象定 义为arg1.
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.5 自下而上的语法制导翻译
4. 采用自下而上的语法制导翻译法语义 动作的设计 (1)搞清楚源结构和目标结构 (2)自下而上的语法制导翻译特点: 栈顶形成句柄,归约时执行相应语义 动作 (3)给出从源结构到目标结构的变换 方法
5.5 自下而上的语法制导翻译
例1. 设文法及其相应的语义动作如下: S→bTc S→a T→R R→R/S R→S { print "1"} { print "2"} { print "3"} { print "4"} { print "5"}
5.5 自下而上的语法制导翻译
S b R R / b / S T b T R / S T c S a c
c R S
5.5 自下而上的语法制导翻译
例2 简单算术表达式求值的语义描述 例如,设有简单算术表达式的文法: E→E+E | E*E | (E) | digit 1.E → E(1)+E(2) {E.val =E(1).val +E(2).val} 2.E → E(1)*E(2) {E.val =E(1).val*E(2).val} {E.val =E(1).val} 3.E → (E(1)) {E.val =Lex.digit} 4.E → digit
5.4 中间代码
逆波兰式表示法同中缀表示法相比其 优点是: 1. 不再有括号,且运算符出现的顺序体 现了中缀表达式 的运算顺序 2. 易于计算机处理
5.4 中间代码
一般表达式计值时,要处理两类符 号,一类是运算对象,另一类是运算符, 通常用两个工作栈分别处理.但处理用 逆波兰式表示的表达式却只用一个工作 栈.
5.5 自下而上的语法制导翻译
例3 简单算术表达式翻译到四元式的 语义描述 例如,设有简单算术表达式的文法: E→E+E | E*E | (E) | i