parsing - 在创建抽象语法树的上下文中,综合属性是什么?

标签 parsing compiler-construction abstract-syntax-tree

编译器解析源代码并构建抽象语法树。用于构造抽象语法树的函数返回指针,这些指针构成综合属性。它们是什么,它们与继承的属性有何区别?

编辑:我不知道这是否有帮助,但是我最初是在法语环境中听说过以下术语的:属性synthétisés,hérités。

最佳答案

属性是与中心关注的事物相关联的附加值。对于AST,您可以将它们视为与每个AST节点相关联的对(attribute_name,attribute_value),其中属性名称对应于某些有趣的事实类型,而属性值对应于该事实的实际状态(例如, ,“(constants_in_subtree_count,12)”)。

继承和合成的术语用于描述如何为每个AST节点计算属性值,通常与使用子节点生成AST节点的语法规则相关联。

合成的属性是指其值是根据子节点的属性值计算得出的属性,并将其传递到树上。通常,合成属性的值会合并以生成父节点的属性。如果AST节点有两个子节点,每个子节点都有自己的属性(constants_in_subtree_count,7)和(constants_in_subtree_count,7),则通过将这些属性向上传递,父节点可以计算其对应的属性(constants_in_subtree_count,12)。

继承的属性是从父级传递到子级的那些属性。如果函数AST的根“知道”该函数的返回类型是(return_type,integer)作为属性,则它可以将返回类型传递给该函数根的子级,例如功能主体。在那棵树的深处某个地方是一个实际的return语句;如果它接收到继承的属性(return_type,X),
它可以检查它正在计算的结果是否是正确的类型。

实际上,您希望能够为节点定义任意属性集,并在树中上下传递它们,以实现处理AST所需的多种用途(构建符号表,构建控制流程图,进行类型检查,计算指标, ...)。 attribute grammar生成器是一种解析器生成器,它将采用语法规则,属性定义集以及有关如何为每个规则中涉及的节点计算合成属性和继承属性的规则,并生成解析器和AST Walker,以计算所有内容属性。

这个想法的值(value)在于它提供了自动化支持的组织原理,可用于以常规方式计算有关AST的许多有趣的事物。否则,您将使用临时代码对所有内容进行编码。

我们的DMS Software Reengineering Toolkit是AST处理系统(实际上是源到源程序的转换),它大量使用并行属性评估来计算AST上的各种有用分析:常规指标,符号表,类型检查(例如我上面描述的返回类型检查) ),控制和数据流从代码中提取,以及其他不太容易描述但在子树上计算出的有用结果(“此表达式中的副作用分配列表”)。为什么要平行?好吧,子树中的属性计算本质上是独立的,因此并行性已经存在,并且当您处理真正的大树时,性能很重要。 DMS通常处理成千上万个编译单元,每个生成一个(可能很大)的AST。

关于parsing - 在创建抽象语法树的上下文中,综合属性是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5768400/

相关文章:

parsing - EDI 新手需要有关选择翻译器的建议

architecture - 编译器与解释器

来自 ANTLR 解析树的 Python AST?

java - 在Java中,如何从类文件中获取抽象语法树?

python - 如何在 'eval'模式下编译ast节点

parsing - haskell - 解析命令行和 REPL 命令和选项

python - 我如何使用 lxml , python 解析 html

c++ - 如果我只在发布配置中遇到内部编译器错误,我可以查看什么来解决这个问题?

java - 在Java中提取XML属性(ISBNDB)

c# - C# 的最佳编译器