コンパイルプロセスのさまざまな段階で生成されますか?または、同じものに対して異なる名前ですか?
これは、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には括弧がありません。
詳細については、 コンパイラとコンパイラジェネレータ pgを参照してください。 23
または 要約構文ツリー pg。 21 in プログラミング言語の構文とセマンティクス
私が理解していることから、ASTはソースコードのコンポーネント間の抽象的な関係に焦点を合わせ、解析ツリーは言語が利用する文法の実際の実装に注意を払います。 。「解析ツリー」の別の用語は「具体的な構文ツリー」であるため、これらは間違いなく同じではありません。
私はこれを見つけました page これはこの正確な質問を解決しようとします。
Martin Fowlerの DSL book はこれをうまく説明しています。 ASTはさらに処理するために使用されるすべての「有用な」要素のみを含み、解析ツリーには解析する元のドキュメントからのすべてのアーティファクト(スペース、ブラケット、...)が含まれます
Pascal割り当てAge:= 42を使用します。
構文ツリーは、ソースコードのように見えます。以下では、ノードの周りに括弧を入れています。 [年齢] [:=] [42] [;]
抽象ツリーは次のようになります[=] [年齢] [42]
割り当ては、Ageと42の2つの要素を持つノードになります。アイデアは、割り当てを実行できるということです。
また、Pascal構文が消えることにも注意してください。したがって、複数の言語で同じASTを生成することができます。これは、クロスランゲージスクリプトエンジンに役立ちます。
解析ツリーでは、内部ノードは非終端であり、葉は終端です。構文ツリーでは、内部ノードは演算子であり、葉はオペランドです。