TL;DR

ソースコードなど、形式言語で書かれたテキストの構文構造を木で表したもの。Abstract Syntax Tree を略して AST とも呼ぶ。木の各ノードがテキスト中の構文要素を表す。

なぜ必要か

コンパイラは AST を中間表現として複数の段階で使う。意味解析では AST を頻繁にたどり、コード生成でも AST を土台にする。プログラム解析やプログラム変換のツールも、AST を使ってコードの構造を扱う。文字列のままではなく構造として扱えるので、コードを安全に調べたり書き換えたりできる。

仕組み

「抽象」と呼ぶのは、元の構文の細部をすべては表さないという意味である。たとえば、グループ化のための括弧は木の形で表せるので、ノードにならない。if-then の構文は 3 つの枝を持つ 1 つのノードで表せる。細部まで残す具象構文木(パース木)とは、この点が異なる。

AST は多くの場合コンパイラの構文解析の段階で作られる。その後の文脈解析などで、AST に情報が書き足されていく。[作って学ぶ]ブラウザのしくみ 第1章 によると、JavaScript エンジンも文字列をトークンに分け(字句解析)、AST を作ってから解釈する。

例

  • Rust のマクロは、トークン列や AST に対して動作する(Effective Rust 項目28)。
  • ESLint のルールは、禁止したいコードの AST ノードを指定して書く。typescript-eslint の Playground で AST を確かめられる。
  • Go のミューテーションテストツール Gremlins は、文字列置換ではなく AST を書き換えて変異体を作る。
  • Elixir のコードをコンパイルした beam ファイルから AST を取り出すと、Erlang のコードに変換して表示できる。
  • AST explorer では、さまざまなパーサが生成する AST を見られる。

関連

出典