它们是由编译过程的不同阶段生成的吗?或者它们只是同一个东西的不同名称?
发布于 2012-03-26 06:14:09
这是基于Terrence的Expression Evaluator语法的。
此示例的语法如下:
grammar Expr002;
options
{
output=AST;
ASTLabelType=CommonTree; // type of $stat.tree ref etc...
}
prog : ( stat )+ ;
stat : expr NEWLINE -> expr
| ID '=' expr NEWLINE -> ^('=' ID expr)
| NEWLINE ->
;
expr : multExpr (( '+'^ | '-'^ ) multExpr)*
;
multExpr
: atom ('*'^ atom)*
;
atom : INT
| ID
| '('! expr ')'!
;
ID : ('a'..'z' | 'A'..'Z' )+ ;
INT : '0'..'9'+ ;
NEWLINE : '\r'? '\n' ;
WS : ( ' ' | '\t' )+ { skip(); } ;
输入
x=1
y=2
3*(x+y)
解析树
解析树是输入的具体表示。解析树保留了输入的所有信息。空框表示空格,即行尾。
天冬氨酸
AST是输入的抽象表示。请注意,在AST中不存在父项,因为可以从树结构派生关联。
有关更详细的解释,请参阅Compilers and Compiler Generators pg。23
或者pg上的Abstract Syntax Trees。在Syntax and Semantics of Programming Languages中为21
发布于 2011-02-17 16:30:45
据我所知,AST更侧重于源代码组件之间的抽象关系,而解析树侧重于语言所使用的语法的实际实现,包括挑剔的细节。它们肯定是不同的,因为“解析树”的另一个术语是“具体语法树”。
我找到了这个page,它试图解决这个问题。
发布于 2011-02-17 16:36:16
马丁·福勒的DSL book很好地解释了这一点。AST只包含用于进一步处理的所有“有用”元素,而解析树包含所有工件(空格、方括号等)。从您解析的原始文档
https://stackoverflow.com/questions/5026517
复制相似问题