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