首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >语法分析树和抽象语法树(AST)有什么不同?

语法分析树和抽象语法树(AST)有什么不同?
EN

Stack Overflow用户
提问于 2011-02-17 16:19:19
回答 5查看 41.6K关注 0票数 107

它们是由编译过程的不同阶段生成的吗?或者它们只是同一个东西的不同名称?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-03-26 06:14:09

这是基于Terrence的Expression Evaluator语法的。

此示例的语法如下:

代码语言:javascript
复制
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(); } ;

输入

代码语言:javascript
复制
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

票数 108
EN

Stack Overflow用户

发布于 2011-02-17 16:30:45

据我所知,AST更侧重于源代码组件之间的抽象关系,而解析树侧重于语言所使用的语法的实际实现,包括挑剔的细节。它们肯定是不同的,因为“解析树”的另一个术语是“具体语法树”。

我找到了这个page,它试图解决这个问题。

票数 17
EN

Stack Overflow用户

发布于 2011-02-17 16:36:16

马丁·福勒的DSL book很好地解释了这一点。AST只包含用于进一步处理的所有“有用”元素,而解析树包含所有工件(空格、方括号等)。从您解析的原始文档

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5026517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档