我在编译器设计书中找到了这两个术语,我想知道每个术语代表什么,以及它们有何不同。
我在互联网上搜索,发现解析树也称为具体语法树(CST)。
最佳答案
这是基于 Terrence Parr 的 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 中不存在括号,因为关联可从树结构中推导出来。
编辑
有关详细解释,请参阅 P.D. 的 Compilers and Compiler Generators。特里 pg。 23. 有关更多项目(例如源代码),另请参阅作者 home page。
关于compiler-construction - 解析树和抽象语法树有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5967888/