4.5章语法制导翻译和中间代码生成

合集下载

语法制导翻译与生成中间代码(附代码)

语法制导翻译与生成中间代码(附代码)
ip++; return shuru[ip-1]; } else if(shuru[ip]=="(") { ip++; string result=biaodashi(); if(shuru[ip]==")")ip++; else puts("Lack)"); return result; } else puts("error"); return ""; }
/*****处理表达式*****/ string expression_1(string &op) {
if(shuru[ip]=="*"||shuru[ip]=="/")
{ op=shuru[ip]; ip++; string arg1=element(); string op_1="",result=link("t",tID++); string arg2=expression_1(op_1); if(op_1=="")op_1="="; if(arg2=="") cout<<address++<<":"<<" "<<result<<" =
//while 的语义子程序
condition(L2,next); } else {
puts("Lack(");return; } if(shuru[ip]==")") ip++; else {

语法制导翻译与中间代码生成

语法制导翻译与中间代码生成

(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

语法制导翻译和中间代码生成【共50张PPT】

语法制导翻译和中间代码生成【共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
+
叶子结点代表运算量, 非叶子结点代表运算符

计算机系统结构之语法制导翻译和中间代码生成(23页)

计算机系统结构之语法制导翻译和中间代码生成(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、中语法符号

编译原理:语法制导翻译和中间代码生成

编译原理:语法制导翻译和中间代码生成

中间代码生成的常用方法
三地址码
使用类似于三元表达式的形式 来表示指令,使得生成的代码 更加简洁和高效。
间接中间代码
通过引入临时变量和临时操作 符的方式,将复杂的表达式转 化为更简单的形式。
基于栈的代码生成
将表达式的计算过程用栈来组 织,以实现表达式的计算和结 果的存储。
中间代码表示的形式和结构
符号表达式
编译原理:语法制导翻译 和中间代码生成
在编译原理中,语法制导翻译和中间代码生成是至关重要的步骤。本次演讲 将深入探讨其基本概念、步骤、目的以及常用方法等内容。
语法制导翻译的基本概念
语法制导翻译是基于文法规则和语义分析,将源程序转化为目标程序的过程。它利用文法规则来进行翻译和转 换,以实现对源程序的解释和执行。
使用符号来表示变量、常量和操 作符等,用于描述程序的特定语 义。
抽象语法树
以树的形式组织代码的结构,表 示程序在语法和语义上的结构。
四元式
使用四元组来表示中间代码的指 令和操作数,以便进行翻译和执 行。
中间代码生成的优化技术
1 常量折叠
对于常量表达式,将其直 接计算为常量的值,以减 少运行时的开销。
语法制导翻译的步骤和原理
1
语法分析
通过词法分析和语法分析,将源程序转化为语法树。
2
ห้องสมุดไป่ตู้语义分析
在语法树的基础上,进行类型检查、语义检测和符号表管理。
3
翻译
根据语法树和语义动作,生成目标代码。
中间代码生成的作用和目的
中间代码生成是将源代码转化为一种介于源代码和目标代码之间的中间形式,用于承载程序的执行。 它提供了优化和跨平台的能力,使编译器的输出能够在不同体系结构上正常运行。

编译原理第5章语法制导翻译及中间代码生成

编译原理第5章语法制导翻译及中间代码生成

03
生成过程
在编译器中,源代码首先被解析成抽象语法树(Abstract Syntax Tree,
ቤተ መጻሕፍቲ ባይዱ
AST),然后通过遍历AST生成三地址代码。在生成过程中,需要考虑
变量的生命周期、作用域和数据类型等因素。
循环优化
定义
循环优化是指在生成中间代码的 过程中,对循环结构进行优化以 提高程序执行效率的过程。
中间代码优化
对中间代码进行优化,以提高生成的 目标代码的效率。
三地址代码
01
定义
三地址代码是一种中间代码形式,它由一系列运算符和操作数组成,用
于表示程序中的控制流程和数据流。
02
特点
三地址代码具有高度规范化、结构清晰的特点,易于理解和生成。它通
常采用三地址表达式的形式,包括变量、常量、运算符和括号等元素。
解析过程
从文法的终结符号出发,逐步构建语法树或 抽象语法树,直到最终生成目标代码。
优点
能够充分利用语义信息,减少冗余操作,提高解析 效率。
缺点
实现较为复杂,需要构建语法树或抽象语法 树,且对于某些复杂的文法结构,可能存在 无法生成目标代码的情况。
递归下降分析法
解析过程
将文法规则分解为一系列子句,每个子句对应一个递归函数。根据输入的源代 码字符串,从根节点开始递归调用这些函数,直到识别出一个完整的语句或表 达式。
常见优化技术
常见的循环优化技术包括循环展开、 循环合并、循环嵌套、循环不变计算 外提等技术。这些技术可以减少循环 次数、提高循环体内部的计算速度, 从而提升程序的执行效率。
实现方式
循环优化通常在生成三地址代码 后进行,通过对三地址代码进行 分析和变换实现。优化过程中需 要考虑程序的控制流和数据流, 以保持程序的正确性。

语法制导翻译及中间代码生成

语法制导翻译及中间代码生成

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.
⒉在一个产生式中,每一个符号的各个综合属性的定义互不依赖;

编译原理-语法制导翻译技术与中间代码生成共120页文档

编译原理-语法制导翻译技术与中间代码生成共120页文档
并将运算对象写在前面,运算符写在后 面,因而又称为后缀式。
例如: 中缀表达式 逆波兰式
a*b
ab*
(a+b)*(c+d) ab+cd+*
5.4.1 逆波兰式
语义动作 (语义子程序) 描述了一个产生式所对应的翻译工作。
语义动作不仅指明了该产生式所产 生符号串的意义,而且还根据这种意 义规定了对应的加工动作(如查填各 类表格、改变编译程序的某些变量的 值、打印各种错误信息及生成中间代 码等),从而完成预定的翻译工作。
5.3 语法制导翻译概述
语法制导翻译法 在语法分析过程中,依随分析的过
5.3 语法制导翻译概述
2. 为上述文法构造LR分析表如下图:

ACTION
态 + digit * (
)$
0 1
S4
S3 S5 S2
acc
2
S3
S2
3 4
r4
S3
r4
S2 r4
r4
5
S3
S2
6 7
Sr14
8 9
rr32
S5 Sr25
Sr19
r1
r2 r2
r3
r3 r3
GOTO E 1
6
7 8
5.3 语法制导翻译概述
程,根据每个产生式所对应的语义子 程序(语义规则描述的语义处理的加工 动作)进行翻译的方法。
5.3 语法制导翻译概述
例如,设有简单算术表{7达+8式*5的,3文+8法,6*:5,…}
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} 3.E → (E(1)) {E.val =E(1).val} 4.E → digit {E.val =Lex.digit}
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

GEN(OP,ARG1,ARG2,RESULT)过程:产生一 个四元式,并填入四元式序列表。 3、需要的语义变量 E•PLACE:与非终结符E相联系的语义变量 值为某变量的符号表入口地址或临时变量序号。
它与文法的非终结符相联,分析过程需要就建立, 不需要就消亡。
产生式 (1)A i=E (2)E -E (1)

1、定义各非终结符的类型信息
2、对运算量进行类型转换
例如:X=Y+I*J,其中X、Y是实型, I、J是整型。其四元式为: (*i,I,J,T1) (itr,T1,_,T2) (+r,Y , T2,T3) (=,T3,_,X)
注: 1)对运算符也要指出相应的类型(运算符上 加角标),说明是定点还是浮点运算。 2)由于非终结符E的语义值有E•PLACE 和 E•MODE 两个,这两者都要保存在语义栈中。 3)在运算量的类型较多的情况下,需要仔细 推敲语义规则,否则语义子程序会变得累赘不堪。
第四、五章
语法制导翻译和中间代码生成
概述

语法分析之后,编译的任务是由已识别为正 确的源程序生成一组规格一致,便于计算机加工 的指令形式。
一、中间代码生成方法
语法制导翻译,属性文法制导翻译
中间代码:不是机器语言,便于生成机器语 言,便于代码优化。
中间代码的形式:
逆波兰式 树形表示法 三元式 四元式:最常用的形式
三、布尔表达式文法:
G(B): E E∧E | E∨E | ┐E | (E) | i | Ea rop Ea i为布尔变量或常量; Ea为算术表达式。
注: 1)此文法为二义文法,一般布尔算符的优先 顺序为: ┐,∧,∨; 且∧,∨服从左结合律; 关系运算优先级别高于布尔运算。 2)由于布尔表达式有两种用途,所以有两种 不同的翻译方法。
2、实例:对布尔式X+Y>Z∨A∧(┐B∨C)进行翻译: 解:语法制导得翻译是在语法分析的过程中进行的,若利
用G(B)文法的LR分析表对上句进行LR分析,在其过程中 进行语义分析;则得到的四元式序列是:



(+,X,Y,T1) ;E+E进行归约,识别了算术运算 (>, T1,Z, T2) ; E >E进行归约,识别了关系运算 (┐,B,_, T3) ; ┐E归约 (∨, T3,C, T4) ; E∨E进行归约 (∧,A, T4,T5) ; E∧E进行归约 (∨, T2, T5, T6) ; E∨E进行归约
注:1、上面的1~4式是由布尔式“A∨B<D”产生的 中间代码,但它们和逻辑演算中的翻译不同,消 除了布尔运算,变成转移四元式。 2、翻译时每个布尔量是译为两个二元式的,但 有些并不必要,所以可以在后续阶段进行优化。 3、在自下而上的分析过程中,一个布尔式的真 假出口的转向序号不可能在产生转移四元式时就 填上。此时将待填的转移四元式暂时保留,等出 口明朗了,在进行回填。

二、翻译方法 1、属性文法制导翻译 将文法的终结符、非终结符及动作 符号附加以语义参数,这些参数称作为文法符号 的属性,从而构成属性文法。 注:1)在属性文法中是利用各种属性作为语义动作 之间的通信介质 2)一个文法符号可以和多个语义参数相关联
3)属性可分为两种:继承属性和综合属性。继承属 性值的计算规则是自上而下——产生式右部符号 的某些值是根据其左部符号的属性和右部其它符 号的某些属性计算而得。 4)综合属性值的计算规则是自下而上——产生式左 部符号的某些属性值是根据其右部符号的属性和 左部其它符号的某些属性计算而得。 5)属性翻译的依据是属性规则。 6)属性规则嵌入在产生式右部适当位置。
3、对文法的改写 原G(B): E E∧E | E∨E | ┐E | (E) | i | Ea rop Ea 由于产生式E E(1)∨E(2)在E(1)i归约时翻译 成两个四元式,一个表示“真”转移,一个表示 “假”转移; “假”转移要转到“∨”号后,即 读完“∨”就可以回填假出口,所以可以进行产生 式的改写。 E E(1)∨E(2)改写为E E0E(2) , E0 E(1)∨ E E(1)∧E(2)改写为E EAE(2) , EA E(1)∧
注: 1、符号栈是为了介绍才列出的,实际上并不存在。 2、由于语义分析是在语法分析的过程中进行的, 所以状态栈实际上是需要的,这里没有写出来。 3、这个分析过程是针对整型变量做的。实际上 在一个表达式中,可能出现各种不同类型的变量 或常量,所以,编译程序要么拒绝接受某种混合 运算,要么能产生有关类型转换的指令。

(jθ,A1, A2,P)
If A1θA2 then goto P

(j, _, _ ,P)
Goto P
注:这些四元式都是转移四元式,其中P为出口的 四元式序号。与E的真假值相对应的分别为“真 出口”和“假出口”两类四元式。
例如:把语句if A∨B<D then S1 else S2 翻译成 四元式 解: (1)(jnz,A,_,(5)) ;真出口;若A为真,执行S1代码 (2)(j,__,(3)) ;若A为假,看∨右边的表达式值 (3)(j<,B,D,(5)) ;真出口; ∨右边的表达式值为真 (4)(j,_,_,(P+1)) ;假出口; ∨右边的表达式值为假 (5) S1语句的第一个四元式 …… (P)(j,_,_,(q)) ;执行完S1代码后跳过S2代码段 (p+1) S2语句的第一个四元式 …… (q)此语句的后继语句
布尔表达式的翻译
一、布尔表达式在程序设计语言中的作用 用作控制语句中的条件表达式; 用于逻辑赋值语句中布尔表达式演算。 二、布尔表达式的组成



由布尔算符作用于布尔变量(或常量)或关系表达式 而形成的。 布尔算符:∧,∨,┐ 关系表达式的形式: E (1) rop E(2) ,其中rop是关系 运算符(如<,<=,=,<>,>=,>), E (1) 和E(2)是算术表达 式
四、常见的中间代码形式 1、Байду номын сангаас元式形式: (Operator,Operand1,Operand2,Result) 注: 1) Operand1,Operand2,Result 可能是用户自定 义的变量,也可能是编译时引进的变量。 这里 Operator是双目运算符,若只有一个运算量,则 是单目运算符。
例如:
产生式 语义子程序 (0)S` E {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 } 注:LEXVAL指的是词法分析送来的机内二进制整数
语法制导翻译适用于多种语法分析。
语法制导翻译种类 1、自上而下语法制导翻译:对每个文法符号 配以语义动作。 2、自下而上语法制导翻译:我们主要讨论LR 语法制导翻译。
三、语义子程序 1、作用 用来描述一个产生式所对应的翻译工作。 如:改变某些变量的值;查填各种符号表;发 现并报告源程序错误;产生中间代码等。 注:这些翻译工作很大程度上决定了要产生什么形 式的中间代码。
四、布尔表达式在逻辑演算中的翻译 1、语义子程序

由于布尔表达式演算与算术表达式计算非常类似, 可以仿照算术表达式的翻译方法,为每个产生式 写出语义子程序:
产生式 语义子程序 (1)EEa(1) rop Ea(2) {T=NEWTEMP; GEN(rop, Ea(1)•PLACE , Ea(2)•PLACE ,T); E•PLACE =T } (2)E E (1) bop E(2) {T=NEWTEMP; GEN(bop, Ea(1)•PLACE , Ea(2)•PLACE ,T); E•PLACE =T } (3)E ┐E (1) {T=NEWTEMP; GEN(┐, E(1)•PLACE , _ ,T); E•PLACE =T } (4)E (E (1)) {E•PLACE =E(1)•PLACE } (5)E i {E•PLACE = ENTRY(i)}
2、语法制导翻译 在语法分析的基础上进行边分析边翻译。 注:1)语法制导翻译时会根据文法产生式右部符号 串的含义,进行翻译,翻译的结果是生成相应中 间代码。 2)语法制导翻译的依据是语义子程序。 3)具体做法:为每个产生式配置一个语义子程 序,当语法分析进行归约或推导时,调用语义子 程序,完成一部分翻译任务。 4)语法分析完成,翻译工作也告结束。
二、类型转换

对于表达式文法中的i既是实型又可以是整型。
对这种混合运算,我们要先把整型量转化为实型 量,就需要为每个非终结符的语义值添加类型信 息,用E•MODE表示非终结符E的类型信息。
产生式E E (1) op E(2)的语义动作中要加入关 于E•MODE的语义规则的定义: {IF E (1)•MODE=int AND E (2)•MODE=int THEN E•MODE=int ELSE E •MODE=r}
语义子程序 {GEN(=, E•PLACE ,_,ENTRY(i)} {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); E•PLACE =T } (4)E E (1) + E(2) {T=NEWTEMP; GEN(+, E(1)•PLACE , E(2)•PLACE ,T); E•PLACE =T } (5)E (E (1)) {E•PLACE =E(1)•PLACE } (6)E i {E•PLACE = ENTRY(i)}
相关文档
最新文档