java面向对象编程语言的AST(抽象语法树)是什么样子的?
我正在阅读有关AST(抽象语法树)的文章,但我看到的所有示例都使用以下表达式:
a + b * c
可以用类似lispy的语法表示为:
(+ a (* b c) )
这相当于:
+
/ \
a *
/ \
b c
我的问题是OOPL中的一个类的AST是什么样子的
我天真的尝试是针对以下Java代码:
class Person {
String name;
int age;
public String toString() {
return "name";
}
}
是:
;Hand written
(classDeclaration Person
(varDeclaration String name)
(varDeclaration int age )
(funcDeclaration String toString
(return "name")
)
)
但我不确定我离真正的AST代表有多近或有多远
这取决于我选择的语言吗。需要多少细节?这些“xyzDeclaraction”是需要的还是可以是:
(Person (String name) (int age))
在哪里可以看到实际编程语言的“真实”表示,以了解更多信息
# 1 楼答案
看看Eclipse JDT AST实现
作为第一篇介绍,你也可以阅读这篇tutorial
# 2 楼答案
AST是CST(concrete syntax tree,或解析树)的抽象。具体语法树是由用于解析文件的结果(语法中)生成的树。所以你的AST基本上是从你的语法定义中派生出来的,但是已经被转换了
总而言之,我认为你帖子中的例子看起来不错。我可能会将变量声明包装在
varDeclList
中,函数声明包装在methDeclList
中,返回语句包装在stmtList
中。(见下文。)苹果在《Java中的现代编译器实现》一书中描述了AST的一种或多或少的“真实”表示。(可以在here中找到资源。)
使用这些类,您的程序将表示为:
# 3 楼答案
OP:我在哪里可以看到实际编程语言的真实表示,以了解更多信息
作为一个文件人,为你的源文本。爪哇:
下面是我们DMS Software Reengineering Toolkit的解析器树的S表达式风格转储中的具体和抽象语法树,使用它的Java1。6.语法分析器。所有明显的复杂性几乎都是由语言的真正复杂性(例如Java本身)造成的
CST显然比AST(54个节点)包含更多的内容(139个节点)。在给定AST的情况下,AST会删除所有可以从语法中自动推断出来的内容。这包括删除不带值的叶子、一元结果,以及将由左或右递归语法规则产生的脊椎压缩到显式列表节点中
左括号表示一个新子树。左括号后面是节点类型的名称@在您了解DMS可以同时处理多种语言之前,Java~Java1_2;6可能看起来是不必要的,包括嵌套在彼此内部的语言。#nnnnnn是节点的内存地址^M表示“此节点有M个父节点,当M==1时,此节点将被关闭。内部的事物[…]是节点值。{M}表示此列表节点有M个列表子节点。每个节点都印有位置信息
这是具体的语法树(请参阅下面的AST):
这是AST(由DMS从CST自动生成):
2015年3月编辑:Here's a link to some C++ AST examples
2015年5月编辑:DMS长期以来也在使用Java 1.7和1.8