我在编译器设计书中找到了这两个术语,我想知道每个术语代表什么,以及它们有何不同。

我在互联网上搜索,发现解析树也称为具体语法树(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)

解析树

解析树是输入的具体表示。解析树保留了输入的所有信息。空框代表空格,即行尾。

compiler-construction - 解析树和抽象语法树有什么区别?-LMLPHP

AST

AST 是输入的抽象表示。请注意,AST 中不存在括号,因为关联可从树结构中推导出来。

compiler-construction - 解析树和抽象语法树有什么区别?-LMLPHP

编辑

有关详细解释,请参阅 P.D. 的 Compilers and Compiler Generators。特里 pg。 23. 有关更多项目(例如源代码),另请参阅作者 home page

关于compiler-construction - 解析树和抽象语法树有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5967888/

10-16 17:05