编译原理课件05语法制导翻译技术和中间代码生成
合集下载
编译原理第五章 语法制导翻译及中间代码生成
① ② ③ ④ (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]中,
式①中的运算符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]中,
[理学]第5章 语法制导翻译及中间代码ppt课件
EE1+E2 {E.val := E1.val +E2.val}
E(E1) {E.val := E1.val }
En {E.val := n.lex}
例1 表达式计算的语法制导定义
产生式 LE E E1+T E T T T1*F T F F (E) F digit
语义规则 print(Eval) 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 := digitlexval
属性文法是一个三元组:
A=(G,V,F), G: 是一个上下文无关文法 V: 有穷的属性集,每个属性与文法的一终结符或非终结符 相连。 F: 关于属性的属性断言或谓词集.每个断言与一个产生式 相联。一个断言即一个语义规则,描述各属性关系。
属性文法的主要思想有两点: 对于每个文法符号引进相关的属性符号; 对于每个产生式写出属性值计算的规则。
栈
S1 Xm Vm
…… …
S1 X1 V1 S0 # -
状符 语 态号 义
Input#
总控程序
output
ACTION GOTO LR分析表
例如:2+3*5的分析和计值过程
步骤 动作 1) 2) 3) r6 4) r4 5) r2 6) 7) 8) r6 9) r4 10) 11) 12) r6 13)r3 14)r1 15)接受
1、属性文法(Syntax-directed definitions)
(1) 属性 对文法的每一个符号, 引进一些属性,这些属性代表与
文法符号相关的信息,,如类型、值、存储位置等。属性值, 可以在语法分析过程中计算和传递。
E(E1) {E.val := E1.val }
En {E.val := n.lex}
例1 表达式计算的语法制导定义
产生式 LE E E1+T E T T T1*F T F F (E) F digit
语义规则 print(Eval) 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 := digitlexval
属性文法是一个三元组:
A=(G,V,F), G: 是一个上下文无关文法 V: 有穷的属性集,每个属性与文法的一终结符或非终结符 相连。 F: 关于属性的属性断言或谓词集.每个断言与一个产生式 相联。一个断言即一个语义规则,描述各属性关系。
属性文法的主要思想有两点: 对于每个文法符号引进相关的属性符号; 对于每个产生式写出属性值计算的规则。
栈
S1 Xm Vm
…… …
S1 X1 V1 S0 # -
状符 语 态号 义
Input#
总控程序
output
ACTION GOTO LR分析表
例如:2+3*5的分析和计值过程
步骤 动作 1) 2) 3) r6 4) r4 5) r2 6) 7) 8) r6 9) r4 10) 11) 12) r6 13)r3 14)r1 15)接受
1、属性文法(Syntax-directed definitions)
(1) 属性 对文法的每一个符号, 引进一些属性,这些属性代表与
文法符号相关的信息,,如类型、值、存储位置等。属性值, 可以在语法分析过程中计算和传递。
编译原理-语法制导翻译和中间代码生成
例:类型、运算、维数、越界
–语义处理:
执行真正的翻译,生成程序的中间代码目标代码。
–例:变量的存储分配
–例:表达式的求值
–例:语句的翻译(中间代码的生成)
3
8.1 属性文法
• 语义分析的描述 –描述语法规则的同时,编写相应的语义 动作和计算顺序
• 语义的形式化描述 –操作语义学、公理语义学、指称语义学
例8-3 3*5+4 的 语法树与属性计算
T.val=3 F.val=3 digit.lexval=3
E.val=15 T.val=15
*
L Print(19)
E.val=19 +
T.val=4
F.val=4
F.val=5
digit.lexval=4
dgit.lexval=5
19
T.type=real
• 继承属性 – 从其兄弟结点和父结点的属性值计算出来的 – 如:L.in
• 固有属性(单词属性)
17
属性的计算
• 语法制导翻译:作语法分析,构造语法树,然 后在树的每个结点上添加相应的语义规则
• 综合属性 – 自底向上按照语义规则来计算各结点的综合 属性值
• 继承属性 –需要探讨计算次序
18
文法
E→ -E1 E.p:= mknode('-', 0, E1.p)
E→ (E1) E.p:= E1.p E→ id E.p:= mkleaf(id, id.entry) E→ num E.p:=mkleaf(num,num.val)
37
生成后缀式的属性文法
产生式
语义规则
S→id:=E Print( || E.code || “:=”)
第5章 语法制导翻译技术和中间代码生成
14
E
E {N1.type=N2.type}
N 3
+
N 4
{N1.type=int} N
+
N {N2.type=int} 4
3
输入串3+4的语法树 的语法树 输入串
结点带有语义信息的语法树
15
属性分为: 属性分为:继承属性与综合属性
1.综合属性用于“自下而上”传递信息。 综合属性用于“自下而上”传递信息。 综合属性用于 综合属性由相应语法分析树中结点的分枝结点(即子结点 即子结点) 综合属性由相应语法分析树中结点的分枝结点 即子结点 属性计算得到,其传递方向与继承属性相反, 属性计算得到,其传递方向与继承属性相反,即沿语法分 析树向上传递,从分枝结点到根结点。 析树向上传递,从分枝结点到根结点。 2.继承属性用于“自上而下”传递信息。 继承属性用于“自上而下”传递信息。 继承属性用于 继承属性由相应语法树中结点的父结点属性计算得到, 继承属性由相应语法树中结点的父结点属性计算得到,即 沿语法树向下传递,由根结点到分枝(子 结点 结点, 沿语法树向下传递,由根结点到分枝 子)结点,它反映了 上下文依赖的特性 的特性。 对上下文依赖的特性。继承属性可以很方便地用来表示程 序语言上下文的结构关系。 上下文的结构关系 序语言上下文的结构关系。
3
【难重点】 难重点】
翻译时源语句到目标语句结构上的变换。 ◇ 翻译时源语句到目标语句结构上的变换。 ◇ 语法制导翻译实现的方法。 语法制导翻译实现的方法。 语法制导翻译。 ◇ 语法制导翻译。
4
§5.1 概述
一个源程序经过词法分析、语法分析之后,表明该源程序在 一个源程序经过词法分析、语法分析之后, 书写上是正确的,并且符合程序语言所规定的语法。 书写上是正确的,并且符合程序语言所规定的语法。但是语 法分析并未对程序内部的逻辑含义加以分析, 法分析并未对程序内部的逻辑含义加以分析,因此编译程序 接下来的工作是语义分析 语义分析。 接下来的工作是语义分析。 编译中的语义处理是指两个功能: 编译中的语义处理是指两个功能: 第一,审查每个语法结构的静态语义,即验证语法结构合法 第一,审查每个语法结构的静态语义, 的程序是否真正有意义。有时把这个工作称为静态语义分析 的程序是否真正有意义。有时把这个工作称为静态语义分析 或静态审查。 或静态审查。 第二,如果静态语义正确,语义处理则要执行真正的翻译, 第二,如果静态语义正确,语义处理则要执行真正的翻译, 执行真正的翻译 即,或者将源程序翻译成程序的一种中间表示形式(中间代 或者将源程序翻译成程序的一种中间表示形式( ),或者将源程序翻译成目标代码 或者将源程序翻译成目标代码。 码),或者将源程序翻译成目标代码。
E
E {N1.type=N2.type}
N 3
+
N 4
{N1.type=int} N
+
N {N2.type=int} 4
3
输入串3+4的语法树 的语法树 输入串
结点带有语义信息的语法树
15
属性分为: 属性分为:继承属性与综合属性
1.综合属性用于“自下而上”传递信息。 综合属性用于“自下而上”传递信息。 综合属性用于 综合属性由相应语法分析树中结点的分枝结点(即子结点 即子结点) 综合属性由相应语法分析树中结点的分枝结点 即子结点 属性计算得到,其传递方向与继承属性相反, 属性计算得到,其传递方向与继承属性相反,即沿语法分 析树向上传递,从分枝结点到根结点。 析树向上传递,从分枝结点到根结点。 2.继承属性用于“自上而下”传递信息。 继承属性用于“自上而下”传递信息。 继承属性用于 继承属性由相应语法树中结点的父结点属性计算得到, 继承属性由相应语法树中结点的父结点属性计算得到,即 沿语法树向下传递,由根结点到分枝(子 结点 结点, 沿语法树向下传递,由根结点到分枝 子)结点,它反映了 上下文依赖的特性 的特性。 对上下文依赖的特性。继承属性可以很方便地用来表示程 序语言上下文的结构关系。 上下文的结构关系 序语言上下文的结构关系。
3
【难重点】 难重点】
翻译时源语句到目标语句结构上的变换。 ◇ 翻译时源语句到目标语句结构上的变换。 ◇ 语法制导翻译实现的方法。 语法制导翻译实现的方法。 语法制导翻译。 ◇ 语法制导翻译。
4
§5.1 概述
一个源程序经过词法分析、语法分析之后,表明该源程序在 一个源程序经过词法分析、语法分析之后, 书写上是正确的,并且符合程序语言所规定的语法。 书写上是正确的,并且符合程序语言所规定的语法。但是语 法分析并未对程序内部的逻辑含义加以分析, 法分析并未对程序内部的逻辑含义加以分析,因此编译程序 接下来的工作是语义分析 语义分析。 接下来的工作是语义分析。 编译中的语义处理是指两个功能: 编译中的语义处理是指两个功能: 第一,审查每个语法结构的静态语义,即验证语法结构合法 第一,审查每个语法结构的静态语义, 的程序是否真正有意义。有时把这个工作称为静态语义分析 的程序是否真正有意义。有时把这个工作称为静态语义分析 或静态审查。 或静态审查。 第二,如果静态语义正确,语义处理则要执行真正的翻译, 第二,如果静态语义正确,语义处理则要执行真正的翻译, 执行真正的翻译 即,或者将源程序翻译成程序的一种中间表示形式(中间代 或者将源程序翻译成程序的一种中间表示形式( ),或者将源程序翻译成目标代码 或者将源程序翻译成目标代码。 码),或者将源程序翻译成目标代码。
第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
语法制导翻译和中间代码生成【共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是双目运算符,若只有一个运算量,则 是单目运算符。
第讲-语法制导翻译和中间代码生成(共36张PPT)
real
L.in= real
,. id3
,.
L.in= real
id2
id1
第7页,共36页。
语法制导翻译概论
type 在语法分析过程中,随着分析的步步进展,
根据每个产生式所对应的语义子程序(或语 #idA
:=-B*(C+D)#
true:
将下列语句翻译成后缀式:
{ T1. true )
(1) 义规则描述的语义动作)进行翻译的办法称
(4) ( :=,(3),a )
:=
+
*
*
b
c
b
d
三元式表示
第15页,共36页。
树形表示
间接三元式
执行表 三元式表
第16页,共36页。
例如:x:=(a+b)*c b:=a+b y:=c*(a+b)
间接三元式:
三元式: (1) ( +, a ,b ) (2) ( *, (1),c ) (3) ( :=,(2),x ) (4) ( +, a ,b ) (5) ( :=,(4),b ) (6) ( +, a, b ) (7) ( *, c,(6) ) (8) ( :=,(7),y )
+D)#
+D)#
D)#
Sub6 Sub4
Sub6
(@,B, ,T1)
查看语意义子程序1~3
第24页,共36页。
查看语意义子程序4~6
栈
余留输入字符
语意义动作 产生的四元式
#idA := ET1 * (EC+ #idA := ET1 * (EC+idD #idA := ET1 * (EC+ED #idA := ET1 * (ET2 #idA := ET1 * (ET2) #idA := ET1 * ET2 #idA := ET3 #S
语法制导翻译及中间代码生成.最全优质PPT
所决定的。 而且,我们还把语义动作视为翻译文法中的一个“符号”,称为动作符号。
3.对一动作符号而言,其综合属性之值是以该动作符号的继承属性或产生式右部符号的任意属性为变元的函数。
根据DT(我T)所们构造可的关将系图这称为些依赖语关系义图(以或简“称为属依赖性图)”。 的形式附加到各个文法 符号上,再根据产生式所蕴含的语义,给出每个文法 符号的属性的求值规则,从而形成一种附带有语义属 性的前后文无关文法,即属性文法。
终结符至少有一种属性,即词文。当然,它还可能具 有其它属性,例如无符号数123,单词“123”就是它 的词文,而其数值以及它的类型(整型)是它的其它 两个属性。终结符的属性是其内在性质.
非终结符的属性是从其它符号的属性经计算而得的, 即由其它符号的属性定义的。
属性依赖关系
各个文法符号的属性之间,可能存在某种依赖关系,这 种依赖关系可用属性规则(语义规则)定义。
综合属性与继承属性
定义 5.3 对每个产生式p:X0→X1X2…Xn ,设属性 定义性出现的集合为
AF(p)={Xi.a|Xi.a=f(Xk1.ak1,…,Xkm.akm)∈ R(p),0≤kj≤n}
若Xi是产生式左部的非终结符(即i=0),则称属性 Xi.a是综合属性(Synthesized Attributes);若 Xi出现在产生式的右部(即1≤i≤n),则称Xi.a是 继承属性(Inherited Attributes)。
我们用形如X.ATTR的记号来表示文法符号X的相关 语义属性。
如果一个文法符号X在一产生式中多次出现,为了在 语义上能够对其进行区分,可添加不同的上标。
文法符号及其语义属性
例如,文法G[E]:
产生式
语义子程序
E→E(1)+T {E.Val=E(1).val+T.val;}
3.对一动作符号而言,其综合属性之值是以该动作符号的继承属性或产生式右部符号的任意属性为变元的函数。
根据DT(我T)所们构造可的关将系图这称为些依赖语关系义图(以或简“称为属依赖性图)”。 的形式附加到各个文法 符号上,再根据产生式所蕴含的语义,给出每个文法 符号的属性的求值规则,从而形成一种附带有语义属 性的前后文无关文法,即属性文法。
终结符至少有一种属性,即词文。当然,它还可能具 有其它属性,例如无符号数123,单词“123”就是它 的词文,而其数值以及它的类型(整型)是它的其它 两个属性。终结符的属性是其内在性质.
非终结符的属性是从其它符号的属性经计算而得的, 即由其它符号的属性定义的。
属性依赖关系
各个文法符号的属性之间,可能存在某种依赖关系,这 种依赖关系可用属性规则(语义规则)定义。
综合属性与继承属性
定义 5.3 对每个产生式p:X0→X1X2…Xn ,设属性 定义性出现的集合为
AF(p)={Xi.a|Xi.a=f(Xk1.ak1,…,Xkm.akm)∈ R(p),0≤kj≤n}
若Xi是产生式左部的非终结符(即i=0),则称属性 Xi.a是综合属性(Synthesized Attributes);若 Xi出现在产生式的右部(即1≤i≤n),则称Xi.a是 继承属性(Inherited Attributes)。
我们用形如X.ATTR的记号来表示文法符号X的相关 语义属性。
如果一个文法符号X在一产生式中多次出现,为了在 语义上能够对其进行区分,可添加不同的上标。
文法符号及其语义属性
例如,文法G[E]:
产生式
语义子程序
E→E(1)+T {E.Val=E(1).val+T.val;}
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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 中间代码
例如 X= a*b+c/d 的 四元式序列: (1) ( *, a, b, T1 ) (2) ( /, c, d, T2 ) (3) ( +, T1, T2, T3 ) (4) ( =, T3, -, X ) 四元式的第四个分量result是编译程序 为存放中间运算结果而临时引进的变量, 常称为临时变量,如Ti,也可以是用户 自定义变量,如X.
5.4 中间代码
例如 X= a*b+c/d 的 四元式序列:
(1) (2) (3) (4) ( *, ( /, ( +, ( =, a, c, b, d, T1 ) T2 ) T3 ) X )
T1 , T2 , T3 , - ,
相应的三地址语句序列为: (1)T1=a*b (3)T3=T1+T2 (2)T2=c/d (4)X=T3
{7+8*5,3+8,6*5,…} 5.3 语法制导翻译概述
例如,设有简单算术表达式的文法: E→E+E | E*E | (E) | digit 为文法每一产生式设计相应的求值的语义 描述(语义动作): 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} {E.val =E(1).val} 3.E → (E(1)) {E.val =Lex.digit} 4.E → digit
E E.val = 47 E E.val = 7 7 + E E.val = 40 * E E.val = 5 5
E E.val = 8 8
5.4 中间代码
3. 编译中常用的中间代码: 逆波兰式 三元式 四元式 树形表示
5.4 中间代码
逆波兰式 逆波兰式除去了原表达式中的括号, 并将运算对象写在前面,运算符写在后 面,因而又称为后缀式 后缀式. 后缀式 例如: 中缀表达式 a*b (a+b)*(c+d) 逆波兰式 ab* ab+cd+*
5.4 中间代码
例如 a+b*c 的 三元式序列: (1) ( * , b , c) (2) ( + , a , (1) ) 运算对象是指向符号表的某一项或指向 三元式表的某一项.
5.4 中间代码
三元式的特点: 1. 三元式出现的顺序和语法成份的 计值顺序相一致. 2. 三元式之间的联系是通过指示器 实现的.
5.2 属性文法
1. 属性文法 (1) 属性 对文法的每一个符号, 引进一些属 性, 这些属性代表与文法符号相关的信 息, 如类型,值,存储位置等.与属性 相关的信息, 即属性值,可以在语法分析 过程中计算和传递.
5.2 属性文法
属性加工的过程即是语义的处理过程. 属性加工的过程即是语义的处理过程. 属性分为两类: 综合属性和继承属性. 综合属性其计算规则按"自下而上"方 式进行, 即规则左部符号的某些属性根 据其右部符号的属性和(或)自己的其他 属性计算而得.
1.E → E(1)+E(2) 2.E → E(1)*E(2) 3.E → (E(1)) 4.E → digit
{E.val =E(1).val +E(2).val} {E.val =E(1).val*E(2).val} {E.val =E(1).val} {E.val =Lex.digit} 句子 7+8*5
5.4 中间代码
间接三元式 (1) 间接三元式表: 用来存放各三元式本身. (2) 间接码表: 按执行各三元式的顺序,依次 列出各三元式在三元式表中的位置. 注意 : 间接三元式表中不存放重复的 三元式. 三元式.
5.4 中间代码
例如 语句 X= (A+B)*C Y= D↑(A+B)
三元式序列 (1) ( + , A , B ) (2) ( * , (1) , C ) (3) ( = , X , (2) ) (4) ( + , A , B ) (5) (↑ , D , (4) ) (6) ( = , Y, (5) ) 间接三元式 间接码表 三元式表 (1) (1) ( + , A , B ) (2) (2) ( * , (1) , C ) (3) (3) ( = , X , (2) ) (1) (4) (↑ , D , (1) ) (4) (5) ( = , Y, (4) ) (5)
5.3 语法制导翻译概述
S→…… {… … } … …… A→xy {… … } …… … 语义处理的 加工动作 a1 a2 a3 …ai ai+1 …an
语法制导翻译法使用属性文法为工具 来说明程序设计语言的语义.
5.3 语法制导翻译概述
(2) 语法制导翻译法 在语法分析过程中,依随分析的过程, 根据每个产生式所对应的语义子程序(或 语义规则描述的语义处理的加工动作)进 行翻译的方法.
5.4 中间代码
逆波兰式表示法同中缀表示法相比其 优点是: 1. 不再有括号,且运算符出现的顺序体 现了中缀表达式 的运算顺序 2. 易于计算机处理
5.4 中间代码
一般表达式计值时,要处理两类符 号,一类是运算对象,另一类是运算符, 通常用两个工作栈分别处理.但处理用 逆波兰式表示的表达式却只用一个工作 栈.
c R S
5.5 自下而上的语法制导翻译
{ print "1"} { print "2"} { print "3"} { print "4"} { print "5"} R 翻译结果为: R / 1 4 5 314 24 31
b
S→bTc S→a T→R R→R/S R→S
S
b R / S T b
第5章
语法制导翻译技术和中间 代码生成
5.1 概述 5.2 属性文法 5.3 语法制导翻译概述 5.4 中间语言 5.5 自下而上语法制导翻译 5.6 递归下降语法制导的翻译 本章小结
5.1 概述
语义分析的任务: 静态语义审查 审查每个语法结构的静态语义, 审查每个语法结构的静态语义 即验证语法结构合法的程序,是否 即验证语法结构合法的程序 是否 真正有意义. 真正有意义
5.5 自下而上的语法制导翻译
S b R R / b / S T b T R / S T c S a c
c R S
5.5 自下而上的语法制导翻译
例2 简单算术表达式求值的语义描述 例如,设有简单算术表达式的文法: E→E+E | E*E | (E) | digit 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} {E.val =E(1).val} 3.E → (E(1)) {E.val =Lex.digit} 4.E → digit
5.4 中间代码
例1. –a + b * ( –c + d )的逆波兰式 a@ bc @ d + * +
5.4 中间代码
–a + b * ( –c + d )的四元式表示 t1= @ a t2= @ c t3= t2 + d t4= b* t3 t5= t1+ t4
5.4 中间代码
例2. i↑( i /( i – i ) )的逆波兰式 i i i i – /↑ i↑( i /( i – i ) )的四元式 t1= i – i t2= i / t1 t3= i ↑ t2
c
T1
T1
T2
5.4 中间代码
逆波兰形式可以推广到其他语法结构: 赋值语句 V=E 条件语句 if E S1 ; else S2 逆波兰式 VE= 逆波兰式 ES1S2¥
第5章 语法制导翻译技术和中间代 码生成
三元式和树形表示
三元式主要由三部分组成: 三元式 (OP,arg1, arg2) 其中OP是运算符, arg1,arg2分别是第一和第二两个运算对象. 当OP是一目运算时,常常将运算对象定 义为arg1.