为每个文法符号(终结符或非终结符)配备若干相关的“值”(称为属性),代表与文法符号相关信息,如类型、值、代码序列、符号表内容等
对于文法的每个产生式都配备了一组属性的语义规则,对属性进行计算和传递。

  • 综合属性

自下而上传递信息
语法规则:根据右部候选式中的符号的属性计算左部被定义符号的综合属性
语法树:根据子结点的属性和父结点自身的属性计算父节点的综合属性

  • 继承属性

自上而下传递信息
语法规则:根据右部候选式中的符号的属性和左部被定义符号的属性计算右部候选式中的符号的继承属性
语法树:根据父结点和兄弟节点的属性计算子结点的继承属性

  • 属性依赖

对应于每个产生式A→α都有一套与之相关联的语义规则,每条规则的形式为(f是一个函数):
属性文法 - 图1
属性b依赖于属性c1,c2,…,ck
b是A的一个综合属性并且c1,c2,…,ck是产生式右边文法符号的属性,或者b是产生式右边某个文法符号一个继 承属性并且c1,c2,…,ck是A或产生式右边任何文法符号的属性

  • 终结符只有综合属性,由词法分析器提供
  • 非终结符既可有综合属性也可有继承属性,文法开始符号的所有继承属性作为属性计算前的初始值
  • 对出现在产生式右边的继承属性和出现在产生式左边的综合属性都必须提供一个计算规则。属性计算规则中只能使用相应产生式中的文法符号的属性。
  • 出现在产生式左边的继承属性和出现在产生式右边的综合属性不由所给的产生式的属性计算规则进行计算,由其它产生式的属性规则计算或者由属性计算器的参数提供
  • 在语法树中,一个结点的综合属性的值由其子结点和它本身的属性值确定。使用自底向上的方法在每一个结点处使用语义规则计算综合属性的值。仅使用综合属性的属性文法称S-属性文法
  • 在语法树中,一个结点的继承属性由其父结点、其兄弟结点和其本身的某些属性确定

基于属性文法的处理方法

依赖图
在一棵语法树中的结点的继承属性和综合属性之间的相互依赖关系可以由依赖图(有向图)来描述。
为每一个包含过程调用的语义规则引入一个虚综合属性b,这样把每一个语义规则都写成属性文法 - 图2的形式。
依赖图中为每一个属性设置一个结点,如果属性b依赖于属性c,则从属性c的结点有一条有向边连到属性b的结点。
输入串——语法树——依赖图——语义规则计算次序

image.png
树遍历
假设语法树已建立,且树中已带有开始符号的继承属性和终结符的综合属性
以某种次序(深度优先,从左到右的遍历)遍历语法树,直至计算出所有属性
输入串——语法树——遍历语法树——计算属性

一遍扫描
所谓语法制导翻译法,直观上说就是为文法中每个产生式配上一组语义规则,并且在语法分析的同时执行这些语义规则
mknode(op, left, right)建立一个运算符号结点,标号是op,两个域left和right分别指向左
子树和右子树
mkleaf(id, entry) 建立一个标识符结点,标号为id,一个域entry指向标识符在符号表中的入口
mkleaf(num, val)建立一个数结点,标号为num,一个域val用于存放数的值