[WEB Tool] AST Inspector v1.0 — ソースコードの構文木をブラウザで覗くツール使い方ガイド
概要
AST Inspector は、ソースコードの構文木をブラウザだけで覗けるツールです。コードを書くと、その場でパースして、どんな木の形になっているかを表示します。ツリーの行とソースの範囲は連動していて、ツリーの行にマウスを乗せるとソースの該当部分が光ります。
S 式で書く検索言語「Query」で構文木を検索したり、エディタの裏で動いている「インクリメンタルパース」で、どのノードが使い回されてどこが作り直されたかを色分けして見たりもできます。
パースは、Neovim や Zed、GitHub のコード表示などでも使われている Tree-sitter(WASM 版)が担当しています。インストール不要で、コードはサーバーに送信されません。
AST Inspector
AST Inspector // PROTOCOL.LAIN
ソースコードの構文木を覗く。構文エラーの見え方、Query による検索、インクリメンタルパースで使い回されたノードの色分けまで。ブラウザ完結。
lain-lab.comスタートメニューから起動
トップページのスタートメニューからも起動できます。
Tree-sitter
GitHub - tree-sitter/tree-sitter: An incremental parsing system for programming tools
An incremental parsing system for programming tools.
github.comスクリーンショット
AST Inspector — 構文木とソースの連動
AST Inspector — 構文エラー(ERROR / MISSING)
AST Inspector — Query プレイグラウンド
AST Inspector — インクリメンタルパース(再利用 / 新規の色分け)
操作動画
ツールの特徴
- ブラウザ完結: インストール不要。コードはブラウザの中だけでパースし、サーバーには送信しません。
- 書いたそばからパース: エディタに入力すると、その場で構文木が更新されます。書きかけで構文エラーがあっても止まりません。
- ツリーとソースの連動: ツリーの行にマウスを乗せるとソースの該当範囲が光り、ソースのカーソル位置からはツリーの該当ノードへ飛びます。
- 構文エラーの可視化: 文法に合わない部分(ERROR)と、パーサーが補ったトークン(MISSING)を色分けして表示します。
- Query プレイグラウンド: S 式で書く検索言語で構文木を検索し、マッチした箇所をエディタとツリーの両方で示します。
- シンタックスハイライト: 各言語の文法に同梱されている
highlights.scm(Query で書かれた色付けのルール)をそのまま使って色を付けます。 - インクリメンタルパースの可視化: コードを編集するたびに、前回の木から使い回されたノードと、新しく作り直されたノードを色分けします。
対応言語
| 言語 | 拡張子 | 文法 |
|---|---|---|
| JavaScript | .js .mjs .cjs .jsx | tree-sitter-javascript 0.25.0 |
| Python | .py .pyw | tree-sitter-python 0.25.0 |
| C | .c .h | tree-sitter-c 0.24.1 |
言語の文法は、選んだときに読み込みます。
使い方
1. コードを入力する
開くと、JavaScript のサンプルコードが入っています。エディタにそのまま書き込んでください。入力が止まってから約 0.1 秒で、構文木が更新されます。Tab キーでスペース 4 つを入力します。
手元のファイルを読み込むときは、画面上部の「ファイルを開く」を押してファイルを選びます。拡張子から言語を自動で切り替えます。
言語を切り替えたとき、エディタの中身がサンプルのまま(または空)なら、その言語のサンプルに差し替わります。自分で書き換えたコードはそのまま残ります。
2. 画面の構成
| 場所 | 内容 |
|---|---|
| 上部のバー | 言語の選択、表示の切り替え、ファイルを開く、統計 |
| 左 | コードエディタ |
| 右 | 3 つのタブ(Tree / S式 / Query) |
3. 上部のバー
| 項目 | 内容 |
|---|---|
| 言語 | JavaScript / Python / C |
| named のみ | オンにすると、( や return のような記号・キーワードのノードを隠します。オフにすると全ノードを表示します |
| 色付け | シンタックスハイライトのオン / オフ |
| インクリメンタル | インクリメンタルパースの可視化のオン / オフ(後述) |
| ファイルを開く | 手元のソースファイルを読み込みます |
| nodes | 構文木のノードの総数 |
| errors | ERROR / MISSING ノードの数。1 つ以上あると赤くなります |
| parse | パースにかかった時間(ミリ秒) |
| 右端 | 言語名と、文法の ABI バージョン |
4. Tree タブ
構文木を、字下げした一覧で表示します。1 行が 1 つのノードです。
▾ binary_expression [2:6–2:11]
left: identifier [2:6–2:7] n
right: number [2:10–2:11] 2
| 表示 | 意味 |
|---|---|
| 緑の文字 | ノードの種類(identifier、binary_expression など) |
| 灰色の引用符付き文字 | 記号やキーワードのノード("("、"return" など)。「named のみ」をオフにすると表示されます |
紫の name: left: など | フィールド名。そのノードが親から見て何の役割かを表します |
[2:6–2:11] | ソース上の位置。「開始行:開始列 – 終了行:終了列」で、行も列も 0 から数えます |
| 行末の文字 | 子を持たないノードの、ソース上の文字列 |
| 赤い太字 | ERROR と MISSING のノード |
操作は次のとおりです。
| 操作 | 動作 |
|---|---|
| 行にマウスを乗せる | エディタの該当範囲が光ります |
| 行をクリック | その範囲を光らせたまま固定し、エディタをその位置までスクロールします |
| ▾ / ▸ をクリック | 子ノードを折りたたむ / 開く |
| エディタでクリック、または矢印キーでカーソル移動 | カーソル位置の一番深いノードの行に飛びます |
表示するノードは最大 20,000 個までです。それを超えるファイルでは、先頭から 20,000 個を表示し、上にその旨を表示します。
5. エディタのハイライト
エディタには、次のハイライトが重なって表示されます。
| 表示 | 意味 |
|---|---|
| 文字の色 | シンタックスハイライト(「色付け」でオン / オフ) |
| 緑の背景 | ツリーでマウスを乗せている、または選択中のノードの範囲 |
| 赤い波線 | ERROR ノードの範囲 |
| 赤い縦線 | MISSING ノードの位置(幅がないので線で表示) |
| 黄色い下線 | Query にマッチした範囲 |
| 青い背景 | 直前の編集で入力した範囲(インクリメンタル表示中) |
| オレンジの破線(上側) | 構文の構造が変わった範囲(インクリメンタル表示中) |
6. 構文エラーの見方
書きかけのコードでも、パースは止まりません。文法に合わない部分は、次の 2 種類のノードとして木に残ります。
| ノード | 意味 | 例 |
|---|---|---|
ERROR | 文法に合わない部分をまとめたもの | lat def = 456; の def |
MISSING | 本来あるはずのトークンを、パーサーが補ったもの | function f(a { のときの MISSING ) |
閉じ括弧を忘れた場合、MISSING } がファイルの最後に出ることがあります。どこで閉じ忘れたかまでは推測せず、「最後まで閉じていない」と判断するためです。
7. S式タブ
構文木を S 式(括弧でくくった形)で表示します。Tree-sitter の toString() の出力に字下げを付けたものです。右上の「コピー」でクリップボードにコピーできます。
(binary_expression
left: (identifier)
right: (number))
8. Query タブ
Query は、構文木を検索するための言語です。S 式でノードの形を書き、取り出したいノードに @名前 を付けます。入力が止まってから約 0.3 秒で実行されます。
; 呼び出される関数名
(call_expression
function: (identifier) @call)
よく使う書き方は次のとおりです。詳しくは、右上の「Query 構文」から公式ドキュメントを参照してください。
| 書き方 | 意味 |
|---|---|
(identifier) | そのノードの種類にマッチ |
(_) | 任意の名前付きノード |
name: (identifier) | フィールドを指定 |
[ (a) (b) ] | どれか 1 つ |
@名前 | 取り出すノードに付ける名前(キャプチャ) |
(#eq? @id "fib") | キャプチャの文字列が一致するものだけ |
(#match? @hex "^0[xX]") | キャプチャの文字列が正規表現に合うものだけ |
; ... | コメント |
「プリセット…」から例を選べます。
| 言語 | プリセット |
|---|---|
| JavaScript | 関数呼び出し / 関数定義 / 二項演算 / 述語 #eq? |
| Python | 関数定義 / メソッド呼び出し / リスト内包表記 / 述語 #eq? |
| C | 関数定義 / 構造体フィールドアクセス / 述語 #match?(16 進リテラル) / 型名 |
| 共通 | ERROR / MISSING ノード / highlights.scm(同梱) |
「highlights.scm(同梱)」を選ぶと、シンタックスハイライトに使っている Query そのものが入ります。色付けの仕組みを確かめたいときに使ってください。
実行結果は、次のように表示されます。
| 場所 | 表示 |
|---|---|
| 入力欄の下 | マッチ数 / キャプチャ数 / 実行時間。書き間違いがあると 2行3列: Bad field name 'functin' のように位置付きで表示 |
| 結果リスト | マッチごとに、キャプチャ名・ノードの種類・位置・文字列。行にマウスを乗せるとエディタの該当範囲が光り、クリックでそこへ飛びます |
| エディタ | マッチした範囲に黄色い下線 |
| Tree タブ | マッチしたノードの行頭に黄色い線と @名前 のバッジ |
結果リストに表示するのは先頭 300 件までです(ハイライトは全件)。「クリア」で Query を消すと、黄色い表示も消えます。
コードを編集すると、そのたびに Query も実行し直します。
9. インクリメンタルパース
Tree-sitter は、1 文字打つたびにファイル全体を読み直しているわけではありません。前回の構文木を取っておいて、変わった場所の周りだけを作り直し、残りは使い回しています。これをインクリメンタルパースといいます。
「インクリメンタル」がオンのとき(初期状態)、コードを編集すると、Tree タブの上に次のような情報が出ます。
再利用 103 / 120 (86%) ・ 構造変化 1 範囲 ・ 全体パースなら 0.13 ms
| 項目 | 意味 |
|---|---|
| 再利用 | 新しい構文木のノードのうち、前回の木から使い回されたノードの数と割合 |
| 構造変化 | 構文の構造が変わった範囲の数。数字の中身を変えただけのように、構造が同じままの編集では 0 になります |
| 全体パースなら | 同じコードをファイル全体からパースし直した場合の時間(比較用) |
色分けは次のとおりです。
| 表示 | 意味 |
|---|---|
| Tree タブのオレンジの行 | 今回の編集で作り直されたノード |
| Tree タブの通常の行 | 前回の木から使い回されたノード |
| エディタの青い背景 | 今回の編集で入力した範囲 |
| エディタのオレンジの破線 | 構文の構造が変わった範囲 |
試してみると分かりやすい操作の例です。
- 関数とは関係ない場所に 1 行足す → 関数の部分は通常色のまま(使い回し)で、足した行だけがオレンジになる
letをlatと打ち間違える → エラーから回復するために前後も読み直すので、オレンジの範囲が大きく広がり、再利用の割合が下がる- 打ち間違いを直す → 再利用の割合が戻り、オレンジが引く
Query の黄色い表示と重なると見づらいときは、Query タブの「クリア」を押してください。
「インクリメンタル」をオフにすると、毎回ファイル全体をパースし直します。言語を切り替えたときや、ファイルを開いたときも、全体をパースし直します。
注意事項
- コードはブラウザの中だけでパースします。サーバーへの送信や保存は一切しません。
- ページを閉じたり再読み込みしたりすると、エディタの内容は失われます。
- 表示するノードは最大 20,000 個、Query の結果リストは先頭 300 件までです。
- Tree-sitter はエディタ向けのパーサーです。コンパイラや実行環境が出すエラー(未定義の変数、型の不一致、Python のインデントエラーの一部など)は検出しません。
よくある質問 (FAQ)
Q. Python でインデントを崩しても、errors が 0 のままです
A. Tree-sitter の Python 文法では、中身が空のブロックも文法上は正しいとして扱います。たとえばforの中身の行を左端に戻すと、「forの中身は空で、その行は次の文」とパースされます。ツリーを見ると、body: blockが幅ゼロ(開始と終了の位置が同じ)になっています。IndentationErrorは、Python 本体のパーサーが出すエラーです。
Q. 1 行足しただけなのに、離れた場所のノードまでオレンジになります
A. Tree-sitter の実際の動作です。ルートのノード(programやmodule)は子が増えると作り直されますし、トップレベルの並びが組み直されるときに、周りのノードの外側が作り直されることがあります。その内側の部分木は、たいてい使い回されています。
Q. 数字を書き換えたのに「構造変化 0 範囲」です
A. 構造変化は、構文の形が変わった範囲だけを数えます。2を20に変えてもnumberはnumberのままなので、構造は変わっていません。文を足したり消したりすると、範囲として数えられます。
Q. 「named のみ」をオフにすると、何が増えるのですか
A.(、;、return、+のような、記号やキーワードのノードが増えます。Tree-sitter が実際に作っているのは、これらを全部含んだ木(具象構文木)です。オンにすると、意味のあるノードだけの、いわゆる抽象構文木(AST)に近い見た目になります。
Q. 対応言語を増やす予定はありますか
A. Tree-sitter には多くの言語の文法があるので、今後追加していく予定です。
技術記事
実装の詳細は、技術記事にまとめています。
[Astro] #158 AST Inspector — Tree-sitter WASMで構文木を覗く(Queryとインクリメンタルパースの可視化付き)
web-tree-sitter 0.27と公式文法パッケージ、インデックスがUTF-16単位で返る件、ERRORとMISSING、Queryとhighlights.scmの優先順位、tree.edit()とgetChangedRanges()、ノードIDで再利用を判定する方法まで。
lain-lab.com更新履歴
| バージョン | 日付 | 内容 |
|---|---|---|
| v1.0.0 | 2026/9/30 | 初回公開 |
クレジット
本ツールは以下のソフトウェアを利用して構築されています。
- Tree-sitter / web-tree-sitter — MIT License(Max Brunsfeld、Amaan Qureshi ほか Tree-sitter 開発者)
- tree-sitter-javascript / tree-sitter-python / tree-sitter-c — MIT License(文法と
highlights.scm) - UI / エディタのハイライト / インクリメンタルパースの可視化 — 自作
Tree-sitter|Introduction
Tree-sitter is a parser generator tool and an incremental parsing library. It can build a concrete syntax tree for a source file and efficiently update the syntax tree as the source file is edited.
tree-sitter.github.ioGitHub - tree-sitter/tree-sitter: An incremental parsing system for programming tools
An incremental parsing system for programming tools.
github.com