依赖图的例子 real idl, id 2, id3 T type inL→ Lt vir entry In real entry In vIr entr
依赖图的例子 • real id1 , id2, , id3 D T L L L id3 id2 id1 real type in entry vir in vir in vir entry entry
计算次序 显然,依赖图中指定了各个属性的计算顺序 各个属性的计算顺序可以有多种,但是必须满足依赖 图规定的拓扑次序。以保证在计算某个属性的值的时 候,这个属性所依赖的属性值已经被计算出来。 用语法制导定义说明的翻译步骤如下 构造语法分析树。 构造依赖图。 对依赖图的各个结点进行拓扑排序,得到计算次序 按照上述次序计算属性的值。 比如,上面的图的计算顺序如下 a4 -real, a5=a4, addtype(id3 entry, a5)
计算次序 • 显然,依赖图中指定了各个属性的计算顺序。 • 各个属性的计算顺序可以有多种,但是必须满足依赖 图规定的拓扑次序。以保证在计算某个属性的值的时 候,这个属性所依赖的属性值已经被计算出来。 • 用语法制导定义说明的翻译步骤如下: – 构造语法分析树。 – 构造依赖图。 – 对依赖图的各个结点进行拓扑排序,得到计算次序。 – 按照上述次序计算属性的值。 • 比如,上面的图的计算顺序如下: – a4=real, a5=a4, addtype(id3.entry, a5),
其它得到计算次序的方法 ·避免在分析的过程中显式地构造分析树 忽略规则:按照语法分析的归约(或者)推导 程序完成属性的计算 比如,当定义中只有S属性定义的时候,可 以按照自底向上归约过程进 基于规则的计算次序:通过对重写规则和语义 规则进行分析,确定和每个重写规则相关联的 语义规则的计算次序
其它得到计算次序的方法 • 避免在分析的过程中显式地构造分析树。 • 忽略规则:按照语法分析的归约(或者)推导 程序完成属性的计算。 – 比如,当定义中只有S_属性定义的时候,可 以按照自底向上归约过程进行。 • 基于规则的计算次序:通过对重写规则和语义 规则进行分析,确定和每个重写规则相关联的 语义规则的计算次序
翻译方案 ·语法制导定义基于属性文法,其计算次序被隐藏 ·如果在进行语义定义的时候,陈述了一些实现的细节,我 们称为翻译方案。 在翻译方案中,语义定义部分是用{}包含的语义动作。并 且语义动作可以出现在规则右部的任何地方 这些语义动作的执行顺序是这样的。当建立了一个语法分 析树之后(把语义动作也当作规则右部的结点加入到语法 树中),我们按照深度优先的方法变例这个分析树。每次 遍历到一个语义动作对应的结点的时候,执行这个动作, 计算相应的属性值。 ·L属性定义是可以使用翻译方案计算的一类语义定义方式
翻译方案 • 语法制导定义基于属性文法,其计算次序被隐藏。 • 如果在进行语义定义的时候,陈述了一些实现的细节,我 们称为翻译方案。 • 在翻译方案中,语义定义部分是用{}包含的语义动作。并 且语义动作可以出现在规则右部的任何地方。 • 这些语义动作的执行顺序是这样的。当建立了一个语法分 析树之后(把语义动作也当作规则右部的结点加入到语法 树中),我们按照深度优先的方法变例这个分析树。每次 遍历到一个语义动作对应的结点的时候,执行这个动作, 计算相应的属性值。 • L_属性定义是可以使用翻译方案计算的一类语义定义方式
L属性定义 L属性定义:如果每个重写规则U:=X1X2.Xn对应的 语义规则中的每个属性: 或者是综合属性, 或者是这样的继承属性 Xja或者仅仅依赖于U ·ja依赖于ⅹj左边的符号的属性。 S属性定义也是L属性定义 显然,对于L属性定义,其属性的值可以按照深度优 先的次序计算。也就是说,可以直接地使用翻译方案 实现。 L属性定义的例子可以看关于变量申明的定义
L_属性定义 • L_属性定义:如果每个重写规则U::=X1X2…Xn对应的 语义规则中的每个属性: – 或者是综合属性, – 或者是这样的继承属性: • Xj.a或者仅仅依赖于U。 • Xj.a依赖于Xj左边的符号的属性。 • S_属性定义也是L_属性定义。 • 显然,对于L_属性定义,其属性的值可以按照深度优 先的次序计算。也就是说,可以直接地使用翻译方案 实现。 • L_属性定义的例子可以看关于变量申明的定义