web-dev-qa-db-ja.com

解析ツリーとASTの違いは何ですか?

コンパイルプロセスのさまざまな段階で生成されますか?または、同じものに対して異なる名前ですか?

81
Thomson

これは、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

AST

ASTは入力の抽象表現です。関連付けはツリー構造から派生しているため、ASTには括弧がありません。

AST

詳細については、 コンパイラとコンパイラジェネレータ pgを参照してください。 23
または 要約構文ツリー pg。 21 in プログラミング言語の構文とセマンティクス

88
Guy Coder

私が理解していることから、ASTはソースコードのコンポーネント間の抽象的な関係に焦点を合わせ、解析ツリーは言語が利用する文法の実際の実装に注意を払います。 。「解析ツリー」の別の用語は「具体的な構文ツリー」であるため、これらは間違いなく同じではありません。

私はこれを見つけました page これはこの正確な質問を解決しようとします。

16

Martin Fowlerの DSL book はこれをうまく説明しています。 ASTはさらに処理するために使用されるすべての「有用な」要素のみを含み、解析ツリーには解析する元のドキュメントからのすべてのアーティファクト(スペース、ブラケット、...)が含まれます

10
Wim Deblauwe

Pascal割り当てAge:= 42を使用します。

構文ツリーは、ソースコードのように見えます。以下では、ノードの周りに括弧を入れています。 [年齢] [:=] [42] [;]

抽象ツリーは次のようになります[=] [年齢] [42]

割り当ては、Ageと42の2つの要素を持つノードになります。アイデアは、割り当てを実行できるということです。

また、Pascal構文が消えることにも注意してください。したがって、複数の言語で同じASTを生成することができます。これは、クロスランゲージスクリプトエンジンに役立ちます。

4
William Egge

解析ツリーでは、内部ノードは非終端であり、葉は終端です。構文ツリーでは、内部ノードは演算子であり、葉はオペランドです。

1
Roshani Patel