它们是由编译过程的不同阶段生成的吗?或者它们只是同一事物的不同名称?
最佳答案
这是基于 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 是输入的抽象表示。请注意,AST 中不存在括号,因为关联可以从树结构中导出。
有关更详细的解释,请参阅 Compilers and Compiler Generators第 页23
或Abstract Syntax Trees上页。 21 在 Syntax and Semantics of Programming Languages
关于compiler-construction - 解析树和抽象语法树(AST)有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5026517/