コンパイラー設計書で2つの用語を見つけましたが、それぞれが何を表し、どのように異なるのかを知りたいと思います。
インターネットで検索したところ、解析ツリーは具象構文ツリー(CST)とも呼ばれています。
これは、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には括弧がありません。
編集
詳細な説明については、 Compilers and Compiler Generators by P.Dをご覧ください。テリーpg。 23.ソースコードなどのその他の項目については、著者 ホームページ も参照してください。
構文木(具体的な構文木、CST)および抽象構文木(AST)の、コンパイラ構築のコンテキストでの説明です。データ構造は似ていますが、構造が異なり、さまざまなタスクに使用されます。
構文解析ツリーは通常、字句解析の次のステップとして生成されます(これにより、ソースコードが一連のトークンに変換され、単なる一連の文字ではなく、意味のある単位として表示できます)。
それらは、問題の言語の文法によって端末の入力文字列(ソースコードトークン)がどのように生成されたかを示すツリーのようなデータ構造です。構文解析ツリーのルートは、文法の最も一般的なシンボル-開始シンボル(たとえば、statement)であり、内部ノードは、開始シンボルが展開される非終了シンボルを表します(開始を含めることができます) expression、statement、term、function callなど。葉は、文法の終端であり、言語/入力文字列で識別子、キーワード、および定数として表示される実際のシンボルです。 for、9、ifなど.
コンパイラーは構文解析中に構文の正確性を確認するためにさまざまなチェックも実行します。また、構文エラーレポートをパーサーコードに埋め込むことができます。
これらは、構文指向の定義または変換スキームによる構文指向の翻訳、中置式を後置式に変換するなどの単純なタスクに使用できます。
式9 - 5 + 2
の解析ツリーのグラフィカルな表現は次のとおりです(ツリー内の端末の配置と式文字列からの実際のシンボルに注意してください)。
ASTは構文を表しますコードの構造。式、フロー制御ステートメントなどのプログラミング構造のツリー-演算子(内部ノード)とオペランド(葉)にグループ化されます。たとえば、式i + 9
の構文ツリーは、演算子+
をルート、変数i
を演算子の左の子、番号9
を右に持つことになります。子。
ここでの違いは、ASTは文法や文字列生成を処理しないため、非端末と端末は役割を果たさないということです。ただし、構文はプログラミングであるため、文法によって生成される方法ではなく、そのような構造間の関係を表します。
演算子自体は特定の言語のプログラミング構造であり、実際の計算演算子である必要はないことに注意してください(+
isなど):for
ループもこの方法で処理されます。たとえば、for [ expr, expr, expr, stmnt ]
(インラインで表示)などの構文ツリーを作成できます。ここで、for
は演算子で、角括弧内の要素はその子( Cのfor
構文)-演算子などで構成されています。
ASTは通常、構文解析(解析)フェーズでもコンパイラによって生成され、後で意味解析、中間表現、コード生成などに使用されます。
ASTのグラフィカルな表現は次のとおりです。
ASTはソースコードを概念的に説明します。ソースコードの解析に必要なすべての構文要素(中括弧、キーワード、括弧など)を含む必要はありません。
解析ツリーは、ソースコードをより厳密に表します。
ASTでは、IFステートメントのノードに3つの子のみを含めることができます。
Cライクな言語の場合、解析ツリーには「if」キーワード、括弧、中括弧のノードも含める必要があります。
私はこれをウェブ上で見つけましたが、おそらく役立つでしょう:
構文解析ツリーは入力テキストの一致に使用されるルール(およびトークン)の記録です。一方、構文ツリーは入力の構造を記録し、それを生成した文法には影響されません。単一の言語には無限の数の文法があり、したがって、すべての文法は、すべての異なる中間規則のために、与えられた入力文に対して異なる解析ツリー形式になります。抽象構文木は、まさにこの無感覚性のため、そして文法ではなく言語の構造を強調するため、はるかに優れた中間形式です。
ウィキペディアによると
解析ツリーは、入力言語の構文を具体的に反映し、コンピュータープログラミングで使用される抽象的な構文ツリーとは区別されます。
Quoraの答えは言う
構文解析ツリーは入力テキストの一致に使用されるルール(およびトークン)の記録です。一方、構文ツリーは入力の構造を記録し、それを生成した文法には影響されません。
上記の2つの定義を組み合わせて、
Abstract Syntax Tree
は、解析ツリーを論理的に説明します。一部のソースコード(空白、ブレース、キーワード、括弧など)を解析するために必要なすべての構文構成要素を含む必要はありません。 Parse Tree
がConcrete Syntax Tree
とも呼ばれるのに対し、ASTはSyntax Tree
と呼ばれます。構文アナライザーの出力は、実際には構文ツリーです。