Sha*_*awn 10 compiler-construction parsing abstract-syntax-tree
编译器解析源代码并构建抽象语法树.用于构造抽象语法树的函数返回构成合成属性的指针.它们是什么以及它们与继承属性有何不同.
编辑:我不知道这是否有帮助,但我最初在法国语境中听说过这些术语:Attributssynthétisés,attributshérités.
Ira*_*ter 20
属性是与中心兴趣相关的附加值.在AST的情况下,您可以将它们视为与每个AST节点关联的对(attribute_name,attribute_value),其中属性名称对应于某个有趣的事实类型,并且属性值对应于该事实的实际状态(例如, ,"(constants_in_subtree_count,12)").
继承和合成是用于描述如何为每个AST节点计算属性值的术语,通常与使用其子节点生成AST节点的语法规则相关联.
合成的属性是那些值是从属性值来计算从子节点,并正在通过了树.通常,合成属性的值被组合以产生父节点的属性.如果AST节点有两个子节点,每个节点都有自己的属性(constants_in_subtree_count,5)和(constants_in_subtree_count,7),那么通过向上传递这些属性,父节点可以计算其相应的属性(constants_in_subtree_count,12).
继承的属性是从父级传递给子级的属性.如果函数AST的根"知道"函数返回类型为(return_type,整数)作为属性,它可以通过返回类型的函数的根,例如,以函数体的子女.在那棵树深处的某个地方是一个实际的回报声明; 如果它接收到继承的属性(return_type,X),它可以检查它正在计算的结果是否是正确的类型.
在实践中,您希望能够为节点定义任意属性集,并在树中上下传递它们,以满足处理AST所需的多种目的(构建符号表,构建控制流图,进行类型检查,计算度量, ...).一个属性文法发电机是一种解析器生成的,将采取语法规则,套的属性定义,以及如何计算合成和继承中涉及的每个规则的节点属性的规则,并同时生成一个解析器和AST步行者,计算所有属性.
这个想法的价值在于它提供了自动化支持的组织原则,可用于以常规方式计算有关AST的许多有趣的事情.否则,您可以使用ad hoc代码对所有内容进行编码.
我们的DMS软件再造工具包是一个AST操作系统(实际上是源到源程序转换),它大量使用并行属性评估来计算AST上的各种有用分析:常规度量,符号表,类型检查(如返回类型检查)我在上面描述过),从代码中提取控制和数据流,以及在子树上计算的其他不那么容易描述但有用的结果("此表达式中的副作用分配列表").为什么平行?好吧,子树中的属性计算基本上是独立的,因此并行性已经存在,并且当你处理真正的大树性能问题时.DMS经常处理数千个编译单元,每个单元产生一个(可能很大的)AST.