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

合集下载

编译原理张晶版 第七章 语法制导翻译和中间代码生成

编译原理张晶版 第七章 语法制导翻译和中间代码生成

(1)s=s0
(2)s=s1 (3)s=ε
课程名称
第七章 语法制导翻译和中间代码生成(22)
输入输出对可由(,)表示,其中是输入句子形式而是输出句子形 式。
(S,S)开始用产生式s0s来扩展得到(0S,S0).
再用一次规则(1),得到(00S,S00)。 再用规则(2),就得到(001S,S100). 然后应用规则(3)并得到(001,100)。
L id
T.type=integer T.type:=real
L1.in:=L.in addtype(id.entry,L.in) addtype(id.entry,L.in)
课程名称
第七章 语法制导翻译和中间代码生成(17)
Real id1,id2,id3
D T.type=real real L.in= real L.in= real , id3
E T T F F
T T1 * F F (E) digit
设表达式为3*5+4,则语义动作打印数值19
. L
E.val=19 E.val=15
+
T.val=3 F.val=3 digit.lexval=3 F.val=5
*
F.val=4
digit.lexval=4 digit.lexval=5
课程名称
第七章 语法制导翻译和中间代码生成(23)
课程名称
第七章 语法制导翻译和中间代码生成(3)
属性文法 表达式文法 E—>T+T| T or T T—>n | b ET1 + T2 { T1.type = int T2.type= T1.type E.type :=int} E T1 or T2 { T1.type = bool T2.type= T1.type E.type :=bool} T n { T.type := int} T b { T.type := bool}

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

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

13
属性文法
属性文法是一个三元组:A=(G,V,F),其中 G:是一个上下文无关文法。 V:属性的有穷集,每个属性与文法的一个终 结符或非终结符相连,这些属性代表与文 法符号相关信息,如它的类型、值、代码 序列、符号表内容等等 .属性与变量一样, 可以进行计算和传递。
14
F:关于属性的属性断言或一组属性的计 算规则(称为语义规则) 。 断言或语义 规则与一个产生式相联,只引用该产生 式左端或右端的终结符或非终结符相 联的属性。
在文法的每个 产生式后配了 一个有{ }括起 来的语义子程 序。
4
对(i+i)*i的翻译
不难证明该符号串是文法的合法句子。 按照这个句子向文法开始符号E的归约次 序,且每当归约时调用该句柄的产生式所 对应的语义子程序,便可得到相应的数字 串:64264154632。
5
这个例子表明: (i+i)*i
§ 7.7
控制流语句 的翻译
41
if语句的翻译
if E then S1 else S2,其中E为布尔式
E的代码序列
真出口 假出口
S1的代码序列
S2的代码序列
42
E 的代码
E.true: E.false: S1的代码
E.true E.false
goto out
S2的代码 out:
43
例子
if A∨ B < D then S1 else S2 (1) ( jnz , A , _ , 5 ) 真出口 (2) ( j , _ , _ , 3 ) 不是最优翻译 (3) ( j< , B , D , 5 ) (4) ( j , _ , _ , p+1 ) 假出口 (5) ( 关于S1的四元式序列 ) ………… (p) ( j , _ , _ , q ) (p+1) ( 关于S2的四元式序列 ) ………… (q)

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

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

《编译系统设计实践》实验项目三:语法制导翻译与生成中间代码学号::年级:学院:数计学院专业:计算机本组其它成员:学号学号实验时间:2016-2017学年第一学期任课教师:一、实验目的通过语法制导或翻译模式生成中间代码。

二、实验容在自底向上语法分析基础上设计语义规则(语法制导翻译),将源程序翻译为四元式输出,若有错误将错误信息输出。

三、设计思路1.分析过程主函数,读取文件,存入字符串数组,调用语义分析,判断关键字,调用相应的语义规则(这里只有if和while和赋值语句),赋值语句调用表达式处理,if语句调用条件表达式处理,while也是调用表达式处理,然后是一个递归过程,不断的递归调用,按序输出三地址语句。

在本例程序中选用expr及num 作为运算数。

2.主要函数string link() //字符串和数字的连接string element() //获取表达式中的元素对象string expression() //处理表达式string expression_1() //处理表达式string biaodashi() //处理表达式,转为三地址输出string biaodashi_1() //递归---处理表达式,转为三地址输出string getOperator() //判断并获取运算符void condition(int L1,int L2) //输出if语句的条件的三地址代码void yuyifenxi_list() //生成并输出条件返回地址void yuyifenxi_list_1() //递归---生成并输出条件返回地址void yuyifenxi(int next,int &flag) //判断关键字,调用相应的产生式分析void readfile() //文件读入四、测试报告1.第一组测试:图1-1 输入待翻译代码图1-2 中间代码生成2.第二组测试:图2-1 输入待翻译代码图2-2 中间代码生成3.第三组测试:错误待翻译代码图3-1 输入待翻译代码图3-2 中间代码生成五、实验总结实验三的重点在于判断关键字,调用相应的产生式分析及处理表达式,转为三地址输出部分,也是很费时间的难点部分,但通过查阅书本及网上资料,还是将其以多个处理函数的递归调用实现了,虽然最后实现结果对错误的分析还不够精确有些差强人意,但毕竟还算有些收获了。

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

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

(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

第7章 语义分析与中间代码生成

第7章 语义分析与中间代码生成
2013-7-25 2

第6章小结
• 注释分析树和相应的依赖图是属性值的关联 关系和计算顺序的表达形式,语义关系可以 使用抽象语法树表示。 依据语法分析方法有自底向上的和自顶向下 的,语法制导翻译既可以按照自底向上的策 略进行,也可以按照自顶向下的策略进行。

2013-7-25
3
第7章 语义分析与中间代码生成
第6章小结
• • 语法分析中进行静态语义检查和中间代码生 成的技术称为语法制导翻译技术。 为了通过将语义属性关联到文法符号、将语 义规则关联到产生式,有效地将语法和语义 关联起来,人们引入了语法制导定义。没有 副作用的语法制导定义又称为属性文法。
2013-7-25
1
第6章小结
• 为相应的语法成分设置表示语义的属性,属 性的值是可以计算的,根据属性值计算的关 联关系,将其分成综合属性和继承属性,根 据属性文法中所含的属性将属性文法分成S属性文法和L-属性文法。 如果不仅将语义属性关联到文法符号、将语 义规则关联到产生式,而且还通过将语义动 作嵌入到产生式的适当位置来表达该语义动 作的执行时机,这就是翻译模式。翻译模式 给语义分析的实现提供了更好的支持。
2013-7-25
arg2 result t1 d t2 d t4 t2 t3 t4 t5 a
5 assign
图7.2(a) 图7.1中三地址码的四元式表示
11
三元式
• 为了节省临时变量的开销,有时也可以使用只有三个域的三 元式来表示三地址码。三元式的三个域分别称为op,arg1和 arg2,op,arg1和arg2的含义与四元式类似,区别只是arg1和 arg2可以是某个三元式的编号(图7.2(b)中用圆括号括起来的数 字),表示用该三元式的运算结果作为运算对象。

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

语法制导翻译和中间代码生成
addtype(id.entry,L.in)
继承属性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】

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

编译程序原理与实现:第7章 中间代码生成(1)

编译程序原理与实现:第7章 中间代码生成(1)

--- 传值
• 结构语句
• (THEN, t ,_ ,_ )
--- THEN分支标记
• (ELSE, _ , _ ,_ )
--- ELSE分支标记
• (ENDIF, _ , _ , _ )
--- IF语句结束四元式
• (WHILE, _ , _ , _ )
---WHILE语句开始标记
• (DO,t,_ ,_ )
• 三地址中间代码
• 三地址:两个操作分量和一个结果的抽象地址;
• 为方便起见, 通常用变量名代替抽象地址;
• 三元式
• No. (op, operand1, operand2) • 编号 (操作符, 操作分量1, 操作分量2) • 其中操作分量可以是变量名(抽象地址)或者编号
• 四元式
• (op, operand1, operand2, result) • (操作符, 操作分量1, 操作分量2, 结果) • 其中操作分量可以是变量名(抽象地址)或者临时变量(抽象地址)
--- 函数出口
• (CALL, f, true/false, Result) --- 调用函数f,返回值给Result
• (RETURN, -,-, -)
• (RETURN, -,-, t)
• 传递参数
• (VARACT, id, offset, size )
--- 传地址
• (VALACT, id, offset, size )

{ op = pop(S1,1); (str1, str2)=pop(S2,2);

push(S2, str2+str1 + “op”);

}

push(S1,tk); goto (2);
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(op ,arg1,arg2,result) 或 result:= arg1 op arg2
四元式形式:
31
翻译 a:= -b+c*d
t1:=uminus b
S a := E
t2:=c*d t3:=t1+t2 a:=t3
E1 - E 11
b
+ E 21
c
E2 * E 22
d
32
类型转换
如:X := Y + I * J,X,Y为实型,I,J为整型, 则相应的四元式序列应为: (*i , I , J , T1 ) ( itr , T1 , _ , T2 ) ( +r , Y , T2 , T3 ) ( := , T3 , _ , X )
间接三元式
用一张间接码表辅以三元式表的办法 来表示中间代码。 例:X:=(A+B)*C Y:=D↑(A+B) 三元式表 间接码表 (1) ( + , A , B ) (1) (2) ( * , (1) , C ) (2) (3) (:= , X , (2) ) (3) (4) ( ↑ , D , (1) ) (1) (5) (:= , Y , (4) ) (4) (5)
28
四元式
1. 四元式对中间结果的引用必须通过 给定的名字,而三元式是通过产生中间结 果的三元式编号。四元式之间的联系是通 过临时变量实现的。 2. 四元式出现顺序与原表达式计算顺 序一致。(同三元式)
29
§ 7.6
简单赋值 语句的翻译
30

文法:S→i:=E
E→E+E|E*E|-E|(E)|id
44
if a<b or c<d and e>f then S1 else S2
(1) if a<b goto (7) 转移至E.true,即S1的四元式 (2) goto (3) (3) if c<d goto (5) (4) goto (p+1) 转移至E.false,即S2的四元式 (5) if e>f goto (7) 转移至E.true (6) goto (p+1) 转移至E.false (7) (关于S1的四元式) E.true ………… (p) goto (q) (p+1) (关于S2的四元式) E.false ………… (q)

9
如何实现这种翻译
至此不难明白,语法制导翻译的关键 是为每个产生式写相应的语义子程序。 例子中的print产生式序号这种语义子 程序是为了输出数字串而写的语义子程序。 所以一个语义子程序描述了一个产生式对 应的翻译工作。 这些工作有:改变编译程序某些变量 的值、查填各种符号表、发现并报告源程 序错误、产生中间代码。 10
语义子程序的一般形式
语义子程序写在该产生式后面的花括号内: (1) X… { 语义子程序1 } (2) Y… { 语义子程序2 } (3) AXY { 语义子程序3 }
11
§ 7.1 属性文法
12
属性文法与语法制导翻译的关系
对于某个压缩了的文法,当把每个文法符 号和一组属性相关联,并把产生式附加以 语义规则的时候,就得到属性文法。 语法制导的翻译过程:由于属性文法的规 则和产生式是一一对应的关系。所以,由 属性文法确定的语义分析可以在语法分析 的过程中进行。这个过程成为语法制导的 翻译。
15
属性文法的例子
简单算术表达式求值的语义描述
产生式 L E E T T F F E E1+T T T1 * F F (E) 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
16
§ 7.2
自底向上语 法制导翻译 概述
17
表达式为3*5+4,则语义动作打印数值19
L
E.val=19
E.val=15 + T.val=15 F.val=4 F.val=5 * digit.lexval=5 digit.lexval=4 T.val=4
T.val=3
F.val=3
digit.lexval=3
§ 7.7
控制流语句 的翻译
41
if语句的翻译
if E then S1 else S2,其中E为布尔式
E的代码序列
真出口 假出口
S1的代码序列
S2的代码序列
42
E 的代码
E.true: E.false: S1的代码
E.true E.false
goto out
S2的代码 out:
43
例子
if A∨ B < D then S1 else S2 (1) ( jnz , A , _ , 5 ) 真出口 (2) ( j , _ , _ , 3 ) 不是最优翻译 (3) ( j< , B , D , 5 ) (4) ( j , _ , _ , p+1 ) 假出口 (5) ( 关于S1的四元式序列 ) ………… (p) ( j , _ , _ , q ) (p+1) ( 关于S2的四元式序列 ) ………… (q)
21
上述三种方法的比较
三种方法的共同点:
1. 运算量个数不变,顺序也不变。 2. 运算符个数不变。
逆波兰式的优点:
1. 是一个无括号表达式。 2. 逆波兰式的运算符出现的顺序就是原表达 式的运算顺序,因而计算方便。
22
举例
1. (a+b)*(c+d) ab+cd+* 2. 赋值语句的后缀式 A:=B+C ABC+:=
第7章
语法制导翻译 和中间代码 生成
❤❤
1
经过词法分析、语法分析后,源程序 在静态结构上的正确性得到了保证,编译 程序接着要对源程序进行静态语义检查和 翻译。 语义检查:类型检查、控制流检查、 一致性检查等。 翻译:源程序→中间代码
2
本章主要内容
1. 属性文法 2. 语法制导翻译概念 3. 中间代码的几种形式 4. 几个语句的翻译:如赋值语句、条件语句等。
26
树形表示
表达式的树形表示: 1. 简单变量或常数的树就是该变量或常数自身。 2. 如果表达式e1和e2的树分别为T1和T2,那 么e1+e2,e1*e2,-e1的树分别为: + * T1 T2 T1 T2 T1 树形表示是三元式的翻版。
27
四元式
组成: OP ,ARG1 ,ARG2 ,RESULT 如:a:=b*c+b*d的四元式为: (1) ( * , b , c , t1 ) (2) ( * , b , d , t2 ) (3) ( + , t1 , t2 , t3 ) (4) ( := , t3 , _ , a ) 更易理解的形式 t1 := b * c t2 := b * d t3 := t1 + t2 a : = t3
45
控制语句中的回填技术
上例中的一些转移地址并不能不产生 这些四元式的同时得知。 也就是说,一个布尔式的真假出口往 往不能在产生四元式的同时就确定。 因此,要回填这些地址。

13
属性文法
属性文法是一个三元组:A=(G,V,F),其中 G:是一个上下文无关文法。 V:属性的有穷集,每个属性与文法的一个终 结符或非终结符相连,这些属性代表与文 法符号相关信息,如它的类型、值、代码 序列、符号表内容等等 .属性与变量一样, 可以进行计算和传递。
14
F:关于属性的属性断言或一组属性的计 算规则(称为语义规则) 。 断言或语义 规则与一个产生式相联,只引用该产生 式左端或右端的终结符或非终结符相 联的属性。
A ∨ B→if A then true else B A ∧B→if A then B else false ┐ A →if A then false else true
这种翻译法涉及到如何翻译if-then-else 的问题,将在下面具体讨论。
39
作为条件转移的E的翻译
仅把E翻译成仅含条件真转和无条件转的 四元式。 (jnz , A , _ , p): 若A为真,转向第p个四元式 (jθ,A ,B , p): 若AθB为真,转向第p个四元式 (j , _ , _ , p): 无条件转向第p个四元式 40
37
例子
1. a or b and not c (1) t1:=not c (2) t2:=b and t1 (3) t3:=a or t2 2. A∨B∧C=D (=, C, D, T1) (∧, B, T1, T2) (∨, A, T2, T3)
38
2. 采取优化措施,只计算部分表达式。 如A or B,如果A为1,B就无需计算; 如A and B,如果A为0,则B就无需计算。
不难证明该符号串是文法的合法句子。 按照这个句子向文法开始符号E的归约次 序,且每当归约时调用该句柄的产生式所 对应的语义子程序,便可得到相应的数字 串:64264154632。
5
这个例子表明: (i+i)*i
64264154632
这是一种变换,而变换的规则是每当 归约时调用相应的语义子程序。无疑这个 例子是翻译的一个十分简单的模型。
6
翻译要解决的问题
1. 翻译成什么样的代码? 2. 什么时候实现这种变换(翻译)? 3. 如何实现这种翻译?
7
翻译成什么样的代码
按照相应语义规则产生一种介于源语 言与目标代码之间的一种代码(中间代码), 它不依赖于机器但又便于产生依赖于机器 的目标代码。 中间代码可用多种方式表示,常见的 有:逆波兰表示法、树形表示法、三元式、 四元式等。
相关文档
最新文档