第7章+语法制导翻译和中间代码生成
编译原理张晶版 第七章 语法制导翻译和中间代码生成
(1)s=s0
(2)s=s1 (3)s=ε
课程名称
第七章 语法制导翻译和中间代码生成(22)
输入输出对可由(,)表示,其中是输入句子形式而是输出句子形 式。
(S,S)开始用产生式s0s来扩展得到(0S,S0).
再用一次规则(1),得到(00S,S00)。 再用规则(2),就得到(001S,S100). 然后应用规则(3)并得到(001,100)。
L id
T.type=integer T.type:=real
L1.in:=L.in addtype(id.entry,L.in) addtype(id.entry,L.in)
课程名称
第七章 语法制导翻译和中间代码生成(17)
Real id1,id2,id3
D T.type=real real L.in= real L.in= real , id3
E T T F F
T T1 * F F (E) digit
设表达式为3*5+4,则语义动作打印数值19
. L
E.val=19 E.val=15
+
T.val=3 F.val=3 digit.lexval=3 F.val=5
*
F.val=4
digit.lexval=4 digit.lexval=5
课程名称
第七章 语法制导翻译和中间代码生成(23)
课程名称
第七章 语法制导翻译和中间代码生成(3)
属性文法 表达式文法 E—>T+T| T or T T—>n | b ET1 + T2 { T1.type = int T2.type= T1.type E.type :=int} E T1 or T2 { T1.type = bool T2.type= T1.type E.type :=bool} T n { T.type := int} T b { T.type := bool}
第7章+语法制导翻译和中间代码生成
13
属性文法
属性文法是一个三元组:A=(G,V,F),其中 G:是一个上下文无关文法。 V:属性的有穷集,每个属性与文法的一个终 结符或非终结符相连,这些属性代表与文 法符号相关信息,如它的类型、值、代码 序列、符号表内容等等 .属性与变量一样, 可以进行计算和传递。
14
F:关于属性的属性断言或一组属性的计 算规则(称为语义规则) 。 断言或语义 规则与一个产生式相联,只引用该产生 式左端或右端的终结符或非终结符相 联的属性。
在文法的每个 产生式后配了 一个有{ }括起 来的语义子程 序。
4
对(i+i)*i的翻译
不难证明该符号串是文法的合法句子。 按照这个句子向文法开始符号E的归约次 序,且每当归约时调用该句柄的产生式所 对应的语义子程序,便可得到相应的数字 串:64264154632。
5
这个例子表明: (i+i)*i
§ 7.7
控制流语句 的翻译
41
if语句的翻译
if E then S1 else S2,其中E为布尔式
E的代码序列
真出口 假出口
S1的代码序列
S2的代码序列
42
E 的代码
E.true: E.false: S1的代码
E.true E.false
goto out
S2的代码 out:
43
例子
if A∨ B < D then S1 else S2 (1) ( jnz , A , _ , 5 ) 真出口 (2) ( j , _ , _ , 3 ) 不是最优翻译 (3) ( j< , B , D , 5 ) (4) ( j , _ , _ , p+1 ) 假出口 (5) ( 关于S1的四元式序列 ) ………… (p) ( j , _ , _ , q ) (p+1) ( 关于S2的四元式序列 ) ………… (q)
语法制导翻译与生成中间代码(附代码)
《编译系统设计实践》实验项目三:语法制导翻译与生成中间代码学号::年级:学院:数计学院专业:计算机本组其它成员:学号学号实验时间:2016-2017学年第一学期任课教师:一、实验目的通过语法制导或翻译模式生成中间代码。
二、实验容在自底向上语法分析基础上设计语义规则(语法制导翻译),将源程序翻译为四元式输出,若有错误将错误信息输出。
三、设计思路1.分析过程主函数,读取文件,存入字符串数组,调用语义分析,判断关键字,调用相应的语义规则(这里只有if和while和赋值语句),赋值语句调用表达式处理,if语句调用条件表达式处理,while也是调用表达式处理,然后是一个递归过程,不断的递归调用,按序输出三地址语句。
在本例程序中选用expr及num 作为运算数。
2.主要函数string link() //字符串和数字的连接string element() //获取表达式中的元素对象string expression() //处理表达式string expression_1() //处理表达式string biaodashi() //处理表达式,转为三地址输出string biaodashi_1() //递归---处理表达式,转为三地址输出string getOperator() //判断并获取运算符void condition(int L1,int L2) //输出if语句的条件的三地址代码void yuyifenxi_list() //生成并输出条件返回地址void yuyifenxi_list_1() //递归---生成并输出条件返回地址void yuyifenxi(int next,int &flag) //判断关键字,调用相应的产生式分析void readfile() //文件读入四、测试报告1.第一组测试:图1-1 输入待翻译代码图1-2 中间代码生成2.第二组测试:图2-1 输入待翻译代码图2-2 中间代码生成3.第三组测试:错误待翻译代码图3-1 输入待翻译代码图3-2 中间代码生成五、实验总结实验三的重点在于判断关键字,调用相应的产生式分析及处理表达式,转为三地址输出部分,也是很费时间的难点部分,但通过查阅书本及网上资料,还是将其以多个处理函数的递归调用实现了,虽然最后实现结果对错误的分析还不够精确有些差强人意,但毕竟还算有些收获了。
语法制导翻译与中间代码生成
(2)如果b是产生式右部某个文法符号X的一个属性,并且 c1,c2,„,ck是A或产生式右边任何文法符号的属性,则称b 是文法符号X的继承属性。
2013-8-12 莆田学院许振和 12
综合属性:归约型属性,用于“自下而上”传递信 息。 继承属性:推导型属性,用于“自上而下”传递信 (1)非终结符既可有综合属性也可有继承属性,但文法 息。 开始符号没有继承属性。 (2)终结符只有综合属性,它们由词法程序提供。例 8.1中,E、T和F的val属性是综合属性,例8.2中的L的in 是继承属性。 结点的综合属性值通过分析树中该结点的子结点的属 性值计算。继承属性值由该结点的兄弟结点和父结点的属 性值计算。
莆田学院许振和
18
1、计算语义规则
属性之间的依赖关系, 实质上反映了属性计算 的先后次序
所谓依赖图是一个有向图,用于描述分析 树中的属性和属性间的相互依赖关系。
如果分析树中一结点的属性b依赖于属性c, 那么这个结点的属性b的语义规则的计算必须 在定义属性c的语义规则的计算之后。分析树 结点的继承属性和综合属性间的互相依赖关系 可以用名为依赖图的有向图来描绘。
2013-8-12
莆田学院许振和
13
例5.1
产 生 式
简单算术表达式求值的语义描述 综合属性的例子
语 义 规 则
Print(E.val) L→ E E →E1+T E.val:=E1.val+T.val E→T E.val:=T.val T →T1 * F T.val:=T1.val F.val T→F T.val:=F.val F→(E) F.val:=E.val F→digit F.val:=digit.lexval
2013-8-12
第7章 语义分析与中间代码生成
•
第6章小结
• 注释分析树和相应的依赖图是属性值的关联 关系和计算顺序的表达形式,语义关系可以 使用抽象语法树表示。 依据语法分析方法有自底向上的和自顶向下 的,语法制导翻译既可以按照自底向上的策 略进行,也可以按照自顶向下的策略进行。
•
2013-7-25
3
第7章 语义分析与中间代码生成
第6章小结
• • 语法分析中进行静态语义检查和中间代码生 成的技术称为语法制导翻译技术。 为了通过将语义属性关联到文法符号、将语 义规则关联到产生式,有效地将语法和语义 关联起来,人们引入了语法制导定义。没有 副作用的语法制导定义又称为属性文法。
2013-7-25
1
第6章小结
• 为相应的语法成分设置表示语义的属性,属 性的值是可以计算的,根据属性值计算的关 联关系,将其分成综合属性和继承属性,根 据属性文法中所含的属性将属性文法分成S属性文法和L-属性文法。 如果不仅将语义属性关联到文法符号、将语 义规则关联到产生式,而且还通过将语义动 作嵌入到产生式的适当位置来表达该语义动 作的执行时机,这就是翻译模式。翻译模式 给语义分析的实现提供了更好的支持。
2013-7-25
arg2 result t1 d t2 d t4 t2 t3 t4 t5 a
5 assign
图7.2(a) 图7.1中三地址码的四元式表示
11
三元式
• 为了节省临时变量的开销,有时也可以使用只有三个域的三 元式来表示三地址码。三元式的三个域分别称为op,arg1和 arg2,op,arg1和arg2的含义与四元式类似,区别只是arg1和 arg2可以是某个三元式的编号(图7.2(b)中用圆括号括起来的数 字),表示用该三元式的运算结果作为运算对象。
语法制导翻译和中间代码生成
继承属性L.in
语 义 规 则
语句: real id1, id2, id3 的分析树,采用自上而下的分析方法
产 生 式
D TL
T int
T real
L L1,id
L id
L.in:=T.type
T.type=integer
F.val=3
F.val=5
digit.lexval=4
digit.lexval=5
digit.lexval=3
+
*
3*5+4的带注释的分析树
如果一个语法制导定义仅仅使用综合属性,则称这种语法制导定义为S属性定义。通常采用自底向上的方法对其分析树加注释,即从树叶到树根,按照语义规则计算每个节点的属性值。
表达式文法 E→T+T| T or T T → n | true | false
E → T1 + T2 { T1.type = int AND T2.type = T1. type E.type :=int } E → T1 or T2 { T1.type = bool AND T2.type= T1.type E.type :=bool } T → n { T.type := int } T → true { T.type := bool } T → false { T.type := bool }
T.type:=real
L1.in:=L.in
addtype(id.entry,L.in)
addtype(id.entry,L.in)
D
L.in= real
L.in= real
L.in= real
T.type=real
语法制导翻译和中间代码生成【共50张PPT】
例 完成类型检查的属性文法
1) E→T1+T2{T1.t=int AND T2.t=int}
2) E→T1 or T2 {T1.t=bool AND T2.t=bool}
3) T→num
{T.t :=int}
4) T→true {T.t :=bool}
5) T→false
{T.t :=bool}
6.1 属性文法(续)
四元式(续)
四元式的优点:
四元式比三元式更便于优化 优化要求改变运算顺序或删除某些运算,引起编号的变化。 三元式通过编号引用中间结果,编号的变化引起麻烦;四元 式通过临时变量引用中间结果,编号变化无影响。
四元式对生成目标代码有利
四元式表示很类似于三地址指令,很容易转换成机器代 码。
四元式(续)
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 }
E.val、T.val、F.val都是综合属性
每个使用性标识符是否都有声明? 运算符的分量类型是否相容? 赋值语句的左右部的类型是否相容?
➢ 赋值语句的翻译目标:
在赋值语句右部表达式产生的四元式序列后加一 条赋值四元式
简单赋值语句到四元式的翻译
考虑如下文法描述的简单赋值句的翻译: A→i:=E E→E+E|E*E|-E|(E)|i (6.1)
:=
a
+
叶子结点代表运算量, 非叶子结点代表运算符
编译程序原理与实现:第7章 中间代码生成(1)
--- 传值
• 结构语句
• (THEN, t ,_ ,_ )
--- THEN分支标记
• (ELSE, _ , _ ,_ )
--- ELSE分支标记
• (ENDIF, _ , _ , _ )
--- IF语句结束四元式
• (WHILE, _ , _ , _ )
---WHILE语句开始标记
• (DO,t,_ ,_ )
• 三地址中间代码
• 三地址:两个操作分量和一个结果的抽象地址;
• 为方便起见, 通常用变量名代替抽象地址;
• 三元式
• No. (op, operand1, operand2) • 编号 (操作符, 操作分量1, 操作分量2) • 其中操作分量可以是变量名(抽象地址)或者编号
• 四元式
• (op, operand1, operand2, result) • (操作符, 操作分量1, 操作分量2, 结果) • 其中操作分量可以是变量名(抽象地址)或者临时变量(抽象地址)
--- 函数出口
• (CALL, f, true/false, Result) --- 调用函数f,返回值给Result
• (RETURN, -,-, -)
• (RETURN, -,-, t)
• 传递参数
• (VARACT, id, offset, size )
--- 传地址
• (VALACT, id, offset, size )
•
{ op = pop(S1,1); (str1, str2)=pop(S2,2);
•
push(S2, str2+str1 + “op”);
•
}
•
push(S1,tk); goto (2);
计算机系统结构之语法制导翻译和中间代码生成(23页)
三、循环语句
S->for i:=E1 step E2 until E3 do S1
四、分叉语句:
语法:case E of
c1:S1;
c2:S2;
……
cn-1:Sn-1;
otherwise:Sn
end
五、过程调用语句
例:CALL S(A+B,Z)
翻译成:T:=A+B
par T
par Z
call S
E.PLACE:与非终结符E相联系的语义变量,表 示存放E值的变量名在符号表的入口或整数码。
GEN(OP,ARG1,ARG2,RESULT):一个 语义过程,把一个四元式填入四元式表。
二、类型转换
E.MODE:表示非终结符E的类型信息。 例:X:=X+I*J (Xi,I,J,T1) (itr,T1,_,T2) (+r,Y,T2,T3) (:=,T3,_,X)
6数组元素的引用
一、地址的计算 二、数组元素引用的中间代码。
间接三元式
用一张间接码表辅以三元式表,表示中间代码。
例:X:=(A+B)*C
Y:=D^(A+B)
间接码表
三元式表
(1)
op arg1 arg2
(2)
(1) + A
B
(3)
(2) * (1) C
(1)
(3) := x
(2)
(4)
(4) ^ D
(1)
(5)
(5) := Y
(4)
间接三元式
1 语法制导定义的形式有如下形式:
b = f(c1, c2, …, ck),两种可能情况 b为A的综合属性,c1, c2, …, ck为A、中语法符号
第七章_语法制导翻译和中间代码生成4.0
如e1和e2的树为T1和T2,那么,e1+e2、e1*e2 和-e1的树分别为:
+ T1 T2 T1 * T2 T1 -
A*(B+C)/D
E E * E E E A * ( E B + E B C ) / D C A + D /
规约过程
树
(1)E E(1) OP E(2) (2)E(E(1))
词法分析和语法分析之后的中间代码生成, 是编译第三阶段的工作。本章介绍几种典型 的中间代码形式,以及产生它的算法。 中间代码的形式很多,如逆波兰记号、树 形表示、三元式、四元式。他们都是介于 单词流与目标指令之间的“中间产品”。
目前还不存在一种广 泛接受的方式来描述 为典型程序语言产生 中间代码所需的的动 作。原因是代码生成 依赖于对语义的解释, 而语义的刻划的形式 化系统尚未诞生。
{E.CODE:= E(1).CODE||E(2).CODE||op}/{print op}
E (E(1)) E id { E.CODE := E(1).CODE} /{} { E.CODE := id} /{print id}
E E(1)op E(2)
{E.CODE:= E(1).CODE||E(2).CODE||op}/{print op} E (E(1)) { E.CODE := E(1).CODE} /{} { E.CODE := id} /{print id}
概念 在语法分析过程中,随着分析的步步进展,根 据每个产生式所对应的语义子程序(语义动作) 进行翻译(产生中间代码)的办法。
标记说明
描述语义动作时,需要赋予每个文法符号X(终结符或者 非终结符)以种种不同方面的值,如X.TYPE(类型), X.VAL(值)等。 一个产生式中同一符号多次出现,用上角标来区分。
编译原理:语法制导翻译和中间代码生成
中间代码生成的常用方法
三地址码
使用类似于三元表达式的形式 来表示指令,使得生成的代码 更加简洁和高效。
间接中间代码
通过引入临时变量和临时操作 符的方式,将复杂的表达式转 化为更简单的形式。
基于栈的代码生成
将表达式的计算过程用栈来组 织,以实现表达式的计算和结 果的存储。
中间代码表示的形式和结构
符号表达式
编译原理:语法制导翻译 和中间代码生成
在编译原理中,语法制导翻译和中间代码生成是至关重要的步骤。本次演讲 将深入探讨其基本概念、步骤、目的以及常用方法等内容。
语法制导翻译的基本概念
语法制导翻译是基于文法规则和语义分析,将源程序转化为目标程序的过程。它利用文法规则来进行翻译和转 换,以实现对源程序的解释和执行。
使用符号来表示变量、常量和操 作符等,用于描述程序的特定语 义。
抽象语法树
以树的形式组织代码的结构,表 示程序在语法和语义上的结构。
四元式
使用四元组来表示中间代码的指 令和操作数,以便进行翻译和执 行。
中间代码生成的优化技术
1 常量折叠
对于常量表达式,将其直 接计算为常量的值,以减 少运行时的开销。
语法制导翻译的步骤和原理
1
语法分析
通过词法分析和语法分析,将源程序转化为语法树。
2
ห้องสมุดไป่ตู้语义分析
在语法树的基础上,进行类型检查、语义检测和符号表管理。
3
翻译
根据语法树和语义动作,生成目标代码。
中间代码生成的作用和目的
中间代码生成是将源代码转化为一种介于源代码和目标代码之间的中间形式,用于承载程序的执行。 它提供了优化和跨平台的能力,使编译器的输出能够在不同体系结构上正常运行。
编译第七章语法制导翻译_OK
{PRINT E ●VAL}
• (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}
• (3)E (E(1)) {E●VAL=E(1)●VAL}
• (4)E i
{E●VAL=LEXVAL}
语义子程序
• (0)S’ E
{PRINT VAL[TOP]}
• (1)E E(1) +E(2) {VAL[TOP]=VAL[TOP]+VAL[TOP+2]}
• (2)E E(1) * E(2) {VAL[TOP]=VAL[TOP]*VAL[TOP+2]}
• (3)E (E(1)) {VAL[TOP]=[TOP+1]}
语义子程序
• (1)A i=E {GEN(=,E●PLACE,_,ENTRY(i)}
• (2)E -E(1) {T=NEWTEMP;
• ----
GEN(@,E(1)●PLACE,_,T);
• ----
E●PLACE=T}
• (3)E E(1)*E(2) {T=NEWTEMP;
•
GEN(*,E(1)●PLACE,E(2)●PLACE,T);
• 2、实例:对布尔式X+Y>Z∨A∧( B∨C) 进行翻译:
SYM栈
i i= i=i=-i i=-E i=E i=E* i=E*( i=E*(i i=E*(E
PLACE栈
---------B --T1 --T1--T1---T1--C --T1--C
生成四元式
(@,B,-,T1)
❖21
语法制导翻译及中间代码生成
5.1 引言(续)
存在一种称为语法制导翻译的模式,这种模式实际上是对前后文无关文法的一种扩充。
定义 对每个产生式p:X0→X1X2…Xn ,设属性定义性出现的集合为
⒊ Expr→Term Expr’
所有这样这的有种向边模构成式的集既合D把T(T)语,称法为树分T上的析依赖与关系语。义处理分开,又令其平行
属性依赖关系
各个文法符号的属性之间,可能存在某种依赖关系,这 种依赖关系可用属性规则(语义规则)定义。
定义 设p:X0→X1X2…Xn是文法G的一个产生式,则与p
相关联的属性规则集
R(p)={Xi.a=f(Xk1.ak1,…,Xkm.akm)|Xi.a∈A(Xi)}
定义了该产生式所涉及的文法符号之属性的求值规则, 它表示:Xi的a属性是由的Xk1的ak1属性,…,的Xkm的 akm属性计算而得的。
语法制导翻译及中间代 码生成
5.1 引言
词法分析与语法分析仅仅是编译程序的一小部分。 在早期的一些编译程序中,是在语法分析的基础上根
据源程序中各语法成份的语义,直接产生机器语言或 汇编语言形式的目标代码。 现在的编译系统一般都将经过语法分析的源程序先翻 译为某种形式的中间语言代码,然后再将其翻译为目 标代码。 优点:
综合属性与继承属性
定义 对每个产生式p:X0→X1X2…Xn ,设属性定 义性出现的集合为
AF(p)={Xi.a|Xi.a=f(Xk1.ak1,…,Xkm.akm)∈ R(p),0≤kj≤n}
(1)对G中任意两个不同的文法符号X和Y而言,属性集合A(X)和A(Y)不相交,A(X) ∩A(Y)=
。 T→digit {T.
⒉在一个产生式中,每一个符号的各个综合属性的定义互不依赖;
第7讲 语法制导翻译和中间代码生成
(jnz,A,,0) (j , , ,102) (jnz,B, ,0) (j , , , 0)
查看语义子程序
③ 句 型:
执 行: 属 性:
E∨B∧C>D => E∨EB∧C>D
Sub1; NXQ=104 E∨.TC = 100;
( E∨.TC = 100; )
EB.TC = 102;
EB.FC = 103;
{ E .TC = E2.TC ;
E.FC = Merge( E∧.FC, E2.FC ) }
E.TC
E.FC
NXQ
100 101 102 103 104 105 106
(jnz,A,,104) (j , , ,102) (jnz,B, ,104) (j , , , 105) (j>,C,D,0) (j , , , 0)
如何确定一个布尔表达式的“真出口”和“假出口” 呢?
优 化 计 算
①A∧ B ②A∨ B ③ ~A
解释为: if A then B else FALSE 解释为: if A then TRUE else B 解释为: if A then FALSE else TRUE
① E→E1∧E2
E1的“真出口”就是E2的第一个四元式编号; E1的“假出 口”就是E的“假出口”; E2的“真/假出口”就是E的 “真/假出口”
⑤ 句 型: 执 行: 属 性:
E∨E∧C>D => E∨E∧ E2 Sub2; NXQ=106
E∨.TC = 100; E∧.FC = 103; E2.TC = 104; E2.FC = 105; E∧.FC = 103; )
( E∨.TC = 100;
(2) E → i1 rop i2 { E.TC = NXQ;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
四元式形式:
31
翻译 a:= -b+c*d
t1:=uminus b
S a := E
t2:=c*d t3:=t1+t2 a:=t3
E1 - E 11
b
+ E 21
c
E2 * E 22
d
32
类型转换
如:X := Y + I * J,X,Y为实型,I,J为整型, 则相应的四元式序列应为: (*i , I , J , T1 ) ( itr , T1 , _ , T2 ) ( +r , Y , T2 , T3 ) ( := , T3 , _ , X )
间接三元式
用一张间接码表辅以三元式表的办法 来表示中间代码。 例:X:=(A+B)*C Y:=D↑(A+B) 三元式表 间接码表 (1) ( + , A , B ) (1) (2) ( * , (1) , C ) (2) (3) (:= , X , (2) ) (3) (4) ( ↑ , D , (1) ) (1) (5) (:= , Y , (4) ) (4) (5)
28
四元式
1. 四元式对中间结果的引用必须通过 给定的名字,而三元式是通过产生中间结 果的三元式编号。四元式之间的联系是通 过临时变量实现的。 2. 四元式出现顺序与原表达式计算顺 序一致。(同三元式)
29
§ 7.6
简单赋值 语句的翻译
30
文法:S→i:=E
E→E+E|E*E|-E|(E)|id
44
if a<b or c<d and e>f then S1 else S2
(1) if a<b goto (7) 转移至E.true,即S1的四元式 (2) goto (3) (3) if c<d goto (5) (4) goto (p+1) 转移至E.false,即S2的四元式 (5) if e>f goto (7) 转移至E.true (6) goto (p+1) 转移至E.false (7) (关于S1的四元式) E.true ………… (p) goto (q) (p+1) (关于S2的四元式) E.false ………… (q)
9
如何实现这种翻译
至此不难明白,语法制导翻译的关键 是为每个产生式写相应的语义子程序。 例子中的print产生式序号这种语义子 程序是为了输出数字串而写的语义子程序。 所以一个语义子程序描述了一个产生式对 应的翻译工作。 这些工作有:改变编译程序某些变量 的值、查填各种符号表、发现并报告源程 序错误、产生中间代码。 10
语义子程序的一般形式
语义子程序写在该产生式后面的花括号内: (1) X… { 语义子程序1 } (2) Y… { 语义子程序2 } (3) AXY { 语义子程序3 }
11
§ 7.1 属性文法
12
属性文法与语法制导翻译的关系
对于某个压缩了的文法,当把每个文法符 号和一组属性相关联,并把产生式附加以 语义规则的时候,就得到属性文法。 语法制导的翻译过程:由于属性文法的规 则和产生式是一一对应的关系。所以,由 属性文法确定的语义分析可以在语法分析 的过程中进行。这个过程成为语法制导的 翻译。
15
属性文法的例子
简单算术表达式求值的语义描述
产生式 L E E T T F F E E1+T T T1 * F F (E) digit 语 义 规 则
Print(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
16
§ 7.2
自底向上语 法制导翻译 概述
17
表达式为3*5+4,则语义动作打印数值19
L
E.val=19
E.val=15 + T.val=15 F.val=4 F.val=5 * digit.lexval=5 digit.lexval=4 T.val=4
T.val=3
F.val=3
digit.lexval=3
§ 7.7
控制流语句 的翻译
41
if语句的翻译
if E then S1 else S2,其中E为布尔式
E的代码序列
真出口 假出口
S1的代码序列
S2的代码序列
42
E 的代码
E.true: E.false: S1的代码
E.true E.false
goto out
S2的代码 out:
43
例子
if A∨ B < D then S1 else S2 (1) ( jnz , A , _ , 5 ) 真出口 (2) ( j , _ , _ , 3 ) 不是最优翻译 (3) ( j< , B , D , 5 ) (4) ( j , _ , _ , p+1 ) 假出口 (5) ( 关于S1的四元式序列 ) ………… (p) ( j , _ , _ , q ) (p+1) ( 关于S2的四元式序列 ) ………… (q)
21
上述三种方法的比较
三种方法的共同点:
1. 运算量个数不变,顺序也不变。 2. 运算符个数不变。
逆波兰式的优点:
1. 是一个无括号表达式。 2. 逆波兰式的运算符出现的顺序就是原表达 式的运算顺序,因而计算方便。
22
举例
1. (a+b)*(c+d) ab+cd+* 2. 赋值语句的后缀式 A:=B+C ABC+:=
第7章
语法制导翻译 和中间代码 生成
❤❤
1
经过词法分析、语法分析后,源程序 在静态结构上的正确性得到了保证,编译 程序接着要对源程序进行静态语义检查和 翻译。 语义检查:类型检查、控制流检查、 一致性检查等。 翻译:源程序→中间代码
2
本章主要内容
1. 属性文法 2. 语法制导翻译概念 3. 中间代码的几种形式 4. 几个语句的翻译:如赋值语句、条件语句等。
26
树形表示
表达式的树形表示: 1. 简单变量或常数的树就是该变量或常数自身。 2. 如果表达式e1和e2的树分别为T1和T2,那 么e1+e2,e1*e2,-e1的树分别为: + * T1 T2 T1 T2 T1 树形表示是三元式的翻版。
27
四元式
组成: OP ,ARG1 ,ARG2 ,RESULT 如:a:=b*c+b*d的四元式为: (1) ( * , b , c , t1 ) (2) ( * , b , d , t2 ) (3) ( + , t1 , t2 , t3 ) (4) ( := , t3 , _ , a ) 更易理解的形式 t1 := b * c t2 := b * d t3 := t1 + t2 a : = t3
45
控制语句中的回填技术
上例中的一些转移地址并不能不产生 这些四元式的同时得知。 也就是说,一个布尔式的真假出口往 往不能在产生四元式的同时就确定。 因此,要回填这些地址。
13
属性文法
属性文法是一个三元组:A=(G,V,F),其中 G:是一个上下文无关文法。 V:属性的有穷集,每个属性与文法的一个终 结符或非终结符相连,这些属性代表与文 法符号相关信息,如它的类型、值、代码 序列、符号表内容等等 .属性与变量一样, 可以进行计算和传递。
14
F:关于属性的属性断言或一组属性的计 算规则(称为语义规则) 。 断言或语义 规则与一个产生式相联,只引用该产生 式左端或右端的终结符或非终结符相 联的属性。
A ∨ B→if A then true else B A ∧B→if A then B else false ┐ A →if A then false else true
这种翻译法涉及到如何翻译if-then-else 的问题,将在下面具体讨论。
39
作为条件转移的E的翻译
仅把E翻译成仅含条件真转和无条件转的 四元式。 (jnz , A , _ , p): 若A为真,转向第p个四元式 (jθ,A ,B , p): 若AθB为真,转向第p个四元式 (j , _ , _ , p): 无条件转向第p个四元式 40
37
例子
1. a or b and not c (1) t1:=not c (2) t2:=b and t1 (3) t3:=a or t2 2. A∨B∧C=D (=, C, D, T1) (∧, B, T1, T2) (∨, A, T2, T3)
38
2. 采取优化措施,只计算部分表达式。 如A or B,如果A为1,B就无需计算; 如A and B,如果A为0,则B就无需计算。
不难证明该符号串是文法的合法句子。 按照这个句子向文法开始符号E的归约次 序,且每当归约时调用该句柄的产生式所 对应的语义子程序,便可得到相应的数字 串:64264154632。
5
这个例子表明: (i+i)*i
64264154632
这是一种变换,而变换的规则是每当 归约时调用相应的语义子程序。无疑这个 例子是翻译的一个十分简单的模型。
6
翻译要解决的问题
1. 翻译成什么样的代码? 2. 什么时候实现这种变换(翻译)? 3. 如何实现这种翻译?
7
翻译成什么样的代码
按照相应语义规则产生一种介于源语 言与目标代码之间的一种代码(中间代码), 它不依赖于机器但又便于产生依赖于机器 的目标代码。 中间代码可用多种方式表示,常见的 有:逆波兰表示法、树形表示法、三元式、 四元式等。