OP:我在哪里能够看到一个真实的编程语言实现,以便更好地学习?
对于你的源文件“Person.java”:
class Person {
String name;
int age;
public String toString()
{ return "name"; }
}
以下内容展示了来自我们的DMS软件重构工具包中,使用其Java1.6解析器以S表达式格式转储的解析树中的具体语法树和抽象语法树。所有显而易见的复杂性基本上都是由语言的实际复杂性(例如Java本身)引起的。
CST明显比AST包含更多内容(139个节点对54个节点)。 AST删除了可以从语法中自动推断出来的所有内容,给定AST。这包括删除非值叶子、一元产生式以及由左递归或右递归语法规则导致的压缩脊柱成为显式列表节点。
左括号表示一个新的子树。在左括号之后是节点类型的名称; @Java~Java1_.6可能看起来不必要,直到您理解DMS可以同时处理许多语言,包括嵌套在其中的语言。#nnnnnn是节点的内存地址。^M表示“此节点有M个父节点,并且当M == 1时该节点被省略。[...]中的内容是节点值。{M}表示此列表节点具有M个列表子节点。每个节点都带有位置信息。
这是具体语法树(请参见下面的AST):
(compilation_unit@Java~Java1_6=1
(type_declarations@Java~Java1_6=15
(type_declarations@Java~Java1_6=16
(type_declaration@Java~Java1_6=17
(type_class_modifiers@Java~Java1_6=77
(class_header@Java~Java1_6=89
|('class'@Java~Java1_6=459
|(IDENTIFIER@Java~Java1_6=447
|(type_parameters@Java~Java1_6=408
)class_header
(class_body@Java~Java1_6=94
|('{'@Java~Java1_6=448
|(class_body_declarations@Java~Java1_6=111
| (class_body_declarations@Java~Java1_6=111
| (class_body_declarations@Java~Java1_6=110
| (class_body_declaration@Java~Java1_6=118
| |(field_declaration@Java~Java1_6=168
| | (field_modifiers@Java~Java1_6=170
| | (type@Java~Java1_6=191
| | (name@Java~Java1_6=406
| | (IDENTIFIER@Java~Java1_6=447
| | (type_arguments@Java~Java1_6=407
| | )name
| | (brackets@Java~Java1_6=157
| | )type
| | (variable_declarator_list@Java~Java1_6=179
| | (variable_declarator@Java~Java1_6=181
| | (variable_declarator_id@Java~Java1_6=167
| | |(IDENTIFIER@Java~Java1_6=447
| | |(brackets@Java~Java1_6=157
| | )variable_declarator_id
| | )variable_declarator
| | )variable_declarator_list
| | ('
| |)field_declaration
| )class_body_declaration
| )class_body_declarations
| (class_body_declaration@Java~Java1_6=118
| (field_declaration@Java~Java1_6=168
| |(field_modifiers@Java~Java1_6=170
| |(type@Java~Java1_6=192
| | (primitive_type@Java~Java1_6=198
| | ('int'@Java~Java1_6=479
| | )primitive_type
| | (brackets@Java~Java1_6=157
| |)type
| |(variable_declarator_list@Java~Java1_6=179
| | (variable_declarator@Java~Java1_6=181
| | (variable_declarator_id@Java~Java1_6=167
| | (IDENTIFIER@Java~Java1_6=447
| | (brackets@Java~Java1_6=157
| | )variable_declarator_id
| | )variable_declarator
| |)variable_declarator_list
| |('
| )field_declaration
| )class_body_declaration
| )class_body_declarations
| (class_body_declaration@Java~Java1_6=117
| (method_declaration@Java~Java1_6=135
| (method_modifiers@Java~Java1_6=141
| |(method_modifiers@Java~Java1_6=142
| |(method_modifier@Java~Java1_6=147
| | ('public'@Java~Java1_6=453
| |)method_modifier
| )method_modifiers
| (type_parameters@Java~Java1_6=408
| (type@Java~Java1_6=191
| |(name@Java~Java1_6=406
| | (IDENTIFIER@Java~Java1_6=447
| | (type_arguments@Java~Java1_6=407
| |)name
| |(brackets@Java~Java1_6=157
| )type
| (IDENTIFIER@Java~Java1_6=447
| (parameters@Java~Java1_6=158
| |('('@Java~Java1_6=450
| |(')'@Java~Java1_6=451
| )parameters
| (brackets@Java~Java1_6=157
| (block@Java~Java1_6=217
| |('{'@Java~Java1_6=448
| |(statement_sequence@Java~Java1_6=218
| | (statement_sequence_member@Java~Java1_6=223
| | (executable_statement@Java~Java1_6=243
| | ('return'@Java~Java1_6=491
| | (expression@Java~Java1_6=332
| | |(conditional_expression@Java~Java1_6=345
| | | (conditional_or_expression@Java~Java1_6=347
| | | (conditional_and_expression@Java~Java1_6=349
| | | (inclusive_or_expression@Java~Java1_6=351
| | | |(exclusive_or_expression@Java~Java1_6=353
| | | | (and_expression@Java~Java1_6=355
| | | | (equality_expression@Java~Java1_6=357
| | | | (relational_expression@Java~Java1_6=360
| | | | |(shift_expression@Java~Java1_6=366
| | | | | (additive_expression@Java~Java1_6=370
| | | | | (multiplicative_expression@Java~Java1_6=373
| | | | | (unary_expression@Java~Java1_6=383
| | | | | |(unary_expression_not_plus_minus@Java~Java1_6=389
| | | | | | (literal@Java~Java1_6=390
| | | | | | (STRING@Java~Java1_6=536
| | | | | | )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
| | ('
| | )executable_statement
| | )statement_sequence_member
| |)statement_sequence
| |('}'@Java~Java1_6=449
| )block
| )method_declaration
| )class_body_declaration
|)class_body_declarations
|('}'@Java~Java1_6=449
)class_body
)type_declaration
)type_declarations
(optional_CONTROL_Z@Java~Java1_6=5
)compilation_unit
这是AST(由DMS从CST自动生成):
(compilation_unit@Java~Java1_6=1#486f900^0 Line 1 Column 1 File C:/temp/Person.java
(type_declarations@Java~Java1_6=15#486f4c0 {1} Line 1 Column 1 File C:/temp/Person.java
(type_declaration@Java~Java1_6=17#486f5e0 Line 1 Column 1 File C:/temp/Person.java
(type_class_modifiers@Java~Java1_6=77#486eda0 Line 1 Column 1 File C:/temp/Person.java)type_class_modifiers
(class_header@Java~Java1_6=89#486ee60 Line 1 Column 1 File C:/temp/Person.java
|(IDENTIFIER@Java~Java1_6=447#486ede0[`Person'] Line 1 Column 7 File C:/temp/Person.java)IDENTIFIER
|(type_parameters@Java~Java1_6=408#486ee20 Line 1 Column 14 File C:/temp/Person.java)type_parameters
)class_header
(class_body@Java~Java1_6=94#486f040 Line 1 Column 14 File C:/temp/Person.java
|(class_body_declarations@Java~Java1_6=111#486ee40 {3} Line 2 Column 5 File C:/temp/Person.java
| (class_body_declaration@Java~Java1_6=118#486f300 Line 2 Column 5 File C:/temp/Person.java
| (field_declaration@Java~Java1_6=168#486f380 Line 2 Column 5 File C:/temp/Person.java
| (field_modifiers@Java~Java1_6=170#486eec0 Line 2 Column 5 File C:/temp/Person.java)field_modifiers
| (type@Java~Java1_6=191#486f240 Line 2 Column 5 File C:/temp/Person.java
| |(name@Java~Java1_6=406#486f180 Line 2 Column 5 File C:/temp/Person.java
| | (IDENTIFIER@Java~Java1_6=447#486eea0[`String'] Line 2 Column 5 File C:/temp/Person.java)IDENTIFIER
| | (type_arguments@Java~Java1_6=407#486f0e0 Line 2 Column 12 File C:/temp/Person.java)type_arguments
| |)name
| |(brackets@Java~Java1_6=157#486f200 Line 2 Column 12 File C:/temp/Person.java)brackets
| )type
| (variable_declarator@Java~Java1_6=181#486ef20 Line 2 Column 12 File C:/temp/Person.java
| |(variable_declarator_id@Java~Java1_6=167#486efe0 Line 2 Column 12 File C:/temp/Person.java
| | (IDENTIFIER@Java~Java1_6=447#486f0c0[`name'] Line 2 Column 12 File C:/temp/Person.java)IDENTIFIER
| | (brackets@Java~Java1_6=157#486f060 Line 2 Column 16 File C:/temp/Person.java)brackets
| |)variable_declarator_id
| )variable_declarator
| )field_declaration
| )class_body_declaration
| (class_body_declaration@Java~Java1_6=118#486f000 Line 3 Column 5 File C:/temp/Person.java
| (field_declaration@Java~Java1_6=168#486f320 Line 3 Column 5 File C:/temp/Person.java
| (field_modifiers@Java~Java1_6=170#486f2a0 Line 3 Column 5 File C:/temp/Person.java)field_modifiers
| (type@Java~Java1_6=192#486eee0 Line 3 Column 5 File C:/temp/Person.java
| |(primitive_type@Java~Java1_6=198#486ef60 Line 3 Column 5 File C:/temp/Person.java)primitive_type
| |(brackets@Java~Java1_6=157#486ee00 Line 3 Column 12 File C:/temp/Person.java)brackets
| )type
| (variable_declarator@Java~Java1_6=181#486f2c0 Line 3 Column 12 File C:/temp/Person.java
| |(variable_declarator_id@Java~Java1_6=167#486f3a0 Line 3 Column 12 File C:/temp/Person.java
| | (IDENTIFIER@Java~Java1_6=447#486f120[`age'] Line 3 Column 12 File C:/temp/Person.java)IDENTIFIER
| | (brackets@Java~Java1_6=157#486ef00 Line 3 Column 15 File C:/temp/Person.java)brackets
| |)variable_declarator_id
| )variable_declarator
| )field_declaration
| )class_body_declaration
| (class_body_declaration@Java~Java1_6=117#486f7a0 Line 4 Column 5 File C:/temp/Person.java
| (method_declaration@Java~Java1_6=135#486f480 Line 4 Column 5 File C:/temp/Person.java
| (method_modifiers@Java~Java1_6=141#486f460 {1} Line 4 Column 5 File C:/temp/Person.java
| |(method_modifier@Java~Java1_6=147#486f400 Line 4 Column 5 File C:/temp/Person.java)method_modifier
| )method_modifiers
| (type_parameters@Java~Java1_6=408#486f540 Line 4 Column 12 File C:/temp/Person.java)type_parameters
| (type@Java~Java1_6=191#486f740 Line 4 Column 12 File C:/temp/Person.java
| |(name@Java~Java1_6=406#486f620 Line 4 Column 12 File C:/temp/Person.java
| | (IDENTIFIER@Java~Java1_6=447#486f080[`String'] Line 4 Column 12 File C:/temp/Person.java)IDENTIFIER
| | (type_arguments@Java~Java1_6=407#486f640 Line 4 Column 19 File C:/temp/Person.java)type_arguments
| |)name
| |(brackets@Java~Java1_6=157#486f700 Line 4 Column 19 File C:/temp/Person.java)brackets
| )type
| (IDENTIFIER@Java~Java1_6=447#486f140[`toString'] Line 4 Column 19 File C:/temp/Person.java)IDENTIFIER
| (parameters@Java~Java1_6=158#486f760 Line 4 Column 27 File C:/temp/Person.java)parameters
| (brackets@Java~Java1_6=157#486f820 Line 5 Column 7 File C:/temp/Person.java)brackets
| (block@Java~Java1_6=217#486f780 Line 5 Column 7 File C:/temp/Person.java
| |(statement_sequence@Java~Java1_6=218#486f6e0 Line 5 Column 9 File C:/temp/Person.java
| | (statement_sequence_member@Java~Java1_6=223#486f6c0 Line 5 Column 9 File C:/temp/Person.java
| | (executable_statement@Java~Java1_6=243#486f6a0 Line 5 Column 9 File C:/temp/Person.java
| | (unary_expression_not_plus_minus@Java~Java1_6=389#486f720 Line 5 Column 16 File C:/temp/Person.java
| | |(literal@Java~Java1_6=390#486f280 Line 5 Column 16 File C:/temp/Person.java
| | | (STRING@Java~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
(optional_CONTROL_Z@Java~Java1_6=5#486f4e0 Line 7 Column 1 File C:/temp/Person.java)optional_CONTROL_Z
)compilation_unit
编辑于2015年3月: 这里有一些C++ AST示例的链接
编辑于2015年5月: DMS也长时间支持Java 1.7和1.8。