第八章语法制导翻译
编译原理第八章—语法制导翻译
属性文法
属性的抽象表示 例如:E.val(值) E.type(类型) E.code(代码序列) E.place(存储空间)
属性文法
E
T
文法G:
+
T
ET1+T2|T1 or T2 Tnum|true|false
3
4
ET1+T2 {T1.t=int AND T2.t=int} ET1orT2{ T1.t=bool AND T2.t=bool} E{T1.t=T2.t} Tnum {T.t=int} T{T1.t=int} + Ttrue {T.t=bool} T{T2.t=int} Tfalse {T.t=bool}
语法分析
语义分析 中间代码生成 中间代码 语 义 处 理
后 端 处 理
代码生成
汇编代码
语义处理
源语言程序 词法分析 前 端 处 理 语法分析 语义分析 语 义 处 理 后 端 处 理
代码生成
汇编代码
语义分析基础
语义处理的实现(第八章)
属性文法:描述语义规则。 语法制导翻译:在语法分析的同时,执行语义规则描述 的动作: • 检查静态语义 • 生成中间代码/目标代码 为语义分析提供类型、作用域等信息。 为代码生成提供类型、作用域、存储类别、存储(相对 )位置等信息。
语义分析基础
语法与语义的关系
语法是指语言的结构、即语言的“样子”; 语义是指附着于语言结构上的实际含意 ,即语言的“ 意义”。 语义不能离开语法独立存在; 语义远比语法复杂; 同一语言结构可以包含多种含意,不同语言结构表示相 同含意; 语法与语义之间没有明确的界线。
第八章 语法制导翻译和中间代码生成
目标代码
5
语义分析
语义分析的任务:在词法分析和语法分析的基础上,
盛 威 网 : 专 业 的 计 算 机 学 习 网 站
分析所写源程序的含义,在理解含义的基础上为生成 相应的目标代码作好准备或直接生成目标代码。 1)静态语义检查 例:类型检查、运算、维数、越界 2)语义翻译(具体的动作) 例:语句的翻译(中间代码或目标代码生成)
16
简化定义
对每个产生式,设属性定义性出现的集合为
盛 威 网 : 专 业 的 计 算 机 学 习 网 站
若Xi是产生式左部非终结符(即i=0),则称属性 Xi.a是综合属性(Synthesized Attributes) 若Xi出现在产生式的右部(即i≠0 ),则称Xi.a是 继承属性(Inherited Attributes)
2
教学内容
第一节
盛 威 网 : 专 业 的 计 算 机 学 习 网 站
属性文法 语法制导翻译概论 中间代码的形式 简单赋值语句的翻译 布尔表达式的翻译 控制语句的翻译 说明语句的翻译 数组和结构的翻译
3
第二节 第三节 第四节 第五节 第六节 第七节 第八节
盛 威 网 : 专 业 的 计 算 机 学 习 网 站
2.组成
语法树上的每个节点的所有属性在依赖图上各有 一个节点,如果属性y依赖于属性x,那么从x的节点 到y的节点有一条有向边。 【注】如果语法树一节点的属性y依赖某个节点的属 性x,那么属性y的语义产生式的计算必须在属性x的 语义产生式的计算之后进行。 24
盛 威 网 : 专 业 的 计 算 机 学 习 网 站
13
盛 威 网 : 专 业 的 计 算 机 学 习 网 站
3、文法规则number→number digit ,表明文法的个 数不止一个。我们必须表示出这个文法规则左边符 号的值和右边符号的值之间的关系。通过使用下标 进行区分,将文法写成如下形式: number1→number2 digit
编译原理语法制导翻译与语法制导定义的应用
编译原理语法制导翻译与语法制导定义的应用编译原理是计算机科学中的一门重要课程,它研究了如何将高级程序语言翻译成为机器语言,以便计算机能够执行。
而语法制导翻译与语法制导定义是编译原理中的一个关键概念,它们在建立语法规则和语义规则方面发挥着重要的作用。
一、语法制导翻译的概述语法制导翻译是指在语法分析的基础上,根据具体的语法规则和语义规则,将源语言翻译成目标语言的过程。
它结合了语法分析和语义分析的特点,能够在代码生成和优化等方面发挥重要作用。
在语法制导翻译中,语法规则描述了源语言的各种语法结构,而语义规则定义了这些语法结构的具体含义和运行过程。
通过分析源语言的语法结构,并依照语法规则和语义规则进行翻译,可以将源程序转换为目标程序。
二、语法制导定义的作用语法制导定义是对语法和语义规则的一种形式化描述,它能够准确地定义语法结构和语义含义之间的关系。
语法制导定义不仅可以用于语法分析的过程中,在代码生成和优化等环节中也有广泛的应用。
在语法分析的过程中,语法制导定义可以帮助我们构建语法树,并为每个语法节点添加语义动作。
这些语义动作可以在语法分析的同时进行符号表的建立、类型检查等操作,从而提高编译器的效率和性能。
在代码生成的过程中,语法制导定义可以为每个语法结构规定相应的代码生成规则。
通过语法制导定义,编译器可以根据源程序的语法结构,在目标程序中生成相应的汇编指令或机器指令,从而实现源程序到目标程序的转换。
三、语法制导翻译与语法制导定义的应用实例为了更好地理解语法制导翻译与语法制导定义的应用,以下以一段简单的代码为例进行说明。
假设我们需要将下面这段简单的表达式翻译成C语言的表达式:a =b +c * d首先,我们使用语法制导定义确定这个表达式的语法规则和语义规则,例如:expr -> ID = expr + exprexpr -> IDexpr -> ID = expr * exprexpr -> NUM然后,通过语法分析的过程,我们可以建立相应的语法树,并根据语法制导定义为每个语法节点添加相应的语义动作。
编译原理中的语法制导翻译与优化
编译原理中的语法制导翻译与优化编译原理是计算机科学中的一个重要分支,它研究如何将高级程序设计语言翻译成计算机能够理解和执行的低级代码。
语法制导翻译是编译原理中的一种重要技术,它能够根据语法规则和语法制导定义来进行代码翻译和优化。
一、语法制导翻译的基本概念语法制导翻译是指在语法分析的过程中,根据给定的语法规则,通过对语法制导定义的语义动作进行语法制导翻译的过程。
它是一种基于语法规则和语义规则的静态翻译方法,能够实现程序设计语言到计算机执行代码的转换。
语法规则是描述程序语法结构的形式化定义,其采用文法表示。
在编译原理中,通常使用上下文无关文法(CFG)来描述程序的语法结构。
语义规则则是在语法规则的基础上,为每个语法产生式定义语义动作,从而完成代码翻译和优化过程。
二、语法制导翻译的实现方式语法制导翻译的实现方式主要有两种:自上而下翻译和自下而上翻译。
自上而下翻译是从语法分析树的根节点开始,按照规定的顺序依次遍历所有节点并进行语法制导翻译;自下而上翻译则是从语法分析树的叶子节点开始,按照规定的顺序逐步向上进行语法制导翻译。
在自上而下翻译中,常用的实现方式有递归下降法和预测分析法。
递归下降法是一种基于递归的语法制导翻译方法,通过递归地调用语法规则的定义来完成翻译过程。
预测分析法则是一种基于预测分析表的语法制导翻译方法,通过预测输入符号串的下一个符号来选择适当的语法规则进行翻译。
自下而上翻译则主要使用LR分析法和LALR分析法。
LR分析法是一种基于LR分析表的语法制导翻译方法,它能够自下而上地对输入符号串进行规约操作。
LALR分析法则是一种基于LALR分析表的语法制导翻译方法,它是对LR分析法的一种改进,能够提高分析效率并减小分析表的规模。
三、语法制导翻译的优化语法制导翻译不仅可以实现基本的代码翻译功能,还可以进行优化操作以提高代码执行效率。
常见的语法制导翻译优化技术有如下几种:1. 常量折叠:将程序中的常量表达式计算出结果,并将计算结果直接替换原表达式,以减少运行时的计算量。
编译原理第八-章语法制导翻译
一种优化的三地址码形式,通过消除冗余和不必要的赋值操作,提高代码的执行效率。
目标代码生成
机器语言
将中间代码转换为机器语言,以便在特定的计算机硬件上执行。
指令选择
根据中间代码和目标机器的指令集,选择合适的指令进行目标代 码生成。
寄存器分配
为中间代码中的变量分配寄存器,以优化目标代码的执行效率。
03
02
语法制导翻译
根据源语言的语法规则,将源代码 逐步翻译为目标代码。
代码优化
在翻译完成后,对目标代码进行优 化,以提高执行效率。
04
递归下降翻译
语法分析
将源代码分解为一个个的子句或语句, 并确定每个子句或语句的类型。
中间代码生成
将处理后的子句或语句转换成中间代 码。
语义处理
根据子句或语句的类型,编写相应的 语义动作,处理每个子句或语句的语 义。
语法分析
根据语法规则,将词素或符号组合成一个个的语法结构,如表达式、语句等。
中间代码生成
将语法结构转换成中间代码,通常是一种更接近于机器语言的代码形式。
代码优化
对中间代码进行优化,以提高执行效率。
自顶向下翻译
01
目标语言的设计
首先设计目标语言的语法和语义, 然后编写相应的语义动作。
语义检查
在翻译过程中进行语义检查,确保 源代码的语义正确性。
代码优化
控制流优化
通过消除冗余的分支和循环,优化代码的控制流结构。
数据流优化
通过消除冗余的计算和数据传输,优化代码的数据流 路径。
死代码消除
删除在程序执行过程中永远不会被使用的代码,减少 程序的体积和提高执行效率。
第8讲 语法制导翻译_1
3*5+4n
副作用(Side effect)
语义规则
E.val=15 + T.val=4
print(E.val)
E.val = E1 .val + T.val E.val = T.val
T.val = T1val × F.val
T.val = F.val
T.val=15
F.val=4
T.val=3 * F.val=5 digit.lexval=4
如果一个SDD是S属性的,可以按照语法分析树节点的任何 自底向上顺序来计算它的各个属性值
S-属性定义可以在自底向上的语法分析过程中实现
L- 属 性 定 义
L-属性定义( 也称为L属性的SDD或L-SDD) 的 直观含义:在一个产生式所关联的各属性之间, 依赖图的边可以从左到右,但不能从右到左 ( 个SDD是L-属性定义,当且仅当它的每个属性要 么是一个综合属性,要么是满足如下条件的继承属 性:假设存在一个产生式A→X1X2…Xn,其右部符 号Xi (1 i n)的继承属性仅依赖于下列属性:
A的继承属性 产生式中Xi左边的符号 X1, X2, … , Xi-1 的属性 Xi本身的属性,但Xi 的全部属性不能在依赖图中形成环路
将每个产生式和一组语义规则相关联,用来计算 该产生式中各文法符号的属性值
文法符号的属性
综合属性 ( synthesized attribute) 继承属性 ( inherited attribute)
综 合 属 性 ( synthesized attribute)
在分析树结点 N上的非终结符A的综合属性只能通 过 N的子结点或 N本身的属性值来定义
两个概念
将语义规则同语法规则(产生式)联系起来要 涉及两个概念
第08章语法制导翻译和中间代码生成
常用的中间语言
• 三地址代码(四元式) 三地址代码(四元式) • 语法结构树(三元式) 语法结构树(三元式) • 后缀式
特点
• 形式简单、语义明确、便于翻译 形式简单、语义明确、 • 独立于目标语言
29
三元式和树形表示
• 每个三元式由三个部分组成,分别是:算符op, 每个三元式由三个部分组成,分别是:算符op, op 第一运算对象ARG1和第二运算对象ARG2 ARG1和第二运算对象ARG2。 第一运算对象ARG1和第二运算对象ARG2。运算 对象可能是源程序中的变量, 对象可能是源程序中的变量,也可能是某个三 元式的结果,用三元式的编号表示。 元式的结果,用三元式的编号表示。 • 表达式的树形表示很容易实现:简单变量或常 表达式的树形表示很容易实现: 数的树就是该变量或常数自身,如果表达式e1 数的树就是该变量或常数自身,如果表达式e1 e2的树分别为T1和T2,那么e1+e2 e1*e2, 的树分别为T1 e1+e2, 和e2的树分别为T1和T2,那么e1+e2,e1*e2, e1的树分别为 的树分别为: -e1的树分别为:
9
–lexval 是单词 digit 的属性 lexval
例8-3 3*5+4 的
语法树与属性计算
L Print(19) E.val=19
E.val=15 T.val=15 T.val=3 F.val=3 digit.lexval=3 *
+
T.val=4 F.ቤተ መጻሕፍቲ ባይዱal=4
F.val=5 dgit.lexval=5
• 用中间语言过渡的好处: 用中间语言过渡的好处:
–便于编译系统的实现、移植、代码优化 便于编译系统的实现、移植、 便于编译系统的实现
编译第8章
• 属性变量=属性表达式
1、属性文法定义
属性文法(attribute grammar)是一个三元 组:A=(G,V,F),其中 G:是一个上下文无关文法 V:有穷的属性集,每个属性与文法的一个终结符或非 终结符相连,这些属性代表与文法符号相关信息, 如它的类型、值、代码序列、符号表内容等等 .属 性与变量一样,可以进行计算和传递。属性加工 的过程即是语义处理的过程。 F:关于属性的属性断言或一组属性的计算规则(称为 语义规则) . 断言或语义规则与一个产生式相联,只 引用该产生式左端或右端的终结符或非终结符相 联的属性.
addtype
id3
addtype
例5-4:real id1,id2,id3 的分析树和属性计算
8.3 中间代码的形式
何谓中间代码: 源程序的一种内部表示,不依赖目标机的 结构,易于机械生成目标代码的中间表示。 为什麽要此阶段 逻辑结构清楚; 利于不同目标机上实现同一种语言; 利于进行与机器无关的优化; 这些内部形式也能用于解释;
• 语义处理
–例:变量的存储分配 –例:表达式的求值 –例:语句的翻译(中间代码的生成)
• 总目标:生成等价的中间代码
语义处理方法
• 对应每一个产生式编制一个语义子程序, 当一个产生式获得匹配时,调用相应的 语义子程序实现语义检查与翻译。 • 在产生式的右部的适当位置,插入相应 的语义动作,按照分析的进程,执行遇 到的语义动作。
8)若把语义子程序改成产生某种中间代 码的动作,就能在语法分析制导下,随 着分析的进展逐步生成中间代码。 9)若把语义子程序改成产生某种机器的 汇编语言指令,就能随着分析的进展逐 步生成某机器的汇编语言代码。
编译原理课后题答案【清华大学出版社】ch8
如果题目是 S::=L.L | L L::=LB | B B::=0 | 1 则写成: S`::=S {print(S.val);} S::=L1.L2 { S.val:=L1.val+L2.val/2L2.length ;} S::= L { S.val:=L.val; } L::=L1B { L.val:=L1.val*2+B.val; L.length:=L1.length+1; } L::=B { L.val:=B.val; L.length:=1;} B::=0 { B.val:=0; } B::=1 { B.val:=1;}
如采用 LR 分析方法,给出表达式(5*4+8)*2 的语法树并在各结点注明语义值 VAL。
答案:
计算机咨询网()陪着您
5
缄默TH浩的小屋
《编译原理》课后习题答案第八章
采用语法制导翻译思想,表达式 E 的“值”的描述如下:
产生式
语义动作
(0) S′→E
{print E.VAL}
四元式:
100 (+, a, b, t1) 101 (+, c, d, t2) 102 (*, t1, t2, t3) 103 (-, t3, /, t4) 104 (+, a, b, t5) 105 (+, t5, c, t6) 106 (-, t4, t6, t7)
树形:
计算机咨询网()陪着您
计算机咨询网()陪着您
6
缄默TH浩的小屋
《编译原理》课后习题答案第八章
第5题
令 S.val 为下面的文法由 S 生成的二进制数的值(如,对于输入 101.101,S.val=5.625); SÆL.L | L LÆLB | B BÆ0 | 1
ch8-1_语法制导概述-中间代码8.1-8.3_(张素琴)
(5)复制语句 x:=y; (6)过程调用语句 param x 和 call p, n ; 过程返回语句 return y; (7)索引赋值 x:=y[i] 及 x[i] :=y ;
方法:语法制导翻译。
采用独立于机器的中间代 码的好处: 1. 便于编译系统建立和编译系统的移植; 2. 便于进行独立于机器的代码优化工作。
30
中间语言有四种形式: • 逆波兰表示(后缀式) • 三元式(三地址码)和树型表示 • 四元式
8.3.1 逆波兰表示
运算对象写在前,运算符在后,ab+,也称为后 缀式。后缀式表示源程序的自然层次结构(表达式 的计算次序),例如: a+b*c 后缀表示为abc*+ (a+b)*c后缀表示为ab+c* a:=b * c+b * -d后缀表示为abc*bd-*+:= 适合翻译表达式,不适合翻译控制语句。
如表达式的求值、
中间代码的生成
符号表的填写、
5
3. 为什么要此阶段?
–逻辑结构清楚;利于不同目标机上实现同一种语言; –有利于进行与机器无关的优化。
4. 什么是中间代码(Intermediate code)
–源程序的一种内部表示,不依赖目标机的结构,易 于机械生成目标代码的中间表示。
5. 中间代码的几种形式
26
练习:设AS为文法的综合属性集,AI为继承属性 集,求下列语法制导定义中的AI和AS
产生式 语义规则
(1) P→xQR
(2)P →yQR
(3) Q→ u (4)R→v
Q.b=R.d R.c=1 R.e=Q.a Q.b=R.f R.c=Q.a R.e=2 Q.a=3 R.d=R.c R.f=R.e
编译原理第8章 语法制导翻译
3
3
5 6
7 8 9 10 11
S5
S6 r1 r3 r5 S7 r3 r5
S4
S11 r1 r3 r5 r1 r3 r5
10
35
-2-3-5
2+3*5的分析和计值过程
36
三.L-属性文法在自上而下分析中的实现
一个属性文法称为L-属性文法,如果对于每个产生式
A X1X2„Xn,其每个语义规则中的每个属性或者是综
进行归约时,新的属性值就由栈中正在归约的产生式右
边符号的属性值来计算
31
对例8.1的输入串2+3*5语法树如图8.5:
32
假定有一个LR语法分析器,现在把它的分析栈扩充,使
得每个文法符号都跟有语义值,即把栈的结构看成图8.6 所示:
33
同时把LR分析器的能力扩大,使它不仅执行语法分析任 务,还能在用某个产生式进行归约的同时调用相应的语 义子程序,完成在例8.1的属性文法中描述的语义动作 每步工作后的语义值保存在扩充栈的“语义值栈”栏中
合属性,或者是Xj(1≤j ≤n)的一个继承属性且这个继承 属性仅依赖于: (1)产生式Xj在左边符号X1,X2,„Xj-1证明语句中类型信息的属性文法是L-属性 文法
S-属性文法一定是L-属性文法,因为(1)、(2)限制 只用于继承属性
L-属性文法允许一次遍历就计算出所有属性值
15
在两种情况下,我们说属性b依赖于属性 c1,c2,…,ck (1)非终结符既可有综合属性也可有继承属性, 但文法开始符号没有继承属性
(2)终结符只有综合属性,它们由词法程序提供
16
小结:
综合属性其计算规则按“自下而上”方 式进行, 即规则左部符号的某些属性根 据其右部符号的属性和(或)自己的其他 属性计算而得。
《语法制导翻译 》课件
通过本课件了解语法制导翻译的概念、基本方法和实践技巧,并探讨翻译中 的难点及解决方案,让您成为语法制导翻译的专家。
什么是语法制导翻译
介绍语法制略
探讨在语法制导翻译中的思考方式和有效的翻译策略。
认识语法树
解释语法树的概念和作用,并介绍如何构建和分析语法树。
基于语法树的翻译方法
讨论使用语法树进行翻译的具体方法和步骤。
翻译实例分析
通过实际案例分析,展示语法制导翻译在不同场景下的应用和效果。
英汉语法差异
探讨英语和汉语之间的语法差异,解决在翻译中可能遇到的问题。
词形变化对翻译的影响
分析词形变化在翻译过程中的重要性和正确处理方法。
主被动语态的处理
介绍如何准确翻译主被动语态,并避免常见的翻译错误。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
12 0169 13 01 14 15
注意
句柄归约在先,语义动作调用在后 归约时,栈内句柄各符号的语义信息与句 柄及同时出栈,整个句柄所表示的语义信 息则赋给相应产生式左部非终结符号的语 义变量,并让该非终结符号及语义信息同 时入栈
中间代码
中间代码是介于源程序和目标程序之间,用 来表述源程序并与之等效的一种编码方式. 生成中间代码的作用 (1)中间代码与具体机器无关,便于语法分 析和语义加工,便于编译程序移植. (2)易于对中间语言进行优化,有利于提高 中间代码的质量. (3)有利于编译程序的设计与实现,使编译 各阶段的开发复杂性降低. 常用的中间代码形式:逆波兰式、三元式、 四元式、树代码等
一般形式: (编号)〈运算符〉〈运算对象1〉〈运算对象2〉 i op arg1 arg2 出现的次序是对应语法成分的计算次序 无需引进临时工作变量,用三元式的编号代替之, 节省了存贮空间 其中的编号代表某个三元式的位置编号和代表某 个三元式的值 之间的联系靠编号进行,因此,三元式的移动较 困难,不便于优化
属性翻译文法的应用
综合属性与自下而上定值 每个非终结符的属性值都是根据位于其下 面那些符号的属性值来确定的,即按一种 自下而上的方式来确定的。 继承属性和自上而下定值 非终结符的属性值或者根据其上层非终结 符的属性来确定或者根据产生式右部其它 符号的属性来确定。这种属性值是根据自 上而下方式确定的。
引入语义变量,语义过程和语义函数 (1)E.place:表示存放E值的变量名或在符 号表中的入口地址; (2)函数newtemp():申请一个临时单元,存 放中间结果; (3)过程emit(T=arg1 op arg2):产生一条四 元式,并添入四元式表中; (4) lookup():审查是否出现 在符号表中,在:返回地址,不在:返回NULL; (5)函数entry(i):回送标识符i在符号表中 的入口地址.
表达式a+(-b)*c的三元式
(1) (@,b,_);单目运算,运算对象2为空 (2) (*,(1),c) (3) (+,a,(2))
三元式
X=a+b*c Y=d-b*c 三元式表 (1)(*,b,c) (2)(+,a,(1)) (3)(=,x,(2)) (4)(_,d,(1)) (5)(=,y,(4))
S1的代码
JMP W.head
布尔初等量(布尔变量和关系表达式) 的目标结构
由两个转移四元式构成,一个表示真出口Li,另一 个表示假出口Lj,设E是一布尔变量, 它的目标结构 为: (1) if E goto Li (jumpt , E,_, Li ) (jnz,A,_, Li) (2) if E1 rop E2 goto Li (jumpθ ,E1 ,E2 ,Li) (jrop,E1,E2, Li) 例:(j<,a,b,p) (3) goto Lj (jump Lj ) (j,_,_, Lj )
翻译步骤
首先,为文法的每条规则设计相应的语义 子程序; 增加一个语义信息栈; 在语法分析的同时做语义处理:即在用某 一个产生式进行规约的同时,调用相应的 语义子程序完成所用规则的语义动作,并 将每次动作后的值保存在语义栈中
计算表达式2+3*5
状态
ACTION i S5 S6 r2 r4 S5 S7 r4 S4 r2 r4 + * ( S4 acc r2 r4 8 ) $ E 1
翻译步骤: (1)分析文法的特点; (2)设计一系列的语义变量、定义语义过 程、语义函数; (3)设计每一条规则的语义子程序; (4)增加一个语义信息栈,构造LR分析表; (5)语法分析同时语义处理.
例: 有文法G[A]: 1. A→i:=E 2. E →E+T∣T 3. T →T*F∣F 4.F →-P 5.P →i ∣(E) 简单算术表达式的计值顺序与四元式出现的 顺序相同,因此目标代码的顺序(结构)为: (1)先生成E的代码(一系列顺序执行的四元式) (2)把E的值赋给变量i(表达式的结果赋给赋 值语句的左变量)
属性文法
属性文法主要用来描述和说明程序设计语 言语义的。 属性:一般用来描述客观存在的事物或人 的特征,编译技术中用属性来描述计算机 要处理的对象的特征。 属性文法:每个上下文无关文法的产生式, 配以相关联的属性,属性的处理过程也就 是语义的处理过程,为文法的每条规则配 以相应的语义规则构成的文法称为属性文 法。
语法制导翻译的基本思想
对文法中的每个产生式都附加一个语义动 作或语义子程序,在执行语法分析的过程中, 每当使用一条产生式进行推导或规约时, 就执行相应产生式的语义动作。 这些动作不仅指明了该产生式所生成的符 号串的意义,而且还根据这种意义规定了对 应的加工动作.(如查填各类表格、改变编 译程序的某些变量之值、打印各种错误信 息以及生成中间代码等)从而完成预定的 工作。
第八章 语法制导翻译法
语法制导翻译概述
语法制导翻译是继词法分析和语法分析后, 对编译程序进行语义分析和翻译(产生中间 代码)。 在语法分析过程中,随着分析的步步进展, 根据每个产生式所对应的语义子程序(或语 义规则描述的语义动作)进行翻译的办法称 为语法制导翻译。
本章学习的主要内容
本章我们将主要讨论语法制导翻译的 基本思想及其在在中间代码生成中的 应用。主要包括:属性文法、各种常 见中间语言形式、赋值语句的翻译, 布尔表达式的翻译,控制语句的翻译、 说明语句的翻译等。通过本章的学习, 要求掌握语法制导翻译的基本思想和 翻译方案。
6.F →_P {F.place=newtemp(), emit(F.place)=@P.place} 7.P →(E) {P.place=newtemp(), emit(P.place=E.place)} 8.P →i{P.place=newtemp(), emit(P.place=Entry(i))}
GOTO T 2 F 3
G[E]:
E→E+T
E→T T→T*F T→F F→(E)
0 1 2 3 4
2 9
3 3 10
5
6 7 8 S5 S5
r6
r6
S4 S4
r6
r6
F→i
S6
S11
9
i+i*i 10 11
r1
r3 r5
S7
r3 r5
r1
r3 r5
r1
r3 r5
表达式2+3*5的归约过程
步骤 状态 语义栈 栈 0 0 _
四元式 (三地址代码)
一般形式:
〈运算符〉〈运算对象1〉〈运算对象2〉〈结果〉 (op , arg1, arg2 , result) 例: X=a*b+c*d的四元式序列 三地址代码 (1)(* ,a,b,T1) (1)T1=a*b (2)(*, c,d,T2) (2)T2=c*d (3)(+,T1,T2,T3) (3)T3=T1+T2 (4)(=,T3,_,X) (4)X=T3
布尔表达式作为控制语句中的条件式
作用是用于选择下一个执行点 while E do S1 E的作用是选择S1执行,还是跳过S1语句,执 行S1后面的语句 E有两个出口: 真:S1语句 假:S1后面的语句
While语句的目标结构
W.head whille
E的代码 假 真
do
逆波兰表示法(后缀式)
特点:运算符直接写在其运算对象之后。 不再有括号 运算对象出现的次序未变 求值过程简单,宜于用栈实现 例: a+b ab+ a*b+c ab*c+ a*(b+c/d) abcd/+* a*b+c*d ab*cd*+ a:=b*c+d*e abc*de*+:=
三元式
1 2 3 4 5 6 05 03 02 01 016 __ _2 _2 _2 _2_
符号栈 输入串
$ $2 $F $T $E $E+ $E+3 2+3*5$ +3*5$ +3*5$ +3*5$ +3*5$ 3*5$ *5$
动作
S5 r6 r4 r2 S6 S5 r6
0165 _ 2 _ _
步 状态栈 骤 7 0163 定义: AG: AG=(G,V,E) G:上下文无关文法; V:属性的有穷集合;每一个属性与某一个文 法符号相关联;用文法符号.属性表示 E:表示属性的断言或谓词的有穷集合(语义 规则);每一个断言与文法的某个产生式相 关联) 属性:综合属性(自下而上)、继承属性(自 上
算术表达式求值
语法分析分析的语法成分是简单算术 表达式,所完成的语义的处理不是将 它翻译成中间代码或目标代码,而是 计算表达式的值。
算术表达式的属性文法
简单算术表达式求值的语义描述。 产生式 语义规则 (0) L→ E Print(E.val) (1)E→E1+T E.val=E1.val+T.val (2)E→T E.val= T.val (3)T→T1*F T.val=T1.val * F.val (4)T→ F T.val=F.val (5)F→ (E) F.val=E.val (6)F→digit F.val=digit.lexval(0~9)
表达式的语义动作设计
1. A→i:=E{emit(entry(i)=E.place} 2. E →E1+T{E.place=newtemp(), emit(E.place)=E1.place+T.place} 3.E →T {E.place=newtemp(), emit(E.place=T.place)} 4. T →T1*F{T.place=newtemp(), emit(T.place)=T1.place*F.place} 5. T →F {T.place=newtemp(), emit(T.place=F.place)}