parse tree 和AST有什么区别?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (94)

它们是由编译过程的不同阶段产生的吗?或者它们只是同一个事物的不同名称?

提问于
用户回答回答于

这基于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)

parse tree是输入的具体表示。parse tree保留了输入的所有信息。空框表示空白,即行尾。

AST

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

用户回答回答于

据我所知,AST更多地关注源代码组件之间的抽象关系,而parse tree着重于语言所使用的语法的实际实现,包括nitpicky细节。它们绝对不一样。

所属标签

可能回答问题的人

  • 应用案例分享

    1 粉丝490 提问5 回答
  • uncle_light

    5 粉丝518 提问4 回答
  • o o

    4 粉丝495 提问4 回答
  • 学生

    8 粉丝476 提问3 回答

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动