面向对象的编程语言的AST(抽象语法树)是什么样的?

我正在阅读有关AST(抽象语法树)的信息,但是我看到的所有示例都使用如下表达式:


a + b * c 

可以用像这样的语法来表示:


(+ 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))

在哪里可以看到实际编程语言的“真实”表示,以了解更多信息。


达令说
浏览 606回答 3
3回答

慕田峪7331174

AST是CST的抽象(具体的语法树或解析树)。具体的语法树是从用于语法分析文件的结果(语法)中得到的树。因此,您的AST基本上是从您的语法定义派生的,但是已经转换为                        Exp                                          /  |  \                                        /   |   \                       *                 Ident BinOp Ident       into       / \                  /      |     \                  "x" "y"                 /       |      \               "x"       *      "y"总而言之,我认为您帖子中的示例看起来不错。我可能会将变量声明包装在中varDeclList,将函数声明包装在中methDeclList,将return语句包装在中stmtList。(见下文。)苹果在他的《 Java的现代编译器实现》一书中描述了AST的某种“真实”表示。(可在此处找到资源。)使用这些类,您的程序将如下所示:Program    ClassDeclList        ClassDecl            Identifier                id: Person            VarDeclList                VarDecl                    type: String                    id: name                VarDecl                    type: int                    id: age            MethDeclList                MethodDecl                    modifiers: public                    returnType: String                    id: toString                    Formals                        (empty)                    StmtList                        returnStmt                            Identifier                                id: name
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java