一、属性文法
属性文法:一种形式化描述语义规则的文法。
1、属性文法的概念
语义:定义了各语法成分的功能和含义,即规定了他们的属性或者运算。
属性文法:在上下文无关文法的基础上,为每一个文法符号配备若干个“值”(属性)。
属性:存储了文法符号的有关信息;可以进行计算和传递;语义处理过程即是属性加工过程。
语义规则:文法每一个产生式配备了一组属性的计算规则。
2、属性的分类
- 继承属性:用于“自上而下”传递信息。
属性值计算依赖于父亲结点的属性或者兄弟结点的属性。
- 综合属性:用于“自下而上”传递信息。仅出现在产生式左部文法符号的属性。
属性值依赖于产生式右部,或者说根结点的综合属性依赖于它的孩子结点的属性。
终结符:只有综合属性,值由词法分析器提供;
起始符:没有继承属性或者其继承属性已知。
3、语义规则的形式
语义规则的形式:表达式、程序段或者函数调用。
4、S-属性文法
文法特点:仅仅使用了综合属性。适用于“自下而上”的语法分析
5、L-属性文法
文法特点:既有综合属性,又有继承属性。适用于“自下而上”的语法分析
常见问题:给一个文法,根据其语义写其属性文法。例如:
二、语法制导翻译(属性的计算方法)
语法制导翻译:基于属性文法的处理方法,即语义分析的方法。
1、属性依赖图
利用属性依赖图进行语法制导翻译。
- 画语法树
- 对语法树的每一个文法符号的每一个属性建立一个结点
- 涉及函数调用的建立一个虚结点。
- 根据属性的计算规则的定义,在结点之间建立连线,描述属性之间的依赖关系。
2、树遍历--深度优先,从左到右
前提:语法树已经建立,且起始符有已知的继承属性,终结符有综合属性。
过程:多次遍历,先计算可以计算的属性,无法计算的跳过;进入下一次遍历,直到属性全部计算完成。
3、一次扫描
一次扫描:在语法分析的同时计算属性值。在自上而下的分析过程中,若产生式规则匹配成功,则进行属性的计算;在自下而上的分析过程中,若进行归约操作,则进行属性的计算。
3.1)S-属性无法 + LR分析
语义动作改写:将属性的计算规则,改成栈的操作代码。
3.2)L-属性无法 + “自上而下”分析
LL(1)文法改造成翻译模式。使用{ 语义动作 }嵌入到产生式规则的右部,指明语义动作的执行时机。
综合属性:在子树构造完成后计算,即嵌入产生式右部的最后。
继承属性:在创建子树之前计算,即在具有继承属性的文法符号前。
4、抽象语法树(Abstract Syntax Tree, AST)
AST:算符和关键字作为内部结点,叶子结点是终结符。
-------------------------------------------------------END-------------------------------------------------------------------
任意门:
编译原理------语法分析器(一) 自上而下的推导(LL1文法)-CSDN博客