抽象構文木

抽象構文木

執筆済 コンピュータ言語

プログラムの構造を表す木。 AST。 構文解析の出力であり、 以降の処理の共通の土台になる。

具象構文木との違い#

具象構文木(解析木)は文法規則をそのまま反映するので、 括弧や区切り記号のノードまで含む。

AST は意味に必要な情報だけを残す。

(1 + 2) * 3
  ↓ AST
    *
   /   +    3
 / 1   2

括弧は木の形として表現されるので、ノードとしては消える。

なぜ木なのか#

プログラムの構造が再帰的だから。

  • 式の中に式がある
  • 文の中にブロックがあり、ブロックの中に文がある

再帰的なデータには再帰的な処理が自然に書ける。 AST を辿る処理は Visitor パターンや パターンマッチで簡潔に書ける。

何に使うか#

用途
意味解析 型検査、変数の解決
最適化 定数畳み込み、不要コード削除
コード生成 木を辿って命令を出す
フォーマッタ AST から整形して出力(Prettier)
リンタ 特定のパターンを検出(ESLint)
トランスパイラ 別の言語の AST に変換(Babel、TypeScript)

ソースコードを機械的に扱う道具は、ほぼすべて AST を経由する。 文字列の正規表現でコードを書き換えるのが脆いのは、 構造を無視しているため。

中間表現へ#

最適化を本格的に行う段階では、 AST よりさらに単純化した中間表現に落とす (LLVM IR、SSA 形式など)。 木より制御フローグラフの方が解析しやすいため。

参考文献#

  • Alfred V. Aho, Monica S. Lam, Ravi Sethi, Jeffrey D. Ullman. Compilers: Principles, Techniques, and Tools, 2nd ed. Pearson, 2006.
  • Robert Nystrom. Crafting Interpreters. Genever Benning, 2021.(全文公開) https://craftinginterpreters.com/
  • Daniel P. Friedman, Mitchell Wand. Essentials of Programming Languages, 3rd ed. MIT Press, 2008.
ノート一覧を閉じる