语法制导翻译技术
编译原理课件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章语法制导的翻译
属性和文法符号相关联 规则和产生式相关联
根据需要,将文法符号和某些属性相关联, 并通过语义规则来描述如何计算属性的值
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) 上下文无关文法和属性/规则的结合;
语法制导翻译
2
4.1 语法制导翻译简介
语法与语义
1. 语法与语义的关系 语法是指语言的结构、即语言的“样子”;语义是指附着于语
言结构上的实际含意 ,即语言的“意义”。 ① 语义不能离开语法独立存在; ② 语义远比语法复杂; ③ 同一语言结构可包含多种含意,不同语言结构可表示相
② 若b是α中某文法符号Xi的属性,c1, c2, ..., ck是A的属性, 或者是α中其它文法符号的属性,则称b是Xi的继承属性。
③ 称(4.1)中属性b依赖于属性c1, c2, ..., ck。
④ 若语义规则的形式如下述(4.2),则可将其想像为产生式左 部文法符号A的一个虚拟属性。属性之间的依赖关系,在 虚拟属性上依然存在。
k := k+1;
9
4.1 语法制导翻译简介
产生式
语法制导定义
翻译方案
L→E
print(E.post)
print_post(post);
E → E1 + E2 E → num
E.post := E1.post || post(k) := '+'; E2.post || '+'; k := k+1;
1. 编译器各阶段的完整输出,均可以被认为是源程序的某种 中间表示。
2. 本章讨论的是中间代码生成器输出的中间表示,称之为中 间代码。
3. 中间代码实际上应起一个编译器前端与后端分水岭的作用。 4. 要求中间代码具有如下特性,以便于编译器的开发移植和
代码的优化: ① 便于语法制导翻译; ② 既与机器指令的结构相近,又与具体机器无关。 5. 中间代码的主要形式:树、后缀式、三地址码等。
语法制导的翻译方案
语法制导的翻译方案1. 引言语法制导翻译是一种基于文法规则的翻译技术,它可以将源语言文本转化为目标语言文本。
在本文档中,我们将介绍语法制导的翻译方案,包括其基本原理、常用方法以及在实际应用中的一些注意事项。
2. 基本原理语法制导的翻译方案基于上下文无关文法(Context-Free Grammar,CFG)和语义动作,它通过在文法规则中插入动作,实现从源语言到目标语言的翻译过程。
在每个文法规则中,我们可以定义一个或多个动作,这些动作在分析过程中被触发,并产生对应的目标语言文本。
3. 常用方法3.1 自顶向下翻译自顶向下翻译是一种从文法的起始符号开始,逐步扩展语法树的过程。
它可以按照语法规则的顺序依次进行翻译,对于每个文法规则,我们可以定义相应的语义动作来生成目标语言文本。
自顶向下翻译的优点是简单直观,但在处理左递归时可能会出现无限递归的情况。
3.2 自底向上翻译自底向上翻译是一种从文法的终结符开始,逐步构建语法树的过程。
它通过将终结符逐步合并为非终结符,最终构建出完整的语法树。
自底向上翻译的优点是可以有效处理左递归,并且可以在翻译过程中处理语法上的歧义。
3.3 语法推导翻译语法推导翻译是一种基于文法推导的翻译方法。
它通过将源语言文本转化为一个推导序列,然后通过逐步应用文法规则,将推导序列转化为目标语言文本。
语法推导翻译的优点是可以明确表示翻译过程中的每一步,并且可以通过扩展文法规则来处理文法上的不完备性。
4. 实际应用中的注意事项在实际应用中,语法制导的翻译方案需要考虑以下几点注意事项:•文法设计:文法的设计需要充分考虑源语言和目标语言之间的语法结构和语义关系。
合理地定义文法规则和语义动作,可以提高翻译的准确性和效率。
•优化翻译过程:在翻译过程中,我们可以通过优化技术来提高翻译的效率。
例如,可以使用语法分析器生成的语法树作为翻译的输入,避免重复的语法分析过程。
•处理语义歧义:在翻译过程中,可能会遇到多义词或歧义句子的情况。
属性文法和语法制导翻译
id1
如果一属性文法不存在属性 之间的循环依赖关系,那么 称该文法为良定义的
T type
5 in L
4
real
7 in L y 8 ,
y6 id3 entry 3
9 in L y 10 ,
id2 entry 2
id1 entry 1
属性的计算顺序
无环有向图的拓扑排序
无环有向图中节点m1,m2,…,mk的拓扑排序是:若 mi→mj是从mi到mj的边,那么在此排序中mi先于mj 依赖图的任何拓扑排序都给出了一个分析树中各节点 语义规则计算的正确顺序,即在计算f之前,语义规则
real id1,id2,id3
语法制导翻译
基于属性文法的处理过程通常是:
对符号串进行语法分析,
构造语法分析树
根据需要遍历语法树并在语法树的各结点处按语义规 则进行计算。
这种由源程序的语法结构驱动的处理办法就是语法制 导翻译法。
在某些情况下,在进行语法分析的同时完成语义规则
的计算而无须明显地构造语法树或构造属性之间的依
real L.in=real ,
id3
L.in=real ,
id2
id1
产生式 D→TL T→int T→real L→L1 , id
L→id
语义规则 L.in := T.type T.type := integer T.type := real L1.in := L.in addtype(id.entry, L.in) addtype(id.entry, L.in)
为每个包括过程调用的语义规则引入一个虚综合属性b,把每条 语义规则都变成b=f(c1,c2,...,ck)的形式 依赖图的每个结点表示一个属性 边表示属性间的依赖关系。如果属性b依赖于属性c,那么从c到 b就有一条有向边
第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本身的属性值来定义
两个概念
将语义规则同语法规则(产生式)联系起来要 涉及两个概念
语义分析与语法制导翻译
/* newtemp => t2 => E1.place */
|| E21.code || E22.code || gen( ‘t3:=’ E21.place’*’E22.place )
9
8
三地址代码
一般形式 x := y op z
其中 x, y, z 为变量名、常数或编译 产生的临时变量
四元式(op, x, y, z)
种类:x := y op z
双目运算
x := op y
单目运算
x := y
赋值
if x relop y goto l
条件转移
其他三地址代码
goto l param x call p, n (n是参数个数) return x x := y[i] x[i] := y x := &y x := *y *x = y
注释: || 表示代码序列的连接
S
例 6-7:
翻译 a:= -c+b*34
id := E
E1 +
E2
-
E 11 E 21 *
E 22
id id
num
结果:开始符号的属性 S.code
1) 找出分析树中使用的产生式规则 2) 根据产生式的语义规则,代换公式中的
各属性 3) 反复使用 1) 和 2) 改写公式,最后得
如:算术表达式求值的属性文法
L-属性定义:
其属性可用深度优先的顺序从左 至右计算
对于所有 A→X1 X2 … Xn Xi 属性计算仅使用A X1 X2 …
第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
• 用中间语言过渡的好处: 用中间语言过渡的好处:
–便于编译系统的实现、移植、代码优化 便于编译系统的实现、移植、 便于编译系统的实现
语法制导翻译和中间代码生成
继承属性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
+
叶子结点代表运算量, 非叶子结点代表运算符
语法制导翻译和中间代码生成
例如:
产生式 语义子程序 (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指的是词法分析送来的机内二进制整数
3、后缀表示式(逆波兰表达式) Operand1 Operand2 Operator 4、树形表示法
注:常用中间代码表示法是四元式。
赋值语句的翻译
仅含简单变量的表达式的赋值语句的翻译 1、赋值语句的文法 A i=E E E+E|E*E|-E|(E)|i 2、需要的语义过程 NEWTEMP函数:每次调用送回一个代表新临时 变量的序号,可认为是送回T1 、 T2这样的一些 临时变量 ENTRY(i)函数:用于查变量i的符号表入口地址
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、四元式形式: (Operator,Operand1,Operand2,Result) 注: 1) Operand1,Operand2,Result 可能是用户自定 义的变量,也可能是编译时引进的变量。 这里 Operator是双目运算符,若只有一个运算量,则 是单目运算符。
第五章 语法制导翻译(1)
另一例 非L属性的语法制导定义
文法符号B的继承属性依赖于它右边文法符号C的 属性。
产生式 ABC
语义规则 A.s := B.b B.i := f(C.c, A.s)
编译原理
27
例5.10
编译原理
28
例5.10 简单类型声明的SDD
产 生 式 语 义 规 则
D TL
T int
id2 2 entry
编译原理
30
float id1, id2, id3的分析树的依赖图
D T 4 type float in 7 in 5 L 8
L 6
, id2 2 entry id3 3 entry
in 9
L 10
,
id1 1 entry
编译原理 31
float id1, id2, id3的注释分析树
(1) p1 := new Leaf(id, entrya); (2) p2 := new Leaf(num, 4); (3) p3 := new Node(„-‟, p1, p2); (4) p4 := new Leaf(id, entryc); (5) p5 := new Node(„+‟, p3,p4); p5 p3 p1 + p4 id entryc p1, p2, ..., p5是指向结点 的指针,entrya和entryc 分别是指向符号表中标 识符a和c的指针。
编译原理
35
为表达式建立语法树的语法制导定义
产生式
EE1+T E E1-T ET T (E) Tid Tnum
语义规则
E.node := new Node(‘+’, E1.node, T.node) E.node := new Node(‘-’ , E1.node, T.node) E.node := T.node T.node := E.node T.node:= new Leaf(id, id.entry) T.node := new Leaf(num, num.val)
第06章 语法制导翻译技术
6.2 语法制导翻译
语法制导翻译:按翻译文法进行的翻译。 给定一输入符号串,根据翻译文法获得翻译该符号串 的动作序列,并执行该序列所规定的动作的过程。 例: 输入序列:a+b*c 活动序列:a@a+b@b*c@c@*@+ 动作序列:@a@b@c@*@+ 翻译结果:abc*+
17
6.2 语法制导翻译
11
例:符号串(a+b)*b
用输入文法推导:
E=>T =>T*F =>F*F =>(E)*F =>(E+T)*F =>(T+T)*F =>(F+T)*F =>(a+T)*F =>(a+F)*F =>(a+b)*F =>(a+b)*b T F ( E ) E T * F b
E
T F a
+
T
F b
12
翻译文法:
① A→@va@wB@xc@yD@z ③ B→c@r ⑤ D→cD@n
② A→b ④ B→a@mA ⑥ D→@sb
翻译文法的LL(1)分析表
符 号 输入符号 a
POP,PUSH(@zD@yc POP, PUSH(b) POP, PUSH(@rc) POP, PUSH(b@s) POP, PUSH(@nDc)
7
分别给出下列表达式的后缀表示
1. a+b*(c-d)
2. (a-b)*c+d 3. -a+b*(-c+d) 4. X:=-(a+b)/(c-d)-(a+b*c) 1. abcd-*+ 2. ab-c*d+
3. a-bc-d+*+
第5章 语法制导翻译1
2. Expr Name (1) Add Name ( 2 ) { Attribution: Name (1) . environment Expr . environment ; Name ( 2 ) . environment Expr . environment ;
int Entry(char *Name){ int i=LookUp(Name);
if(i) return i; else return Enter(Name);
翻译程序中使用的辅助函数(续)
⒋int Trip(int op,int arg1,int arg2)—根据给定 的参数产生一个三元式 (op,arg1,arg2) 并将它送入三元式表中,其返回值为表中序号。 为区分参数 arg 表示的是 三元式 还是变量,约定 当arg<0时表示三元式序号;arg>0表示变量在 符号表中登记项序号;arg=0表示参数为空。
文法符号及其语义属性
例如,文法G[E]: 产生式 语义子程序 E→E(1)+T {E.Val=E(1).val+T.val;} E→T {E.Val=T.Val;} T→digit {T.Val=digit;} 为了能在语法分析过程中平行地进行语 义处理,可在语法分析栈旁边并行地设 置一个语义信息栈
语法分 析栈 T + E … # … 语义分 析栈 T.Val ‘+’
5.2 属性文法与属性翻译文法
语法制导翻译方法的实质,就是根据文法中每个产 生式所蕴含的语义,为其配备一个(或多个)处理 语句或子程序,对所要完成的功能进行描述。 产生式的语义是由组成该产生式的文法符号的语义 所决定的。 将这些语义以“属性”的形式附加到各个文法符号 上,再根据产生式所蕴含的语义,给出每个文法符 号的属性的求值规则,从而形成一种附带有语义属 性的前后文无关文法,即属性文法。 语义属性主要有两类:综合属性和继承属性
编译原理分知识点习题-语法制导和翻译
编译原理分知识点习题-语法制导和翻译1.⼀般情况下,为什么语义分析部分仅产⽣中间代码解答:⼀般情况下,语义分析部分仅产⽣中间代码,其原因是:可使难点分解,分别解决。
可对语义分析产⽣的中间代码进⾏优化,以产⽣⾼效率的⽬标代码。
语义分析通常与机器⽆关,⽬标代码往往与机器有关。
把语义分析与⽬标代码⽣成分开,可让⼀个语义分析程序适⽤于多个⽬标代码⽣成程序。
2.(湖北省⾼等教育⾃学考试)什么是语法制导翻译为什么把这种⽅法叫语法制导翻译解答:所谓语法制导翻译,是指在语法规则的制导下,通过计算语义规则,完成对输⼊符号串的翻译。
由于使⽤属性⽂法时把语法规则和语义规则分开,但在使⽤语法规则进⾏推导或规约的同时⼜使⽤这些语义规则来知道翻译与最终产⽣⽬标代码,所以称为语法制导翻译。
3.给出将附值语句翻译成四元式的语法制导定义,允许右部表达式含有加法、乘法、取负、括号运算。
⽣成赋值语句X:=B*(C+D)+A 的四元式。
解答:赋值语句的⾃下⽽上的语法制导翻译过程描述为:规则语义动作(1)A::=i:=E {GEN (:=,,__,ENTRY(i) ) }(2)E::=E1+E2 {:=NEWTEMP;GEN(+,, ,}(3)E::= E1*E2 { :=NEWTEMP;GEN(*,, ,}(4)E::=-E1 { :=NEWTEMP;GEN(@,,__,}(5)E::=(E1) {:= }(6)E::=i {:= ENTRY(i) }⽣成的赋值语句X:=B*(C+D)+A的四元式为:(+,C,D,T1)(*,B,T1,T2)(+,T2,A,T3)(:=,T3,_,X)4.给出将布尔表达式翻译成四元式的语法制导定义。
解答:布尔表达式的语义⼦程序为:规则语义动作(1) E::=I {:=null;:=NXQ;GEN (Jez , ENTRY(i), __,0) }(2) E::= i1 rop i2 { :=null;:=NXQ;GEN (Jnrop,ENTRY(i1), ENTRY(i2),0)}(3) E::= (E1) {:=, :=; }(4) E::= ? E1 { :=NXQ;GEN ( J, __, __, 0); BP , NXQ);}(5) E A::=E1∧ { if =nullthen begin::=NXQ;GEN ( J, __, __, 0)End;BP ( , NXQ );:=null; := }(6) E ::= E A E2 {if ≠nullthen beginBP , NXQ);:=nullEnd:=; }(7) E0::=E1∨ { if :=nullthen begin:=NXQ;GEN ( J, __, __, 0)End;:=;BP ,NXG);}(8) E::=E0E2 { if ≠nullthen:=MERG,Else beginBP ,NXQ);:=End;:=}其中:NXQ指⽰器指向下⼀个将要形成但尚未形成的四元式的地址(编号),初值为1,每当执⾏GEN⼀次,NXQ⾃动加1。
编译原理分知识点习题-语法制导和翻译
1.一般情况下,为什么语义分析部分仅产生中间代码解答:一般情况下,语义分析部分仅产生中间代码,其原因是:可使难点分解,分别解决。
可对语义分析产生的中间代码进行优化,以产生高效率的目标代码。
语义分析通常与机器无关,目标代码往往与机器有关。
把语义分析与目标代码生成分开,可让一个语义分析程序适用于多个目标代码生成程序。
2.(湖北省高等教育自学考试)什么是语法制导翻译为什么把这种方法叫语法制导翻译解答:所谓语法制导翻译,是指在语法规则的制导下,通过计算语义规则,完成对输入符号串的翻译。
由于使用属性文法时把语法规则和语义规则分开,但在使用语法规则进行推导或规约的同时又使用这些语义规则来知道翻译与最终产生目标代码,所以称为语法制导翻译。
3.'4.5.给出将附值语句翻译成四元式的语法制导定义,允许右部表达式含有加法、乘法、取负、括号运算。
生成赋值语句X:=B*(C+D)+A的四元式。
解答:赋值语句的自下而上的语法制导翻译过程描述为:规则语义动作(1)A::=i:=E {GEN (:=,,__,ENTRY(i) ) }(2)E::=E1+E2{:=NEWTEMP;GEN(+,, ,}(3)E::= E1*E2{ :=NEWTEMP;'GEN(*,, ,}(4)E::=-E1{ :=NEWTEMP;GEN(@,,__,}(5)E::=(E1) {:= }(6)E::=i {:= ENTRY(i) }生成的赋值语句X:=B*(C+D)+A的四元式为:(+,C,D,T1)((*,B,T1,T2)(+,T2,A,T3)(:=,T3,_,X)6.给出将布尔表达式翻译成四元式的语法制导定义。
解答:布尔表达式的语义子程序为:规则语义动作(1) E::=I {:=null;:=NXQ;【GEN (Jez , ENTRY(i), __,0) }(2) E::= i1 rop i2 { :=null;:=NXQ;GEN (Jnrop,ENTRY(i1), ENTRY(i2),0)}(3) E::= (E1) {:=, :=; }(4) E::= ¬ E1 { :=NXQ;GEN ( J, __, __, 0); BP , NXQ);}(5) E A::=E1∧{ if =null】then begin::=NXQ;GEN ( J, __, __, 0)End;BP ( , NXQ );:=null; := }(6) E ::= E A E2 {if ≠null,then beginBP , NXQ);:=nullEnd:=; }(7) E0::=E1∨{ if :=nullthen begin>:=NXQ;GEN ( J, __, __, 0)End;:=;BP ,NXG);}(8) E::=E0E2 { if ≠nullthen::=MERG,Else beginBP ,NXQ);:=End;:=}其中:~NXQ指示器指向下一个将要形成但尚未形成的四元式的地址(编号),初值为1,每当执行GEN一次,NXQ自动加1。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
t中是类型值
Id n
n中变量名
填表动作符号也可带有属性:
@set_table↓t1 , n1
↓t1,n1
<变量表> ↓t 2
↓t2
可从前面得到称为继承属性, 继承前面的值
同上
属性翻译文法: 1.<说明> → Typet idn @set_table↓t1,n1 <变量表> ↓t2 2.<变量表> ↓t2 → ,id n @set_table↓t1,n1 <变量表>↓t3 3.< 变量表 > ↓t1 → ε
用相应的翻译文法推导,可得: E T T*F@* F*F@* (E)*F@*
(E+T@+)*F@* * (i@i+i@i @+)*i@i@*
(i@i+i@i @+)*i@i@*
活动序列:由翻译文法推导出的符号串,由终结符和动作 符号组成。 ●从活动序列中,抽去动作符号则得输入序列(i+i)*i ●从活动序列中,抽去输入序列,则得动作序列,执行动
5.1 翻译文法和语法制导翻译
有上下无关文法G[E]:
1. E →E+T
4. T →F
2. E →T
5. F →(E)
3. T →T*F
6. F →I
此文法是一个中缀算术表达式文法
翻译的任务是: 中缀表达式 逆波兰表示 a+b*c abc*+
假如我们的翻译任务是要将中缀表达式简单变换为波兰后 缀表示,只需在上述文法中插入相应的动作符号。
翻译文法所定义的翻译是由输入序列和动作序列组成的对偶集 如:(i+i)*i, @i@i@+@i@* →ii+i*
i+i*i @i@i@i@*@+ 因此,给定一个翻译文法,就给定了一个对偶集
5.2 属性翻译文法
在翻译文法的基础上,我们可以进一步定义属性文法, 翻译文法中的符号,包括终结符、非终结符和动作符号 均可带有属性,这样能更好的描述和实现编译过程。
翻译文法:
1. <说明> → Type id @set_table <变量表> 2. <变量表> → ,id @set_table <变量表>
3. < 变量表 > → ε
填表时需要的信息?类型,名字,以及位置(可以用全程变量 的指针)如何得到?
类型和名字在词法分析时得到,可设两个综合属性。
Type t
3. <变量表> → ε
其中
Type: 类型名,值为integer,real,boolean等,词法分析程序返回的类型的类
别码。
id 变量(值:标识符本身)
上述文法的说明语句:integer A,B1
该文法向上翻译任务:将声明的变量填入符号表
符号表
完成该工作的动作符号:@set_table
A整型
B1整型
作序列,则完成翻译任务: @i@i@+@i@* ii+i*
定义5.1 翻译文法是上下文无关文法,终结符号集由输入符号
和动作符号组成。由翻译文法所产生的终结符号串称为活 动序列。
以上例题中的翻译文法为: GT=(Vn, Vt, P, E) Vn={E, T, F} Vt={i, +, *, (, ), @ +, @ *, @i} P={E→E+T@ +, E→T,T→T*F@*,T→F,F→(E), F→i@i}
属性可以分为两种:
综合属性
பைடு நூலகம்继承属性
5.2.1 综合属性
基本操作数带有属性的表达式文法G[E]
1.E→E+F
4.T→F
2.E→T
5.F→(E)
3.T→T*F
6.F→i C
其中↑C综合属性符号,↑为综合属性标记,c为属性变量 或者属性值
此文法能够产生如下的输入序列: (i 3 +i 9)*i 2
下面给出输入文法和翻译文法的概念:
输入文法:未插入动作符号时的文法。 由输入文法可以通过推导产生输入序列。
翻译文法:插入动作符号的文法。 由翻译文法可以通过推导产生活动序列 输入序列 动作序列
例:( i+i ) * i 可以用输入文法推出: E T T*F F*F (E)*F (E+T)*F * (i+i)*i
根据给定的文法,可写出该输入序列的语法树
E
E 24
T
T 24
T*F
F
i 2
(E)
自底向上 的属性计算
T 12 * F 2
F 12
i 2
( E 12 )
E +T TF F i 9 i 3
所以用表示属性计 算是自底向上的, 称为综合属性。
E 3 + T 9
T 3
F 9
F 3
i 9
i 3
为了形式地表示上述表达式的属性求值过程,我们可以改写上述文法:
6.F p1
i q1
说明:
• p,q,r为属性变量名
• 属性变量名局部与每个产生
式,可使用不同的名字。
p 1 :=q 1 ;
•求值规则:综合属性是自右向左,自底 向上
5.2.2 继承属性
考虑到下列文法:G[<说明>]:
1. <说明> → Type id <变量表> 2. <变量表> → , id <变量表>
1. E →E+T 2. E →T 3. T →T*F
4. T →F 5. F →(E) 6. F →i
1. E →E+T@+ 2. E →T 3. T →T*F @*
4. T →F 5. F →(E) 6. F →i@i
其中: @+,@*,@i 为动作符号。@为动作符号标记,后面为字符串。 在该具体例示中,其对应语义子程序的功能是要输出打印动作 符号标记后面的字符串。 所以:产生式1:E→E+T@+ 的语义是分析E, +和T输出+ 产生式6:F→i @ i 分析i输出i
符号串翻译文法:输入文法中的动作符号对应的语义子程序 是输出动作符号标记@后的字符串的文法。
语法制导翻译:按翻译文法进行的翻译。 给定一输入符号串,根据翻译文法获得翻译该符号串的动作 序列,并执行该序列所规定的动作过程。
语法导制翻译的实现方法:
在文法的适当位置插入语义动作符号,当按文法分析到动作 符号时就调用相应的语义子程序,完成翻译任务
产生式
求值规则
1.E p4
E + T q5
r2
(q 5:=p 3;) p 4:=q 5+r 2 ;
2.E p2
T q4
p 2:=q 4 ;
3.T p2
T q3 * F r1
p 2:=q 3*r 1 ;
4.T p2
F q2
p 2:=q 2 ;
5.F p1
(E ) q1
p 1 :=q 1 ;
5.0 本章导言
词法分析,语法分析:解决单词和语言成分的识别 及词法和语法结构的检查。语法结构可形式化地用 一组产生式来描述。给定一组产生式,我们能够很 容易地将其分析器构造出来。
本章要介绍的是语义分析和代码生成技术。
程序语言的语义形式化描述目前有三种基本描述方 法,即:
• 操作语义 • 指称语义 • 公理语义