Как выглядит AST (абстрактное синтаксическое дерево) для объектно-ориентированного языка программирования?

Я читаю об AST (абстрактные синтаксические деревья), но все образцы, которые я вижу, используют выражения, такие как:

a + b * c 

который может быть представлен в виде lispy, например:

(+ a (* b c) )

Это будет эквивалентно:

  +
 / \
a   * 
   / \
  b   c

Мой вопрос: как выглядит AST для класса в OOPL?

Моя наивная попытка для этого 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

AST - это абстракция CST (конкретное дерево синтаксиса или дерево разбора). Конкретное дерево синтаксиса - это дерево, полученное из производств (в грамматике), используемых для анализа файла. Итак, ваш АСТ в основном получен из вашего определения грамматики, но для преобразованных

                        Exp                    
                      /  |  \                   
                     /   |   \                       *
                 Ident BinOp Ident       into       / \
                  /      |     \                  "x" "y"
                 /       |      \
               "x"       *      "y"

В целом, я думаю, что пример в вашем сообщении выглядит хорошо. Я бы, вероятно, обернул объявления переменных в varDeclList и объявлении функции в methDeclList, а оператор return в stmtList. (См. Ниже.)

Еще одно или меньшее "реальное" представление AST описано Apple в его книге "Современная реализация компилятора в Java". (Ресурсы можно найти здесь.)

Используя эти классы, ваша программа будет представлена ​​следующим образом:

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

Ответ 2

OP: Где я могу увидеть реальное представление реального языка программирования, чтобы узнать больше?

Для исходного текста в виде файла Person.java:

class Person {  
    String name;
    int    age;
    public String toString()
      { return "name";     } 
}

то, что следует, являются как белым, так и абстрактным синтаксическим деревом в дампе стиля S-выражения дерева парсеров из нашего DMS Software Reengineering Toolkit, используя его анализатор Java1.6. Вся сложность apparant в значительной степени обусловлена ​​реальной сложностью языка (например, самой Java).

CST явно содержит больше материала (139 узлов), чем AST (54 узла). AST оставляет все, что может быть автоматически выведено из грамматики, учитывая AST. Это включает удаление не несущих ценность листьев, унарных производств и сжатие шипов, вызванных левыми или правыми рекурсивными правилами грамматики, в явные узлы списка.

Левый парен сигнализирует новое поддерево. Следующим левым парнем является имя типа node; @Java ~ Java1_.6 может показаться ненужным, пока вы не поймете, что DMS может обрабатывать сразу несколько языков, включая langauges, вложенные друг в друга. #nnnnnn - адрес памяти node. ^ M означает, что этот node имеет M родителей и оставлен, когда M == 1. Вещи внутри [...] - это значение node. A {M} означает, что этот список node имеет M list-children. Каждый node имеет штамп с информацией о местоположении.

Это дерево синтаксиса Concrete (см. далее AST):

([email protected]~Java1_6=1#4885d00^0 Line 1 Column 1 File C:/temp/Person.java
 (ty[email protected]~Java1_6=15#4885cc0 Line 1 Column 1 File C:/temp/Person.java
  ([email protected]~Java1_6=16#4884d80 Line 1 Column 1 File C:/temp/Person.java)type_declarations
  ([email protected]~Java1_6=17#4885ca0 Line 1 Column 1 File C:/temp/Person.java
   ([email protected]~Java1_6=77#4884dc0 Line 1 Column 1 File C:/temp/Person.java)type_class_modifiers
   ([email protected]~Java1_6=89#4884ec0 Line 1 Column 1 File C:/temp/Person.java
   |('class'@Java~Java1_6=459#4884c60[Keyword:0] Line 1 Column 1 File C:/temp/Person.java)'class'
   |([email protected]~Java1_6=447#4884e20[`Person'] Line 1 Column 7 File C:/temp/Person.java)IDENTIFIER
   |([email protected]~Java1_6=408#4884e80 Line 1 Column 14 File C:/temp/Person.java)type_parameters
   )class_header
   ([email protected]~Java1_6=94#4885c80 Line 1 Column 14 File C:/temp/Person.java
   |('{'@Java~Java1_6=448#4884e60[Keyword:0] Line 1 Column 14 File C:/temp/Person.java)'{'
   |([email protected]~Java1_6=111#4885c60 Line 2 Column 5 File C:/temp/Person.java
   | ([email protected]~Java1_6=111#4885380 Line 2 Column 5 File C:/temp/Person.java
   |  ([email protected]~Java1_6=110#4885400 Line 2 Column 5 File C:/temp/Person.java
   |   ([email protected]~Java1_6=118#4885360 Line 2 Column 5 File C:/temp/Person.java
   |   |([email protected]~Java1_6=168#4885440 Line 2 Column 5 File C:/temp/Person.java
   |   | ([email protected]~Java1_6=170#4884f40 Line 2 Column 5 File C:/temp/Person.java)field_modifiers
   |   | ([email protected]~Java1_6=191#48852c0 Line 2 Column 5 File C:/temp/Person.java
   |   |  ([email protected]~Java1_6=406#48851e0 Line 2 Column 5 File C:/temp/Person.java
   |   |   ([email protected]~Java1_6=447#4884f20[`String'] Line 2 Column 5 File C:/temp/Person.java)IDENTIFIER
   |   |   ([email protected]~Java1_6=407#4885160 Line 2 Column 12 File C:/temp/Person.java)type_arguments
   |   |  )name
   |   |  ([email protected]~Java1_6=157#4885260 Line 2 Column 12 File C:/temp/Person.java)brackets
   |   | )type
   |   | ([email protected]~Java1_6=179#4884e00 Line 2 Column 12 File C:/temp/Person.java
   |   |  ([email protected]~Java1_6=181#4885300 Line 2 Column 12 File C:/temp/Person.java
   |   |   ([email protected]~Java1_6=167#4885320 Line 2 Column 12 File C:/temp/Person.java
   |   |   |([email protected]~Java1_6=447#4885140[`name'] Line 2 Column 12 File C:/temp/Person.java)IDENTIFIER
   |   |   |([email protected]~Java1_6=157#4885040 Line 2 Column 16 File C:/temp/Person.java)brackets
   |   |   )variable_declarator_id
   |   |  )variable_declarator
   |   | )variable_declarator_list
   |   | (';'@Java~Java1_6=440#4885100[Keyword:0] Line 2 Column 16 File C:/temp/Person.java)';'
   |   |)field_declaration
   |   )class_body_declaration
   |  )class_body_declarations
   |  ([email protected]~Java1_6=118#48852e0 Line 3 Column 5 File C:/temp/Person.java
   |   ([email protected]~Java1_6=168#4885480 Line 3 Column 5 File C:/temp/Person.java
   |   |([email protected]~Java1_6=170#4885340 Line 3 Column 5 File C:/temp/Person.java)field_modifiers
   |   |([email protected]~Java1_6=192#4885220 Line 3 Column 5 File C:/temp/Person.java
   |   | ([email protected]~Java1_6=198#4885420 Line 3 Column 5 File C:/temp/Person.java
   |   |  ('int'@Java~Java1_6=479#48853e0[Keyword:0] Line 3 Column 5 File C:/temp/Person.java)'int'
   |   | )primitive_type
   |   | ([email protected]~Java1_6=157#4885200 Line 3 Column 12 File C:/temp/Person.java)brackets
   |   |)type
   |   |([email protected]~Java1_6=179#4885540 Line 3 Column 12 File C:/temp/Person.java
   |   | ([email protected]~Java1_6=181#4885520 Line 3 Column 12 File C:/temp/Person.java
   |   |  ([email protected]~Java1_6=167#4885500 Line 3 Column 12 File C:/temp/Person.java
   |   |   ([email protected]~Java1_6=447#4884fc0[`age'] Line 3 Column 12 File C:/temp/Person.java)IDENTIFIER
   |   |   ([email protected]~Java1_6=157#48854e0 Line 3 Column 15 File C:/temp/Person.java)brackets
   |   |  )variable_declarator_id
   |   | )variable_declarator
   |   |)variable_declarator_list
   |   |(';'@Java~Java1_6=440#48854c0[Keyword:0] Line 3 Column 15 File C:/temp/Person.java)';'
   |   )field_declaration
   |  )class_body_declaration
   | )class_body_declarations
   | ([email protected]~Java1_6=117#4885c40 Line 4 Column 5 File C:/temp/Person.java
   |  ([email protected]~Java1_6=135#4885c00 Line 4 Column 5 File C:/temp/Person.java
   |   ([email protected]~Java1_6=141#4885700 Line 4 Column 5 File C:/temp/Person.java
   |   |([email protected]~Java1_6=142#4884e40 Line 4 Column 5 File C:/temp/Person.java)method_modifiers
   |   |([email protected]~Java1_6=147#48856a0 Line 4 Column 5 File C:/temp/Person.java
   |   | ('public'@Java~Java1_6=453#48853a0[Keyword:0] Line 4 Column 5 File C:/temp/Person.java)'public'
   |   |)method_modifier
   |   )method_modifiers
   |   ([email protected]~Java1_6=408#4885740 Line 4 Column 12 File C:/temp/Person.java)type_parameters
   |   ([email protected]~Java1_6=191#4885900 Line 4 Column 12 File C:/temp/Person.java
   |   |([email protected]~Java1_6=406#48852a0 Line 4 Column 12 File C:/temp/Person.java
   |   | ([email protected]~Java1_6=447#4885660[`String'] Line 4 Column 12 File C:/temp/Person.java)IDENTIFIER
   |   | ([email protected]~Java1_6=407#48851a0 Line 4 Column 19 File C:/temp/Person.java)type_arguments
   |   |)name
   |   |([email protected]~Java1_6=157#48858c0 Line 4 Column 19 File C:/temp/Person.java)brackets
   |   )type
   |   ([email protected]~Java1_6=447#48855c0[`toString'] Line 4 Column 19 File C:/temp/Person.java)IDENTIFIER
   |   ([email protected]~Java1_6=158#48858e0 Line 4 Column 27 File C:/temp/Person.java
   |   |('('@Java~Java1_6=450#4885840[Keyword:0] Line 4 Column 27 File C:/temp/Person.java)'('
   |   |(')'@Java~Java1_6=451#4885620[Keyword:0] Line 4 Column 28 File C:/temp/Person.java)')'
   |   )parameters
   |   ([email protected]~Java1_6=157#4885060 Line 5 Column 7 File C:/temp/Person.java)brackets
   |   ([email protected]~Java1_6=217#4885be0 Line 5 Column 7 File C:/temp/Person.java
   |   |('{'@Java~Java1_6=448#48851c0[Keyword:0] Line 5 Column 7 File C:/temp/Person.java)'{'
   |   |([email protected]~Java1_6=218#4885ba0 Line 5 Column 9 File C:/temp/Person.java
   |   | ([email protected]~Java1_6=223#4885b80 Line 5 Column 9 File C:/temp/Person.java
   |   |  ([email protected]~Java1_6=243#4885b60 Line 5 Column 9 File C:/temp/Person.java
   |   |   ('return'@Java~Java1_6=491#4884f60[Keyword:0] Line 5 Column 9 File C:/temp/Person.java)'return'
   |   |   ([email protected]~Java1_6=332#4885ac0 Line 5 Column 16 File C:/temp/Person.java
   |   |   |([email protected]~Java1_6=345#4885a60 Line 5 Column 16 File C:/temp/Person.java
   |   |   | ([email protected]~Java1_6=347#4885a20 Line 5 Column 16 File C:/temp/Person.java
   |   |   |  ([email protected]~Java1_6=349#48859e0 Line 5 Column 16 File C:/temp/Person.java
   |   |   |   ([email protected]~Java1_6=351#48857e0 Line 5 Column 16 File C:/temp/Person.java
   |   |   |   |([email protected]~Java1_6=353#48855a0 Line 5 Column 16 File C:/temp/Person.java
   |   |   |   | ([email protected]~Java1_6=355#4885940 Line 5 Column 16 File C:/temp/Person.java
   |   |   |   |  ([email protected]~Java1_6=357#4885880 Line 5 Column 16 File C:/temp/Person.java
   |   |   |   |   ([email protected]~Java1_6=360#4885800 Line 5 Column 16 File C:/temp/Person.java
   |   |   |   |   |([email protected]~Java1_6=366#48856c0 Line 5 Column 16 File C:/temp/Person.java
   |   |   |   |   | ([email protected]~Java1_6=370#4885180 Line 5 Column 16 File C:/temp/Person.java
   |   |   |   |   |  ([email protected]~Java1_6=373#4885780 Line 5 Column 16 File C:/temp/Person.java
   |   |   |   |   |   ([email protected]~Java1_6=383#4885600 Line 5 Column 16 File C:/temp/Person.java
   |   |   |   |   |   |([email protected]~Java1_6=389#4885680 Line 5 Column 16 File C:/temp/Person.java
   |   |   |   |   |   | ([email protected]~Java1_6=390#4884f80 Line 5 Column 16 File C:/temp/Person.java
   |   |   |   |   |   |  ([email protected]~Java1_6=536#4885120[`name'] Line 5 Column 16 File C:/temp/Person.java)STRING
   |   |   |   |   |   | )literal
   |   |   |   |   |   |)unary_expression_not_plus_minus
   |   |   |   |   |   )unary_expression
   |   |   |   |   |  )multiplicative_expression
   |   |   |   |   | )additive_expression
   |   |   |   |   |)shift_expression
   |   |   |   |   )relational_expression
   |   |   |   |  )equality_expression
   |   |   |   | )and_expression
   |   |   |   |)exclusive_or_expression
   |   |   |   )inclusive_or_expression
   |   |   |  )conditional_and_expression
   |   |   | )conditional_or_expression
   |   |   |)conditional_expression
   |   |   )expression
   |   |   (';'@Java~Java1_6=440#48856e0[Keyword:0] Line 5 Column 22 File C:/temp/Person.java)';'
   |   |  )executable_statement
   |   | )statement_sequence_member
   |   |)statement_sequence
   |   |('}'@Java~Java1_6=449#4885b40[Keyword:0] Line 5 Column 28 File C:/temp/Person.java)'}'
   |   )block
   |  )method_declaration
   | )class_body_declaration
   |)class_body_declarations
   |('}'@Java~Java1_6=449#4885bc0[Keyword:0] Line 6 Column 1 File C:/temp/Person.java)'}'
   )class_body
  )type_declaration
 )type_declarations
 ([email protected]~Java1_6=5#4885ce0 Line 7 Column 1 File C:/temp/Person.java)optional_CONTROL_Z
)compilation_unit

Это AST (автоматически генерируемый DMS из CST):

([email protected]~Java1_6=1#486f900^0 Line 1 Column 1 File C:/temp/Person.java
 ([email protected]~Java1_6=15#486f4c0 {1} Line 1 Column 1 File C:/temp/Person.java
  ([email protected]~Java1_6=17#486f5e0 Line 1 Column 1 File C:/temp/Person.java
   ([email protected]~Java1_6=77#486eda0 Line 1 Column 1 File C:/temp/Person.java)type_class_modifiers
   ([email protected]~Java1_6=89#486ee60 Line 1 Column 1 File C:/temp/Person.java
   |([email protected]~Java1_6=447#486ede0[`Person'] Line 1 Column 7 File C:/temp/Person.java)IDENTIFIER
   |([email protected]~Java1_6=408#486ee20 Line 1 Column 14 File C:/temp/Person.java)type_parameters
   )class_header
   ([email protected]~Java1_6=94#486f040 Line 1 Column 14 File C:/temp/Person.java
   |([email protected]~Java1_6=111#486ee40 {3} Line 2 Column 5 File C:/temp/Person.java
   | ([email protected]~Java1_6=118#486f300 Line 2 Column 5 File C:/temp/Person.java
   |  ([email protected]~Java1_6=168#486f380 Line 2 Column 5 File C:/temp/Person.java
   |   ([email protected]~Java1_6=170#486eec0 Line 2 Column 5 File C:/temp/Person.java)field_modifiers
   |   ([email protected]~Java1_6=191#486f240 Line 2 Column 5 File C:/temp/Person.java
   |   |([email protected]~Java1_6=406#486f180 Line 2 Column 5 File C:/temp/Person.java
   |   | ([email protected]~Java1_6=447#486eea0[`String'] Line 2 Column 5 File C:/temp/Person.java)IDENTIFIER
   |   | ([email protected]~Java1_6=407#486f0e0 Line 2 Column 12 File C:/temp/Person.java)type_arguments
   |   |)name
   |   |([email protected]~Java1_6=157#486f200 Line 2 Column 12 File C:/temp/Person.java)brackets
   |   )type
   |   ([email protected]~Java1_6=181#486ef20 Line 2 Column 12 File C:/temp/Person.java
   |   |([email protected]~Java1_6=167#486efe0 Line 2 Column 12 File C:/temp/Person.java
   |   | ([email protected]~Java1_6=447#486f0c0[`name'] Line 2 Column 12 File C:/temp/Person.java)IDENTIFIER
   |   | ([email protected]~Java1_6=157#486f060 Line 2 Column 16 File C:/temp/Person.java)brackets
   |   |)variable_declarator_id
   |   )variable_declarator
   |  )field_declaration
   | )class_body_declaration
   | ([email protected]~Java1_6=118#486f000 Line 3 Column 5 File C:/temp/Person.java
   |  ([email protected]~Java1_6=168#486f320 Line 3 Column 5 File C:/temp/Person.java
   |   ([email protected]~Java1_6=170#486f2a0 Line 3 Column 5 File C:/temp/Person.java)field_modifiers
   |   ([email protected]~Java1_6=192#486eee0 Line 3 Column 5 File C:/temp/Person.java
   |   |([email protected]~Java1_6=198#486ef60 Line 3 Column 5 File C:/temp/Person.java)primitive_type
   |   |([email protected]~Java1_6=157#486ee00 Line 3 Column 12 File C:/temp/Person.java)brackets
   |   )type
   |   ([email protected]~Java1_6=181#486f2c0 Line 3 Column 12 File C:/temp/Person.java
   |   |([email protected]~Java1_6=167#486f3a0 Line 3 Column 12 File C:/temp/Person.java
   |   | ([email protected]~Java1_6=447#486f120[`age'] Line 3 Column 12 File C:/temp/Person.java)IDENTIFIER
   |   | ([email protected]~Java1_6=157#486ef00 Line 3 Column 15 File C:/temp/Person.java)brackets
   |   |)variable_declarator_id
   |   )variable_declarator
   |  )field_declaration
   | )class_body_declaration
   | ([email protected]~Java1_6=117#486f7a0 Line 4 Column 5 File C:/temp/Person.java
   |  ([email protected]~Java1_6=135#486f480 Line 4 Column 5 File C:/temp/Person.java
   |   ([email protected]~Java1_6=141#486f460 {1} Line 4 Column 5 File C:/temp/Person.java
   |   |([email protected]~Java1_6=147#486f400 Line 4 Column 5 File C:/temp/Person.java)method_modifier
   |   )method_modifiers
   |   ([email protected]~Java1_6=408#486f540 Line 4 Column 12 File C:/temp/Person.java)type_parameters
   |   ([email protected]~Java1_6=191#486f740 Line 4 Column 12 File C:/temp/Person.java
   |   |([email protected]~Java1_6=406#486f620 Line 4 Column 12 File C:/temp/Person.java
   |   | ([email protected]~Java1_6=447#486f080[`String'] Line 4 Column 12 File C:/temp/Person.java)IDENTIFIER
   |   | ([email protected]~Java1_6=407#486f640 Line 4 Column 19 File C:/temp/Person.java)type_arguments
   |   |)name
   |   |([email protected]~Java1_6=157#486f700 Line 4 Column 19 File C:/temp/Person.java)brackets
   |   )type
   |   ([email protected]~Java1_6=447#486f140[`toString'] Line 4 Column 19 File C:/temp/Person.java)IDENTIFIER
   |   ([email protected]~Java1_6=158#486f760 Line 4 Column 27 File C:/temp/Person.java)parameters
   |   ([email protected]~Java1_6=157#486f820 Line 5 Column 7 File C:/temp/Person.java)brackets
   |   ([email protected]~Java1_6=217#486f780 Line 5 Column 7 File C:/temp/Person.java
   |   |([email protected]~Java1_6=218#486f6e0 Line 5 Column 9 File C:/temp/Person.java
   |   | ([email protected]~Java1_6=223#486f6c0 Line 5 Column 9 File C:/temp/Person.java
   |   |  ([email protected]~Java1_6=243#486f6a0 Line 5 Column 9 File C:/temp/Person.java
   |   |   ([email protected]~Java1_6=389#486f720 Line 5 Column 16 File C:/temp/Person.java
   |   |   |([email protected]~Java1_6=390#486f280 Line 5 Column 16 File C:/temp/Person.java
   |   |   | ([email protected]~Java1_6=536#486f160[`name'] Line 5 Column 16 File C:/temp/Person.java)STRING
   |   |   |)literal
   |   |   )unary_expression_not_plus_minus
   |   |  )executable_statement
   |   | )statement_sequence_member
   |   |)statement_sequence
   |   )block
   |  )method_declaration
   | )class_body_declaration
   |)class_body_declarations
   )class_body
  )type_declaration
 )type_declarations
 ([email protected]~Java1_6=5#486f4e0 Line 7 Column 1 File C:/temp/Person.java)optional_CONTROL_Z
)compilation_unit

EDIT Март 2015: Здесь ссылка на некоторые примеры С++ AST

Изменить май 2015: DMS уже давно выполняет Java 1.7 и 1.8.

Ответ 3

Взгляните на Eclipse JDT AST.

В качестве первого введения вы можете прочитать этот учебник.