コンパイルプロセスのさまざまなフェーズで生成されますか?それとも同じものの名前が違うだけですか?
コンパイルプロセスのさまざまなフェーズで生成されますか?それとも同じものの名前が違うだけですか?
回答:
これは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
または抽象構文ツリー。21 プログラミング言語の構文と意味論
私が理解していることから、ASTはソースコードのコンポーネント間の抽象的な関係に重点を置いていますが、解析ツリーは言語によって使用される文法の実際の実装に焦点を当てています。「解析ツリー」の別の用語は「具体的な構文ツリー」であるため、これらはまったく同じではありません。
この正確な質問を解決しようとするこのページを見つけました。
Martin Fowler のDSLブックがこれをうまく説明しています。ASTには、以降の処理に使用されるすべての「有用な」要素のみが含まれますが、解析ツリーには、解析した元のドキュメントからのすべてのアーティファクト(スペース、ブラケットなど)が含まれます