编译原理学习笔记(六)——属性文法和语法制导翻译&&编译原理学习笔记(七)——语义分析和中间代码的产生

第六章

属性文法
是在上下文无关文法的基础上为每个文法符号(终结符或非终结符)配备若干个相关的“值”(称为属性)。
属性:代表与文法符号相关的信息,和变量一样,可以进行计算和传递。
(1)综合属性
用于“自下而上”传递信息
在语法树中,一个结点的综合属性的值,由其子结点的属性值确定
(2)继承属性
用于“自上而下”传递信息。
在语法树中,一个结点的继承属性由此结点的父结点和/或兄弟结点的某些属性确定
(2)继承属性
用于“自上而下”传递信息。
在语法树中,一个结点的继承属性由此结点的父结点和/或兄弟结点的某些属性确定
4.语义规则所描述的工作
属性计算
静态语义检查
符号表操作
代码生成

在一个属性文法中,对应于每个产生式A都有一套与之相关联的语义规则,每条语义规则的形式为:
b:=f(c1,c2,…,ck)
这里f是一个函数,而且或者
(1)b是A的一个综合属性并且c1,c2,…ck是产生式右边文法符号的属性;或者
(2)b是产生式右边某个文法符号的一个继承属性并且c1,c2,…ck是A或产生式右边任何文法符号的属性

在这两种情况下,我们都说属性b依赖于属性c1,c2,…,ck.

注意:
(1)终结符只有综合属性,它由词法分析器提供
(2)非终结符既可以有综合属性也可以有继承属性,文法开始符号的所有继承属性作为属性计算前的初始值

基于属性文法的处理方法
1 输入串->语法树->依赖图->语义规则计算次序->计算结果
这种由源程序的语法结构所驱动的处理办法就是语法制导翻译法。
语义规则的计算可能产生代码、在符号表中存放信息、给出错误信息或执行任何其它动作。对输入串的翻译也就是根据语义规则进行计算得出结果。
2 属性的计算次序
一个有向非循环图的拓扑序是图中结点的任何顺序m1,m2, …mk,使得边必须是从序列中前面的结点指向后面的结点。也就是说,如果mi->mj是mi到mj的一条边,那么在序列中mi必须出现在mj之前。
3、树遍历的属性计算方法
假设语法树已经建立起了,并且树中已带有开始符号的继承属性和终结符的综合属性。然后以某种次序遍历语法树,直至计算出所有的属性。
4.抽象语法树

从语法树中去掉对翻译不必要的信息,而获得更有效的源程序中间表示。

这种经变换后的语法树称之为抽象语法树


第七章

中间语言 :
语法树
后缀式

三地址代码表示

中 缀式: a:=b*-c+b*-c
后缀式:

   a b c - * b c - * + =


   1.四元式  op, arg1, arg2, result
  2.三元式 op, arg1, arg2
  3.间接三元式  间接码表+三元式表(其实我觉得这里,只是换了一下地址而已)

eg. 对于语句a:=b*-c+b*-c 的三种表示方法

(- , c , , t1)
(* , b , t1 , t2)
(- , c , , t3)
(* , b , t1 , t4)
(+ ,t2 , t4 , t5)

(= , t5 , ,a)

布尔表达式:a or b and not c
翻译成三地址代码序列:
100 : t1:=not c
101 : t2:=b and t1

102 : t3:=a or t1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值