当前位置:文档之家› 第八章 语法制导翻译和中间代码生成

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


5
2015-11-14
9-5+2的带语义动作的分析树 例 一个简单的翻译模式 E→TR R→addop T{print(addop.lexeme)}R1|ε T→num{print(num.val)} 输入9-5+2,其分析树如下页图,当按深度优 先遍历它,执行遍历中访问的语义动作,将 输出结果是什么? 它输出结果是:9 5 - 2 + 它是输出表达式9-5+2的后缀式。
只要遵守运算对象后直接紧跟它们的运算符的规 则即可。 比如把转语句GOTO L写为“L jump ", 运算对象L为语句标号,运算符jump表示转到某个标号 L 。 再比如条件语句if E then S1 else S2 可表示为:E S1 S2 ¥,把if then else看成三目运 算符,用¥来表示。
1
2015-11-14
属性文法
附加了一组属性和运算(语义)规则的文法 语义信息
属性文法的定义:
一个属性文法是一个三元组: A=(G,V,F), G: 是一个上下文无关文法 V: 有穷的属性集,每个属性与文法的一终结符 或非终结符相连。 F: 关于属性的属性断言或谓词集.每个断言与 一个产生式相联。一个断言就是一个语义 规则, 描述各属性的关系。 用法: 针对语义:为每个符号设置一个属性,终结符号用单 词属性。 为每个产生式设置语义规则——描述各属性的关系。
只使用综合属性.
L E E T T F i 3
3*5+4的分析树
产生式
L E
语 义 规 则 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=i.lexval
L E E E1+T
ET T T 义 规 则 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=i.lexval
D T int L id1
L , id2
8.3 语法制导翻译
几点说明:
1、文法非终结符既可有综合属性,也可有继承属性; 2、开始符号没有继承属性; 3、终结符只有综合属性,由词法分析器提供。
语法制导翻译:将语义规则与语法规则相结合,在 语法分析的过程中通过执行语义动作,计算语义属 性值,从而完成预定的翻译工作。
语法制导翻译分为两种处理方法:
(1)自底向上的翻译:(只有综合属性)
对每个产生式编制一个语义子程序,在进行语法分析的过 程中,当一个产生式获得匹配时,就调用相应的语义子程 序实现语义检查与翻译。这种实现方案隐藏了其中语义规 则的计算次序等实现细节。
综合属性
继承属性
(2)自顶向下翻译(含有继承属性):
+ F i 4
T F i 5
*
通常使用自底向上的分析方法 在每个结点处使用语义规则来计算综合属性 值 当一个产生式获得匹配时,就调用相应的语 义子程序从叶结点到根结点进行计算
E E1+T ET T T1 * F TF F (E) Fi
2
2015-11-14
句子 int id1,id2 的语法树,使用 情况。
1. 属性的表示
文法符号X的属性t常用X.t来表示
语义之间的关系
2.语义规则的表示
语义规则用花括号{ }括起来,可被插入到 产生式右部的任何合适的位置上。 不同的产生式对应不同的语义规则 不同的分析目标也对应不同的语义规则
属性分为两种
例 综合属性
继承属性和综合属性
产生式
综合属性:在语法树中,一个结点的综合属性由 该结点的子结点的属性值确定。它的计算规则由 底向上. 继承属性:在语法树中,一个结点的继承属性由 该结点的 父结点/兄弟结点的属性确定。
逆波兰记号
逆波兰记号是最简单的一种中间代码表示 形式。 这种表示法将运算对象写在前面,把运 算符号写在后面,比如把a+b写成ab+, 把a*b写成ab*,用这种表示法表示的表 达式也称做后缀式。
常见的中间代码形式: 后缀式 三地址代码(四元式、三元式和间接三元式 ) 图形(抽象语法树等)
中缀表示 后缀表示 a+b ab+ a+b*c abc*+ (a+b)*c ab+c* a:=b*c+b*d abc*bd*+:= 特点 1、运算对象出现的顺序和原有顺序(从左到右)相同 2、运算符按实际计算顺序(从左到右)出现 3、运算符紧跟在运算对象的后面出现,且没有括号 优点:简明、便于计值
后缀表示法表示表达式,其最大的优点是易于计算机处理 表达式。 常用的算法是使用一个栈,自左至右扫描算术表达式(后 缀表示),每扫描到运算对象,就把它推进栈;扫描到运 算符,若该运算符是二目的,则对栈顶部的两个运算对象 实施该运算,并将运算结果代替这两个运算对象而进栈; 若是一目运算符,则对栈顶元素执行该运算,并以运算结 果代替该元素进栈,最后的结果留在栈顶。
在产生式右部的适当位置,插入相应的语义动作,即语义 规则或语义动作用花括号{ }括起来,可被插入到产生式 右部的任何合适的位置上。 自底向上 传递信息 自顶向下(自左 向右)传递信息
3
2015-11-14
print(E.val)打印由E产生的算术表达式的值, 可认为这条规则定义了L的一个虚属性。
一般的属性文法的翻译器是很难建立的,然 而有一大类属性文法的翻译器是很容易建立 的,那就是L-属性文法。 首先介绍L-属性文法的特例S-属性文法。 S-属性文法是:仅包含综合属性的属性文法。 如:算术表达式求值的属性文法 S-属性文法的翻译器可以借助LR分析器实现。
2+3*4的注释分析树
非L-属性的文法制导定义 产生式 语义规则 L.i:=l(A.i) ALM M.i:=m(L.s) A.s:=f(M.s) R.i:=r(A.i) A QR Q.i:=q(R.s) A.s:=f(Q.s) 表中的语法制导定义不是L-属性定义 文法符号Q的继承属性依赖于它右边文法符 号R的属性
例 综合属性
产生式 L E E T T F F E E1+T T T1 * F F (E) i 语 义 规 则 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=i.lexval
8.2 属性文法
属性文法: 属性: 所谓属性,用以描述事物或人的特征、性 质,品质等等。比如,谈到一个物体,可 以用“颜色”描述它,谈起某人,可以使 用“有幽默感“来形容他。 对一个文法,文法中的每个符号都有属性, 可以用"类型"、"值"或"存储位置"来描述 它。
实际应用中比较流行的语义分析方法: 基于属性文法的语法制导翻译方法
2015-11-14
第8章
语法制导翻译和中间代码生成
编译中的语义处理是指两个功能
§8.1概述
一、语义处理的任务: 根据语义规则对识别出的各种语法成分析其 含义,进行初步翻译,生成相应的中间代码 或直接生成目标代码。 语法分析 后的源程序 语义处理 中间代码 或目标代 码
第一
第二
静态语义分析或静态审查。
6
2015-11-14
逆波兰表示很容易扩充到表达式以外的范围。
例如 B@CD*+(它的中缀表示为-B+C*D,使用 @表示一目减)的计值过程为: 1. B进栈; 2. 对栈顶元素施行一目减运算,并将结果代替 栈顶,即-B置于栈顶; 3. C进栈; 4. D进栈; 5. 栈顶两元素相乘,两元素退栈,相乘结果置栈 顶; 6. 栈顶两元素相加,两元素退栈,相加结果进 栈,现在栈顶存放的是整个表达式的值。
可以看出,按深度优先遍历输入串aa的语法树,当要打印 属性A.in时,该属性还没有定义。也就是说,从S开始按 深度优先遍历A1和A2子树之前,A1.in和A2.in的值还 未赋值。 S A1 A2 A1.in:=1;A2.in:=2 Print(A.in)
a Print(A.in) a
a Print(A.in) a
其属性可用深度优先的顺序从左至右计算
E T 9
Pt(´9´)
E→TR R→addop T{print(addop.lexeme)}R1|ε T→num{print(num.val)}
R R
Pt(´-´)
T 5
输出: 95-2+
R + T
Pt(´+´)
Pt(´5´)

2
Pt(´2´)
中间代码
中间代码:一种介于源语言和目标语言之间的中间语言形式
L-属性文法的例子 产生式 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 )
表示属性的传递
与L产生式相联的语义规则中有一个过程调用 addtype,过程addtype的功能是把每个标识 符的类型信息登录在符号表的相关项中。
产生式 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 )
D T int L id1
相关主题