编译原理------语义规则的描述工具(属性文法)和属性计算过程(语法制导翻译)

一、属性文法

属性文法:一种形式化描述语义规则的文法。

1、属性文法的概念

语义:定义了各语法成分的功能和含义,即规定了他们的属性或者运算。

属性文法:在上下文无关文法的基础上,为每一个文法符号配备若干个“值”(属性)。

属性:存储了文法符号的有关信息;可以进行计算和传递;语义处理过程即是属性加工过程。

语义规则:文法每一个产生式配备了一组属性的计算规则。

2、属性的分类

  • 继承属性:用于“自上而下”传递信息。

属性值计算依赖于父亲结点的属性或者兄弟结点的属性。

  • 综合属性:用于“自下而上”传递信息。仅出现在产生式左部文法符号的属性。

属性值依赖于产生式右部,或者说根结点的综合属性依赖于它的孩子结点的属性。

终结符:只有综合属性,值由词法分析器提供

起始符:没有继承属性或者其继承属性已知。

3、语义规则的形式

语义规则的形式:表达式程序段或者函数调用

4、S-属性文法

文法特点:仅仅使用了综合属性。适用于“自下而上”的语法分析

5、L-属性文法

文法特点:既有综合属性,又有继承属性。适用于“自下而上”的语法分析

常见问题:给一个文法,根据其语义写其属性文法。例如:

二、语法制导翻译(属性的计算方法)

语法制导翻译:基于属性文法的处理方法,即语义分析的方法。

1、属性依赖图

利用属性依赖图进行语法制导翻译。

  1. 画语法树
  2. 对语法树的每一个文法符号的每一个属性建立一个结点
  3. 涉及函数调用的建立一个虚结点。
  4. 根据属性的计算规则的定义,在结点之间建立连线,描述属性之间的依赖关系。

2、树遍历--深度优先,从左到右

前提:语法树已经建立,且起始符有已知的继承属性,终结符有综合属性。

过程:多次遍历,先计算可以计算的属性,无法计算的跳过;进入下一次遍历,直到属性全部计算完成。

3、一次扫描

一次扫描:在语法分析的同时计算属性值。在自上而下的分析过程中,若产生式规则匹配成功,则进行属性的计算;在自下而上的分析过程中,若进行归约操作,则进行属性的计算。

3.1)S-属性无法 + LR分析

语义动作改写:将属性的计算规则,改成栈的操作代码。

3.2)L-属性无法 + “自上而下”分析

LL(1)文法改造成翻译模式。使用{ 语义动作 }嵌入到产生式规则的右部,指明语义动作的执行时机。

综合属性:在子树构造完成后计算,即嵌入产生式右部的最后。

继承属性:在创建子树之前计算,即在具有继承属性的文法符号前。

4、抽象语法树(Abstract Syntax Tree, AST)

AST:算符和关键字作为内部结点,叶子结点是终结符。

 -------------------------------------------------------END-------------------------------------------------------------------

任意门:

编译原理------概述-CSDN博客

编译原理------文法-CSDN博客

编译原理------词法分析器-CSDN博客

编译原理------语法分析器(一) 自上而下的推导(LL1文法)-CSDN博客

编译原理------语法分析(二)自下而上的归约(算符优先,LR分析)-CSDN博客

 编译原理------语义分析器之中间代码的表示形式-CSDN博客

 

  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值