具体的な構文木は、文法規則が言う構文と一致します。抽象構文ツリーの目的は、「構文ツリー」に不可欠なものを「単純な」表現にすることです。
AST IMHO の真の価値は、CST よりも小さいため、処理にかかる時間が短いことです。(誰が気にするの?と言うかもしれませんが、私は一度に数千万のノードが存在するツールを使用しています!)。
構文ツリーの構築をサポートしているほとんどのパーサー ジェネレーターは、ツリー ノードが CST よりも「単純」であるという前提の下で、どのように構築されるかを個人的に正確に指定することを主張します (プログラマーはかなり怠惰)。ほぼ間違いなく、ツリー ビジター関数をコーディングする必要が少なくなることを意味します。これは、エンジニアリング エネルギーを最小限に抑えるという点でも価値があります。3500 のルールがある場合 (たとえば、COBOL の場合)、これは重要です。そして、この「シンプルさ」が「小ささ」の良さにつながります。
しかし、そのような AST を使用すると、そこにはなかった問題が生じます。文法と一致しないため、精神的に両方の AST を追跡する必要があります。そして、3500 の規則文法に対して 1500 の AST ノードがある場合、これは非常に重要です。そして、文法が進化する場合 (常に進化します!)、同期を保つ必要がある 2 つの巨大なセットがあります。
もう 1 つの解決策は、パーサーに CST ノードを単純に構築させ、それらを使用させることです。これは、文法を構築する際の大きな利点です。3500 の文法規則をモデル化するために 1500 の特別な AST ノードを発明する必要はありません。ツリーが文法と同型であることを考えてみてください。文法エンジニアの観点からは、これは完全に無知であり、文法を正しく理解し、心ゆくまでハッキングすることに集中できます。おそらく、より多くのノード ビジター ルールを作成する必要がありますが、それは管理できます。これについては後で詳しく説明します。
DMS Software Reengineering Toolkitで行うことは、(GLR) 解析プロセスの結果に基づいて CST を自動的に構築することです。次に、DMS は、スペース効率の理由から、値を持たない終端 (キーワード、句読点)、意味的に役に立たない単項生成を排除し、次のようなリストである文法規則ペアの直接インデックス可能なリストを形成することにより、「圧縮された」CST を自動的に構築します。
L = e ;
L = L e ;
L2 = e2 ;
L2 = L2 ',' e2 ;
そして、そのような形の多種多様なバリエーション。文法規則と仮想 CST の観点から考えます。ツールは圧縮された表現で動作します。脳にやさしく、実行時に高速/小型化。
驚くべきことに、この方法で構築された圧縮された CST は、手動で設計した AST によく似ています (例の最後にあるリンクを参照してください)。特に、圧縮された CST には、単なる具体的な構文であるノードは含まれていません。少し厄介な点があります。たとえば、式の部分文法で古典的に見られる '(' および ')' の具体的なノードはツリーにありませんが、「括弧ノード」は圧縮された CST に表示され、処理する必要があります。真の AST にはこれがありません。これは、AST 構造を指定する必要がないという利便性のために支払うかなり小さな代償のように思えます。そして、ツリーのドキュメントは常に利用可能で正確です。文法はドキュメントです。
「余分な訪問者」を避けるにはどうすればよいですか?完全ではありませんが、DMS は、AST をウォークし、CST と AST の違いを透過的に処理する AST ライブラリを提供します。DMS は「属性文法」エバリュエーター (AGE) も提供します。これは、ノードで計算された値をツリーの上下に渡す方法です。AGE はすべてのツリー表現の問題を処理するため、ツール エンジニアは、文法規則自体に直接効果的に計算を書き込むことだけを心配します。最後に、DMS は「表面構文」パターンも提供します。これにより、関連するノード タイプのほとんどを知らなくても、文法のコード フラグメントを使用して特定のタイプのサブツリーを見つけることができます。
他の回答の1つは、ソースを再生成できるツールを構築したい場合、ASTがCSTと一致する必要があることを示しています。これは正しくありませんが、CST ノードがあれば、ソースを再生成する方がはるかに簡単です。 DMSは両方にアクセスできるため、ほとんどの prettyprinter を自動的に生成します :-}
結論: AST は、物理的および概念的な小規模の場合に適しています。CST から自動化された AST 構築は両方を提供し、2 つの異なるセットを追跡する問題を回避できます。
EDIT 2015 年 3 月: この方法で構築された CST と「AST」の例へのリンク