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


90

コンパイルプロセスのさまざまなフェーズで生成されますか?それとも同じものの名前が違うだけですか?


構文解析ツリーは、アーティファクトを含む文法の結果です(同じ言語で無限の文法を書くことができます)。ASTは、言語に最も近い構文解析ツリーを削減します。同じ言語のいくつかの文法は異なる解析ツリーを提供しますが、同じASTになるはずです。(また、異なるスクリプト(同じ文法からの異なる解析ツリー)を同じASTに削減することもできます)
Guillaume86

1
:これはSOの回答は詳細に説明しdfference stackoverflow.com/a/1916687/120163
アイラバクスター

回答:


95

これは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には括弧が存在しないことに注意してください。

AST

詳細については、「コンパイラとコンパイラジェネレータ」ページをご覧ください。pg。23
または抽象構文ツリー。21 プログラミング言語の構文と意味論


5
構文解析ツリーからASTをどのように導出しますか?構文解析ツリーをASTに単純化する方法は何ですか?
CMCDragonkai 2015

3
構文解析ツリーからASTを導出するための特定のアルゴリズムはありません。ASTに入るのはより個人的な好みですが、タスクを実行するのに十分な情報が含まれている必要があります。ANTLRを使用して、ASTから括弧を除外しました。演算子は文法では必要ないためですが、デフォルトではANTLRに含まれています。パースツリーは、必要かどうかに関係なくすべてを提供するものと見なし、ASTは最低限のものを提供するものと見なします。あなたは木をたくさんトラバースするので、サイズが重要であることを覚えておいてください。
ガイコーダ

2
CST(具体的な構文ツリー)対AST(抽象的な構文ツリー)のような意味ですか?
CMCDragonkai 2016年

パーサーまたはパーサージェネレーターの構文ファイルに埋め込まれたセマンティックアクション/ルールは、セマンティック分析とASTの作成の通常の方法ですが、パーサーの正当性の検証を除いて、ユーザーツリーによってパースツリーが構築または使用されることはほとんどありません。


16

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

この正確な質問を解決しようとするこのページを見つけました。


11

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


4

パスカル割り当てAge:= 42を受け取ります。

構文ツリーは、ソースコードと同じように見えます。以下では、ノードを括弧で囲んでいます。[年齢] [:=] [42] [;]

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

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

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


1

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.