第5章 语法制导翻译

合集下载

编译原理课件05语法制导翻译技术和中间代码生成

编译原理课件05语法制导翻译技术和中间代码生成

5.4 中间代码
四元式的特点: 1. 四元式出现的顺序和语法成份的计值 顺序相一致. 2. 四元式之间的联系是通过临时变量实 现的,这样易于调整和变动四元式. 3. 便于优化处理.
5.4 中间代码
编译系统中,有时将四元式表示成另一 种更直观,更易理解的形式——三地址代 码或三地址语句. 三地址代码形式定义为: result := arg1 OP arg2 三地址语句:语句中是三个量的赋值语句, 三地址语句 每个量占一个地址.
5.5 自下而上的语法制导翻译
例3 简单算术表达式翻译到四元式的 语义描述 例如,设有简单算术表达式的文法: E→E+E | E*E | (E) | i
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.1 概述
例如: 表达式 A+B*C 对运算对象进行类型检查, 对变 量进行先定义后使用检查 执行真正的翻译 如果静态语义正确, 语义处理则要执 行真正的翻译, 即生成程序的某种中间 代码的形式或直接生成目标代码.
5.1 概述
目前多数编译程序进行语义分析的方 法是采用语法制导翻译法 .它不是一种 采用语法制导翻译法 形式系统, 但它比较接近形式化. 语法制导翻译法使用属性文法为工具 来描述程序设计语言的语义.
5.4 中间代码

语法制导翻译

语法制导翻译
例:图5-7的一个拓扑排序 1,2,3,4,5,6,7,8,9
或1,3,5,2,4,6,7,8,9
编译原理
20
循环依赖Circular dependency
产生式 AB
语义规则 A.s := B.i B.i := A.s + 1
A A.s
B B.i
编译原理
21Biblioteka 属性计算次序构造输入的分析树, 构造属性依赖图, 对结点进行拓扑排序, 按拓扑排序的次序计算属性。
介绍语法制导翻译的实现方法。
编译原理
3
语法制导翻译的一般过程
输入符号串 分析树 依赖图 语义规则的计算顺序
一个句子的翻译过程可以与语法分析过程并行。
编译原理
4
5.1 语法制导定义
语法制导定义是对CFG的推广,每个文法符号都有 一个相关的属性集。
属性:语义信息。一个文法符号通常用一个或若干 个属性来描述它的语义信息。典型例子: ▪ 变量的数据类型 ▪ 表达式的值 ▪ 变量的存储位置 ▪ 程序的目标代码
F.val := digit.lexval
编译原理
13
图5-4
T.val = 15
F.val = 3
T′.inh = 3
.syn =15
digit.lexval =3
*
T1′.inh = 15
F.val = 5
.syn =15
digit.lexval = 5
编译原理
14
继承属性
一个结点的继承属性值由该结点的父结点和(或) 兄弟结点的属性决定。
分析树各结点属性的计算可以自底向上地完成。
编译原理
11
8+5*2 n的注释分析树 (annotated parse tree)

编译原理 第5章语法制导的翻译

编译原理 第5章语法制导的翻译

属性和文法符号相关联 规则和产生式相关联

根据需要,将文法符号和某些属性相关联, 并通过语义规则来描述如何计算属性的值


E→E1+T E.code=E1.code || T.code || ‘+’ code表示了我们关心的表达式的逆波兰表示,规则说明 加法表达式的逆波兰表示由两个分量的逆波兰表示并置, 然后加上‘+’得到。
digitlexval=3
18
适用于自顶向下分析的SDD


前面的表达式文法存在直接左递归,因 此无法直接用自顶向下方法处理。 消除左递归之后,无法直接使用属性val 进行处理:


比如规则:T→FT’ T’→*FT’ T对应的项中,第一个因子对应于F, 而运算符在T’中。
19
相同表达式的不同文法的比较
38
例5.15 分析栈实现的例子

假设语法分析栈存放在一个被称为stack 的记录数组中,下标top指向栈顶;


stack[top]指向这个栈的栈顶;stack[top-1] 指向栈顶下一个位置; 如果不同的文法符号有不同的属性集合,我 们可以使用union来保存这些属性值。(归 约时,我们知道栈顶向下的各个符号分别是 什么)
语义翻译的流程
输 入 符 号 串 分 析 树 依 赖 图




的 计
实际上,编译中语义翻译的实现并不是 按图中的流程处理的;而是随语法分析 的进展,识别出一个语法结构,就对它 的语义进行分析和翻译。

9
5.1 语法制导定义

4.什么是语法制导定义(SDD) 上下文无关文法和属性/规则的结合;

编译原理(龙书)课后习题解答(详细)

编译原理(龙书)课后习题解答(详细)

编译原理(龙书)课后习题解答(详细)编译原理(龙书)课后题解答第一章1.1.1 :翻译和编译的区别?答:翻译通常指自然语言的翻译,将一种自然语言的表述翻译成另一种自然语言的表述,而编译指的是将一种高级语言翻译为机器语言(或汇编语言)的过程。

1.1.2 :简述编译器的工作过程?答:编译器的工作过程包括以下三个阶段:(1) 词法分析:将输入的字符流分解成一个个的单词符号,构成一个单词符号序列;(2) 语法分析:根据语法规则分析单词符号序列中各个单词之间的关系,确定它们的语法结构,并生成抽象语法树;(3) 代码生成:根据抽象语法树生成目标程序(机器语言或汇编语言),并输出执行文件。

1.2.1 :解释器和编译器的区别?答:解释器和编译器的主要区别在于执行方式。

编译器将源程序编译成机器语言或汇编语言等,在运行时无需重新编译,程序会一次性运行完毕;而解释器则是边翻译边执行,每次执行都需要进行一次翻译,一次只执行一部分。

1.2.2 :Java语言采用的是解释执行还是编译执行?答:Java一般是编译成字节码的形式,然后由Java虚拟机(JVM)进行解释执行。

但是,Java也有JIT(即时编译器)的存在,当某一段代码被多次执行时,JIT会将其编译成机器语言,提升代码的执行效率。

第二章2.1.1 :使用BNF范式定义简单的加法表达式和乘法表达式答:<加法表达式> ::= <加法表达式> "+" <乘法表达式> | <乘法表达式><乘法表达式> ::= <乘法表达式> "*" <单项式> | <单项式><单项式> ::= <数字> | "(" <加法表达式> ")"2.2.3 :什么是自下而上分析?答:自下而上分析是指从输入字符串出发,自底向上构造推导过程,直到推导出起始符号。

编译原理(第2版)陈意云+张昱编著课后答案

编译原理(第2版)陈意云+张昱编著课后答案

rm
rm
rm
rm
rm
S aSbS aSbaSbS aSbaSb aSbab abab
rm
rm
rm
rm
rm
(c)对于句子abab构造两个相应的分析树.
S
S
aSbS
aSbS
bS aS
a S b S
(d) 此文法产生的语言是什么?
由相同个数的a和b组成的字符串.
9
1.3 考虑文法 bexpr bexpr or bterm | bterm bterm bterm and bfactor | bfactor bfactor not bfactor | ( bfactor ) | true | false
句柄: 一个句型的最左直接短语称为句柄.
5
S ( L ) ( L, S ) ( S, S ) ( a, S ) ( a, ( L ))
短语 ( L ) L, S S
a
a
( L, S ) S,S
a, S
a, ( L )
( S, S ) (a, S) ( a, ( L ))
(L)
直接 ( L ) L, S S
(a, (a,a)) S
(
L)
L,S
S( L )
a
S
a
4
(c) 给出句子的最左推导 给出每次推导后得到的句型的短语, 直接短语
最左推导 : 推导中任何一步 都是对中的最左非终结
lm 符号进行替换的推导.
短语
是文法的句型(S * ) S * A且A + 则是关于A的句型的短语.
直接短语
是文法的句型(S * ) S * A且A 则是关于A的句型的直接短语.

第8讲 语法制导翻译_1

第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本身的属性值来定义
两个概念
将语义规则同语法规则(产生式)联系起来要 涉及两个概念

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

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

剩余串 3+ 45# +45# +45# +45# +45# 5# 5# 5# 5# 5# #
主要动作
r6 r4 r2
r6 r4
r6 # # r3 r1 acc
表达式3 + 4 5的语法语义分析和计值过程
§5.3
中间语言
所谓中间语言,也称中间代码,是复杂性介 于源程序语言和机器语言的一种记号系统。一般 来说,快速编译程序直接生成目标代码,没有将 中间代码翻译成目标代码的额外开销。但是为了 使编译程序结构在逻辑上更为简单明确,使生成 的的目标代码更为高效,通常采用中间语言。 编译程序所使用的中间语言形式较多。常见 的逆波兰式、三元式、四元式和树形表示等。来自bcd
3. 间接三元式 为了尽量不改变三元式表,可以另设一张间 接码表来表示有关三元式在三元式表的 计值顺序。用这种方法获得的中间代码 称为间接三元式。
例如,表达式a := x+y z b := t-y z 的间接三元式表示如图所示。
三元式列表 (1)( ,y,z) (2)(+,x,(1)) (3)(:=,a,(2)) (4)(-,t,(1)) (5)(:=,—,(4))
§5.4 自底向上语法制导翻译
语法制导翻译分为自底向上和自底向下两种。 自底向上语法制导翻译方法就是在自底向上语法 分析过程中逐步执行语义规则。也就是在每次归 约的同时执行相应的语义动作。
5.4.1 简单算术表达式和赋值语句的翻译
简单算术表达式和赋值语句是指不含数组 元素、记录等复杂数据结构的算术表达式和赋值 语句。
简单算术表达式求值的属性文法。 例5.1 :
规则 1.S→E 2.E→E1+T 3.E→T 4.T→T1 F 5.T→T1 6.F→(E) 7.F→digit 语义规则 print(E.val) E.val := E1.val+T.val E.va1 := T.valv T.val := T1.val F.val T.val := T1.val F.val := E.val F.val := digit.lexval

第5章语法制导翻译技术和中间代码生成

第5章语法制导翻译技术和中间代码生成

编译原理
2024年8月7日
25
逆波兰表示法(后缀式)
特点:运算符直接写在其运算对象之后。 • 不再有括号 • 运算对象出现的次序未变 • 求值过程简单,宜于用栈实现
后缀式的计算 用一个栈实现。 一般的计算过程是:自左至右扫描后缀式,每碰 到运算量就把它推进栈。每碰到k目运算符就把 它作用于栈顶的k个项,并用运算结果代替这k 个项。
④相关名字检查。有的语言中有时规定,同一名字 必须出现两次或多次。例如,Ada语言中,循环或程 序块可以有一个名字,它出现在这些结构的开头和结 尾,如同语句括号一般,编译程序必须检查它们的配 对情况。
编译原理
2024年8月7日
6
5.2 属性文法
附加了一组语属义性信和息运算(语义)规则的文法
1. 属性的表示
3
语义分析的任务
根据语义规则对识别出的各种语法成分析其含义, 进行初步翻译,生成相应的中间代码或直接生成目 标代码。
第一,审查每个语法结构的静态语义,即检查语法结构合法 的程序是否真正有意义。也称静态语义检查。(类型检查、 控制流的检查、一致性检查、相关名字的检查) 第二,如果静态语义正确,语义处理则要执行真正的翻译, 要么生成中间代码,要么生成实际的目标代码。(说明性语 句:填符号表;可执行性语句:生成中间代码)
编译原理
2024年8月7日
12
翻译步骤
(1)分析输入符号串,建立分析语法树 (2)从分析树得到描述结点属性间依赖关系的依赖图,由 依赖图得到语义规则的计算次序 (3)进行语义规则的计算,得到翻译结果
输入符号串 分析树 执行语义规则
翻译结果
编译原理
2024年8月7日
13
语法制导定义
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

5.2 属性文法与属性翻译文法 属性文法与
语法制导翻译方法的实质,就是根据文法中每个产 语法制导翻译方法 生式所蕴含的语义,为其配备一个(或多个)处理 语句或子程序,对所要完成的功能进行描述。 产生式的语义是由组成该产生式的文法符号的语义 产生式的语义 所决定的。 将这些语义以“属性 属性”的形式附加到各个文法符号 上,再根据产生式所蕴含的语义,给出每个文法符 号的属性的求值规则 求值规则,从而形成一种附带有语义属 语义属 求值规则 属性文法。 性的前后文无关文法,即属性文法
属性文法的定义
定义5 属性文法AG是一个四元组:AG=(G,A,R,B), 其中, 定义5.4 属性文法 G是已简化的CFG; A=∪X∈VA(X)是属性的有限集合; ∪ ∈ R= ∪p∈PR(p)是属性定义规则的有限集; ∈ B=∪p∈PB(p)是条件的有限集合,B(p)用于描述使规则R(p)有效 ∪∈ 的条件; 且同时满足: (1)对G中任意两个不同的文法符号X和Y而言,属性集合A(X)和A(Y) 不相交,A(X) ∩A(Y)=∅ ∅ (2)在G的任意一个语法树中,对文法符号X的每一次出现,可用于计 算X的每个属性之值的规则至多有一条。
Expr . primtype = coerible ( Name (1) . primtype , int_ type ) ? int_ type:real _ type ; Add .Type = Expr . primtype ; Name (1) . posttype = Expr . primtype ; Name ( 2 ) . posttype = Expr . primtype ; Condition : coercible ( Expr . primtype , Expr . posttype ); }
文法符号及其语义属性
文法符号X的语义信息我们称之为语义属性 语义属性 或简称为属性 属性(Attributes)。 我们用形如X.ATTR的记号来表示文法符号 X的相关语义属性 语义属性。 如果一个文法符号X在一产生式中多次出现, 为了在语义上能够对其进行区分,可添加不 同的上标。 例如,文法G[E] G[E]: G[E] 产生式 语义子程序 E→E(1)+T {E.Val=E(1).val+T.val;} E→T {E.Val=T.Val;} T→digit {T.Val=digit;} 为了能在语法分析过程中平行地进行语义处 理,可在语法分析栈旁边并行地设置一个语 语 义信息栈
属性依赖关系
定义5.6 定义5.6 对于每个产生式p:X0→X1X2…Xn∈P ,直接属性依赖关系由下式 给出: DDP(p)={(Xi.a,Xj.b)|Xj.b=f(…,Xi.a,…)∈R(p)} 若序偶(Xi.a,Xj.b)∈DDP(p),则称属性Xj.b依赖于属性Xi.a ,记作 Xi.a→Xj.b。 显然,若有Xi.a→Xj.b ,则对Xj.b的计值,应在求出Xi.a的值之后进行。 但若Xi.a又直接或间接地依赖于Xj.b,则称属性Xi.a和Xj.b是循环依赖 循环依赖 的。含有属性循环依赖的属性文法AG,其中的一些属性之值将不能得 到有效的计算。
翻译文法的定义
定义5.8 定义5.8 在文法产生式右部适当的位置上插入语义动作 语义动作 而得的新文法称为翻译文法 增广文法 翻译文法或增广文法 (Augmented Grammar Augmented Grammar)。在一翻译文法 翻译文法中,若每 语义动作均出现在所有文法 个产生式右部中的全部语义动作 语义动作 符号的右边,则称这样的翻译文法 波兰翻译文法。 翻译文法为波兰翻译文法 为了区分文法符号与语义动作, 为了区分文法符号与语义动作 , 我们用一对花括号 将插入的语义动作括起来( ‘{’及‘}’将插入的语义动作括起来(语义动作采用 及 将插入的语义动作括起来 语言格式书写) 而且, C语言格式书写)。而且,我们还把语义动作视为翻 动作符号。 译文法中的一个“ 符号” 称为动作符号 译文法中的一个 “ 符号 ” , 称为 动作符号 。 插入语 义动作后,翻译文法产生式的一般形式为: A→(α statement; A→(α{statement;})* α∈V*
例5.1 简单赋值语句文法的属性文法
1. Assignment → Name': =' Expr { Attribution: Name. environment = Assignment . environment ;
Expr. environment = Assignment . environment ;
Name. posttype = Name. primtype; Expr. posttype = ( Name. primtype == int_ type)?int_ type : real _ type; }
2. Expr → Name ( 1) Add Name ( 2 ) { Attribution: Name (1) . environment = Expr . environment ; Name ( 2 ) . environment = Expr . environment ;
第五章 语法制导翻译及中间代码生成
5.1 引言
在早期的一些编译程序中,是在语法分析的基础上根据源程序中各 语法成份的语义,直接产生机器语言或汇编语言形式的目标代码 目标代码。 目标代码 现在的编译系统一般都将经过语法分析的源程序先翻译为某种形式 的中间语言代码 中间语言代码,然后再将其翻译为目标代码。 中间语言代码 优点: 优点 使编译程序各组成部分功能更单一; 使得编译程序的逻辑结构更为清晰,从而使编译程序更易于编 写与调整;同时为代码优化和程序的可移植性提供了条件 本章要讨论的中间代码生成 中间代码生成,是指把单词符号串形式的源程序转换 中间代码生成 为另一种等价的便于代码优化处理和目标代码生成表示。 目前常见的中间语言有逆波兰表示 三元式 四元式 逆波兰表示、三元式 四元式等等。 逆波兰表示 三元式、四元式 中间代码生成与语言的语义密切相关,目前采用语法制导翻译来描 述语义。 方法:对文法中的每个产生式都附加一个语义动作或语义子程序, 方法 语法分析程序除执行相应的语法分析动作外,还要执行相应的语义 动作或调用相应的语义子程序。
属性依赖关系
各个文法符号的属性 属性之间,可能存在某种依赖关系 依赖关系,这种依赖关 依赖关系 依赖关 语义规则)定义。 系可用属性规则(语义规则 定义 5.2 设p:X0→X1X2…Xn是文法G的一个产生式,则与p相关联 的属性规则集 R(p)={Xi.a=f(Xk1.ak1,…,Xkm.akm)|Xi.a∈A(Xi)} R(p)={X =f(X ={ )|X 定义了该产生式所涉及的文法符号之属性的求值规则 求值规则,它表示: 求值规则 Xi的a属性是由Xk1的ak1属性,…,Xkm的akm属性计算而得的。 a X a X a 定义 5.3 对每个产生式p:X0→X1X2…Xn ,设属性定义性出现的集 p X 合为 AF(p)={Xi.a|Xi.a=f(Xk1.ak1,…,Xkm.akm)∈ R(p),0≤kj≤n} =f(X R(p),0 ≤n} X ,X 若Xi是产生式左部的非终结符(即i=0),则称属性Xi.a是综合属性; X X 若Xi出现在产生式的右部(即1≤i≤n),则称Xi.a是继承属性 X X
5.2.1 语义属性与属性文法
定义 5.1 一文法符号的语义性质称为该文法符号的 语义属性(Attributes 属性。用A(X)表 语义属性 Attributes),简称为属性 属性 示X的所有属性的集合。每个属性表示X的一个特定 性质,并可任意指定其取值范围。我们用X.a表示 A(X)中的属性a 。 属性可表征诸如数、符号串、类型、存储空间和其 属性 它需表征的实体。 终结符至少有一种属性 终结符 属性,即词文。它还可能具有其 属性 它属性,例如无符号数123 123,单词“123”就是它的 123 词文,而其数值以及它的类型(整型)是它的其它 两个属性。终结符的属性是其内在性质 终结符的属性是其内在性质 终结符的属性是其内在性质. 非终结符的属性 非终结符 属性 属性是从其它符号的属性 属性经计算而得的, 属性 即由其它符号的属性 属性定义的。 属性
加注语法树
在语法树中,将每个结点均视为由若干个域组成的结构 结构,则可 将其中的一些域用来存放相应文法符号诸属性之值,并可用 属性来为这些域命名。通常我们将每个结点都标注相应属性 属性 值的语法树称为加注语法树 加注语法树 由定义5.3可知:在加注语法树 定义5.3 加注语法树中,一个文法符号X在相应结 加注语法树 X 点的综合属性之值,由其子结点的属性和(或)X的其它属性, 点的 之值,由其子结点的属性和(或)X的其它属性, 通过相关属性规则经计算而得,故综合属性的求值在语法树 自下X 结点和(或)其它兄弟结点来定义,故继承属性的求值将按自上 自上 而下的方式进行。 而下
依赖关系图
定义5.7 定义5.7 设T是L(G)中一个句子相应的加注语法树,并设在构造T时使用 过产生式p:X0→X1X2…Xn ,对于T中由X0,X1,X2,…,Xn所标记的每个 结点,若有 (Xi.a,Xj.b)∈DDP(p),则在树中引一条从到的有向边,由此而得到的 树称之为该句子的属性化语法树。 所有这样的有向边构成的集合DT(T),称为树T上的依赖关系。根据 DT(T)所构造的关系图称为依赖关系图 依赖关系图(或简称为依赖图 依赖图)。 例如,对于例5.1所给文法下的一个句子x:=y+z x:=y+z,相应属性化语法树的 依赖关系如P191图5-3所示。
语法分 析栈 T + E … # … 语义分 析栈 T.Val ‘+’
本章内容简介
首先介绍一种适用于定义语义的一种特殊文法 属性文法,进一步介绍适用于语义翻译的文法 属性文法 属性翻译文法的相关知识。 属性翻译文法 在第三小节中我们将介绍几种常见的中间语言 中间语言; 在第四小节中引入程序设计语言中常见语法结构 的语法制导翻译技术。
相关文档
最新文档