编译原理作业解析——第五章语法制导翻译技术

合集下载

编译原理课件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 中间代码

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

编译原理第五章 语法制导翻译及中间代码生成
① ② ③ ④ (U_minus, b, - ) ( + , c, d ) ( * , ①, ② ) ( := , ③, a )
式①中的运算符U_minus表示一元减运算。
翻译程序中使用的辅助函数
⒈int LookUp(char *Name)—以Name查 符号表,若查到则返回相应登记项的序号 (≥1),否则返回0。 ⒉int Enter(char* Name)—以Name为名 字在符号表中登录新的一项,返回值为该项 的序号。 ⒊int Entry(char *Name)—以Name为名 字查、填符号表:
定义 5.3 对每个产生式p:X0→X1X2…Xn , 设属性定义性出现的集合为 AF(p)={Xi.a|Xi.a=f(Xk1.ak1,…,Xkm.ak m) ∈R(p), 0≤kj≤n} 若Xi 是产生式左部的非终结符(即i=0),则称 属 性 Xi.a 是 综 合 属 性 (Synthesized Synthesized Attributes);若Xi 出现在产生式的右部(即 Attributes 1≤i≤n),则称Xi.a是继承属性(Inherited Inherited Attributes)。 Attributes
逆波兰表示
每一运算符都置于其运算对象之后,故称 为后缀表示。 特点: 特点:表达式中各个运算 运算是按运算符出现的 运算符出现的 顺序进行的,无须使用括号来指示运算顺 顺序进行的 序,因而又称为无括号式 无括号式。
逆波兰表示逆波兰表示-例子
中缀表示 后缀表示
A+B AB+ A+B*C ABC*+ (A+B)*(C+D) AB+CD+* x/y^z-d*e xyz^/de*(a=0∧b>3)∨(e∧x<>y) 思考:能否表示if e then s1 else s2这样的语句? a0=b3>∧exy<>∧∨ ∧ ∧∨ 将后缀式的符号存放在POST[n]中,

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

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

编译原理课件05语法制导翻译技术和 中间代码生成
21、静念园林好,人间良可辞。 22、步步寻往迹,有处特依依。 23、望云惭高鸟,临木愧游鱼。 24、结庐在人境,而无车马喧;问君 何能尔 ?心远 地自偏 。 25、人生归有道,衣食固其端。
46、我们若已接受最坏的,就再没有什么损失。——卡耐基 47、书到ቤተ መጻሕፍቲ ባይዱ时方恨少、事非经过不知难。——陆游 48、书籍把我们引入最美好的社会,使我们认识各个时代的伟大智者。——史美尔斯 49、熟读唐诗三百首,不会作诗也会吟。——孙洙 50、谁和我一样用功,谁就会和我一样成功。——莫扎特

编译原理第五章语法制导翻译

编译原理第五章语法制导翻译

状态 0 1 2 3 4 5 6 7 8
+
s5 r4 r3 r1 r2
LR(0)分析表 action o n b # S4 S3 acc s7 r4 r4 r4 r4 r3 r3 r3 r3 s4 s3 r1 r1 r1 r1 s4 s3 r2 r2 r2 r2
GOTO E T 1 2
6 8
LR分析器的栈加入语义值。
的前缀表示法相比较,其共同的特点是: 1. 运算符的个数不变 2. 运算量的次序和个数不变 同时, 逆波兰表示法还具有两个明显的优点: 1. 无括号,形式简洁清楚 2. 运算符的顺序与运算的次序完全相同
(4)相关名字检查。有时,同一名字必须出现两 次或多次。例如,Ada 语言程序中,循环或程 序块可以有一个名字,出现在这些结构的开头 和结尾,编译程序必须检查这两个地方用的名 字是相同的。 (5)名字的作用域分析

如果语义正确,则进行中间代码的翻译。
中间代码
何谓中间代码 . Intermediate code Intermediate representation Intermediate language
第五章 语法制导翻译和 中间代码的生成
本章的主要内容
语法制导翻译的基本思想;
典型的中间代码表示法;
产生中间代码的语义子程序设计;
各种基本语言成分的自下而上分析的制导
翻译; 类型检查的基本原理。

语义分析是干什么的?
其任务是对语法分析所识别出的各类语法范畴, 分析其含义,并进行初步翻译。 包括两个方面的工作。 首先是对各种语法范畴进行静态语义检查,例 如,变量是否定义、类型是否正确等等。 如果语义正确,则进行中间代码的翻译。

编译原理 第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) 上下文无关文法和属性/规则的结合;

第五章++语法制导翻译(2)

第五章++语法制导翻译(2)

X.x Y.y Z.z top
编译原理
4
L→En E → E1 + T E→T T → T1 * F T→F F→ (E) → F → 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; }
编译原理 31
表达式9 5+2的计算 表达式9-5+2的计算
E val T.val=9 num.val=9 i=9Rs
-
T.val=5
i=4Rs i=6Rs
num.val=5 + T.val=2 num.val=2
编译原理
ε
32
例5.15 转换后的构造语法树的翻译模式
E→T R R→+ T R1 R→T R1 R→ε T→( E ) T → id T → num
A → A1Y A→X { A.a := g (A1.a, Y.y) } { A.a := f (X.x) }
消除左递归后: A→X { R.i := f (X.x) } R { A.a := R.s } R→Y { R1.i := g (R.i, Y.y) } R1 { R.s := R1.s } R→ε { R.s := R.i }
编译原理
8
例5.16 翻译为前缀表达式
L→En E → {print(‘+’)} E1+ T E→T T → {print(‘*’)} T1* F T→F F → (E) F → digit {print(digit.lexval)}

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

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

必须使用下标进行区分。例: number1number2digit
8

example
1) 已知无符号数文法如下,请改写成值属性文法,并对345 进行语义分析。 number number digit | digit digit 0|1|2|3|4|5|6|7|8|9 解: grammar rule
21
对 345进行属性值计算的语法树
number (val=34*10+5=345)
number (val=3*10+4=34)
number (val=3) digit (val=4) 4
digit (val=5) 5
digit (val=3) 3
22

example
2) 已知简单的整数算术表达式文法如下,请改写成值属性文 法,并对 (34-3)*42 进行语义分析。 exp exp + term | exp-term | term term term*factor | factor factor (exp) | number 解: grammar rule exp1 exp2+term exp1 exp2-term exp term term1 term2*factor term factor factor (exp) factor number
10
■ 练习
1.简单的整数算术表达式文法如下,请改写成 值属性文法。 E E+ T | T T T*F | F F (E) | I 2. 已知无符号数文法如下,请改写成值属性 文法。 NND|D D0|1|2|3|4|5|6|7|8|9
11
属性分为两类:综合属性和继承属性.一般情况下, 综合属性属于”自下而上”传递信息,继承属性用于 ”自上而下”传递信息. 又根据不同的处理要求,属性可以多种方式出现, 也就是说,与文法符号相关联的可以是各种属性、 语义规则,或者某种程序设计语言的程序段等。

编译原理5语法制导翻译技术和中间代码生成new

编译原理5语法制导翻译技术和中间代码生成new

作一个100次的循环:
i:=1;
10: if i<=100 then begin s:=s+i; i:=i+1; goto 10
end
i 1 := i 100 <= 21 FJ s s 1 2 3 4 5 i + := i i 1 + := 4 RJ
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
5.3语法制导翻译概述 语法制导翻译法的基本思想:对文法中的每个产生式都附加 上一个语义动作或语义子程序,在执行语法分析的过程中, 每当使用一条产生式进行推导或归约时,就执行相应的产生 式的语义动作。 这些语义动作不仅指明了该产生式所产生的符号串的意义, 而且还根据这种意义规定了对应的加工动作,从而完成预定 的翻译工作。 语法制导翻译法就是在语法分析过程中随着分析的逐步发展, 根据相应文法的每一规则所对应的语义子程序进行翻译的方 法。具体分为自底向上语法制导翻译和自顶向下语法制导翻 译两种。
k:=i*i –j * j ;
i:=0 ; j:=0 End
4 )循环语句的逆波兰表示
对于所有循环语句,我们都可以把它改造为条件语句和转向语 句的组合。
例:for i:=a to b do S:=S+i 可以改写为: i:=a; 10: if i<=b then begin S:=S+i; i:=i+1; goto 10 end
例:赋值语句
x:=5 逆波兰式:x5:=; x:=a*b-c/d 逆波兰式:xab*cd/-:=
2)转向语句的逆波兰式表示 转向语句:goto〈标号〉 逆波兰表示为:〈标号〉LJ 3)条件语句的逆波兰表示
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第十三次作业 P194 1、2、4(2)(4) 5(3) 8 10 5. 将下列后缀式改写为中缀式表示: (1) abc-*cd+e/- : 解答: a*(b-c)-(c+d)/e (3) abc+a0>∧ab+0<>a0<∧∨ : 解答: (a b+c∧a>0) ∨(a+b<>0∧a<0)
第十三次作业 P194 1、2、4(2)(4) 5(3) 8 10
8. 写出下列赋值语句的自下而上语法制导翻译过程, 并给出产生四元式序列:a:=b*(c+d)
解 答:
第十三次作业 P194 1、2、4(2)(4) 5(3) 8 10
解 答:
第十三次作业 P194 1、2、4(2)(4) 5(3) 8 10 8. 写出下列赋值语句的自下而上语法制导翻 译过程,并给出产生四元式序列: 解 a:=b*(c+d)
编译原理作业解析—— 第五章语法制导翻译技术
第十三次作业 P194 1、2、4(2)(4) 5(3) 8 10
1. 按照语法 解答: 制导翻译的 一般原理, 给出表达式 (5*4+8)*2 的语法树各 结点并注明 语义值VAL。
第十三次作业 P194 1、2、4(2)(4) 5(3) 8 10
2. 给出下面表达式的后缀式表示: (3) a+b*(c+d/e) : abcde/+*+ (4) (a∧b)∨(┐c∨d) : ab∧c┐d∨∨ (5) –a+b*(-c+d) : a-bc-d+*+ (6) (a∨b) ∧(c∨┐d∧e) : ab∨cd ┐e∧∨∧ (7) if (x+y)*z<>0 then (a+b)↑c else a↑b↑c xy+z* p1 JEZ ab+c↑ p2 JUMP ab↑c↑ P1=15 P2=20
四元式序列如下所示: (1) (jnz, a, , 3) a的四元式,当a为真时,则转向第3个四元式 (2) (j, , , 0) (3) (jnz, b, , 5) b的四元式,当b为真时,则转向第3个四元式 (4) ( j, , , 2) 无条件转向第2个四元式 (5) (j>, c, d, 0) c>d的四元式 (6) (j, , , 4) 无条件转向第4个四元式 <BE>•TC表示<BE>真出口的链首 <BE>•FC表示<BE>假出口的链首 每个链尾的四元式第4分量均为0,,c,d ,T1) (*,b, T1,T2) (:=, T2, , a)
1( +, c, d) 2(*, b, (1)) 3(:=, a, (2))
10. 将下列布尔表达式翻译成四元式序列,并给出语法制导翻译 过程(作为条件控制): 第十三次作业(6月8日布置) a∧b∧c>d
解答:
P195
预祝

家 考





相关文档
最新文档