关于抽象语法树(AST)的问题

时间:2016-11-10 12:24:47

标签: abstract-syntax-tree

我发现很难理解

1)AST匹配,两个AST是如何相似的?比较/匹配中是否包含类型,或仅包括+, - ,++,...等操作?

2)两个语句在语法上是相似的(这个术语我在一篇论文中的某处读过),我们可以说下面的例子,这两个语句在语法上是相似的吗?

int x = 1 + 2
String y = "1" + "2"

Java - Eclipse正在使用它并试图理解AST。

最诚挚的问候,

1 个答案:

答案 0 :(得分:2)

AST是什么:

AST是表示程序源文本的数据结构,该文本由包含节点类型的节点组成,可能还包含文字值和子节点列表。节点类型对应于OP所谓的“操作”(+, - ,...),但也包括语言命令(do,if,assignment,call,...),声明(int,struct,...)和文字(数字,字符串,布尔值)。 [目前还不清楚OP的意思是“类型”]。 (AST通常在每个节点中都有附加信息,引用源文本文件中的原点)。

AST的用途:

OP似乎对Eclipse中AST的存在感到困惑。

AST用于以比原始文本更容易解释的形式表示程序文本。它们提供了推理程序结构或内容的手段;有时它们用于通过修改程序的AST然后从AST重新生成文本来修改程序(“重构”)。

比较AST的相似性在我的经验中并不常见,除了克隆检测和/或模式匹配。

比较AST:

比较AST是否容易:比较根节点类型/文字值是否相等;如果不相等,则比较完成,否则(递归地)比较子节点。

比较AST的相似性更难,因为你必须决定如何放松平等比较。 特别是,您必须确定相似性的精确定义。有许多方法可以定义它,一些语法相当浅,一些语义更复杂。

我的论文Clone Detection Using Abstract Syntax Trees描述了一种方法,使用相似性定义为共享节点数除以两个树中节点总数的比率。共享节点的计算方法是将树木自上而下与某些孩子不同的点进行比较。 (实际的比较是计算反联合器)。这个类似的措施相当浅薄,但在大型软件系统中查找代码克隆时效果非常好。

从这个角度来看,OP的例子是:

     int x = 1 + 2
     String y = "1" + "2"

将树写为S表达式:

     (declaration_with_assignment (int x) (+ 1 2))
     (declaration_with_assignment (String y) (+ "1" "2"))

这些不是很相似;它们只共享一个根节点,其类型为“赋值赋值”和+子树的顶部。 (这里节点数为12,只有2个匹配节点,相似度为2/12)。

这些会更相似:

     int x = 1 + 2
     float x = 1.0 + 2

(S-表达式)

     (declaration_with_assignment (int x) (+ 1 2))
     (declaration_with_assignment (float x) (+ 1.0 2))

与赋值共享声明,添加节点,文字叶节点2,可以说是整数1和浮点数1.0的文字节点,取决于你是否希望将它们定义为“相等”或不相似4/12。

如果将其中一棵树更改为模式树,其中一些“离开”是模式变量,则可以使用此类模式树查找具有特定结构的代码。

表面语法模式:

  ?type ?variable = 1 + ?expression

使用S表达式

  ((declaration_with_assignment (?type ?varaible)) (+ 1 ?expression))

匹配OP的第一个示例,但不匹配第二个。

据我所知,Eclipse不提供任何基于模式的匹配功能。 但这些在程序分析和/或程序转换工具中非常有用。对于某些具体示例,此处包含的时间太长,请参阅DMS Rewrite Rules

(完全披露:DMS是我公司的产品。我是建筑师)。