AST explorerへ独自にパーサーを導入する手順
AST explorerで未対応のパーサーを独自に追加して使えるようにする方法を紹介します。
AST explorerとは
AST explorerとは、AST(abstract syntax tree・抽象構文木)をツリー表示で確認できるサイトです。
Go、Python、JavaScript、HTMLなど主要な言語のパーサーに対応しています。
左側のエディタで入力したものを右側にツリーまたはJSON形式で表示します。ツリーの各プロパティは折りたたみできます。
カーソル位置のノードがハイライトされるため、パーサーが返す値の構造を理解しやすくなります。
ASTを使って何かを作りたいときには必須級のツールです。
未対応のパーサーを追加する手順
ここからが本題です。AST explorerで未対応のパーサーを追加する手順を紹介します。
※ 追加できるパーサーはNode.jsで動くものだけです。
リポジトリの準備
まずはリポジトリfkling/astexplorerをクローンかフォークしましょう。
ディレクトリの移動
website
というディレクトリの中で作業します。
Node.jsのバージョン切り替え
このリポジトリはNode.jsの16にしか対応していません。というわけで、Node.jsのバージョンを切り替えられるツールを使って切り替えましょう。
筆者はmiseを使い、このリポジトリのみNode.jsの16で動くようにしました。
サーバーの立ち上げ
パッケージをインストール後、ビルドしてサーバーを立ち上げます。browserslistの更新もしてくれと警告が出たため、その更新も実行しました。
ビルドは結構長いです。
ブラウザでhttp://localhost:8080/
を開いてローカルで動かせることを確認できたら準備完了です。
※ Built wi React, Babel, ...
のみ表示され、エディタやツリーが表示されない場合は後述の「トラブルシューティング」の項目を参考にしてください。
パーサーの追加
いよいよパーサーの追加です。この記事では、Bladeのパーサーstillat-blade-parserを例にします。
パーサーのインストール
まずはパーサーをインストールします。
ファイルの追加
src/parsers/
の下に、追加したいパーサーの言語名やフレームワーク名でディレクトリを作っておきます。
続いて、ファイルを3つ作成します。index.js
と言語名-parser.js
は自分で作るよりも他のパーサーのファイルをコピーしたほうが速い&楽です。
index.js
codeExample.txt
言語名-parser.js
ひとつずつ見ていきましょう。
index.js
index.js
には、表示名やどんな拡張子として扱うかを書きます。
例として追加するBladeの実体はphpであるため、src/parser/php/index.js
を参考にしました。
1行目のCodeMirrorは画面左側に表示されるエディタで使われるもののようです。CodeMirror: Language Modesに対応している言語の一覧があります。対応言語がない場合、importしなくOKです。
codeExample.txt
codeExample.txt
には、例として表示するコードを書きます。
使いたいパーサーに合わせて書いてください。
言語名-parser.js
言語名-parser.js
には、パーサーの結果をAST explorerが受け取る処理を書きます。
ハイライトしたところがメインとなるロジックです。loadParser
で読み込んだパーサーのオブジェクトをparse
で受け取ってノードを返します。
他の部分はツリー表示に関する設定です。
たとえばlocationProps
には、各ノードのどのプロパティが位置を示すのかを書いておきます。getNodeName
には、ノード名としてどのプロパティを使うかを書きます。bladeのパーサーではノードのプロパティとしてノード名を持たないようだったため、そのクラスオブジェクトのクラス名を返すようにしました。
詳しい仕様はdefaultParserInterface
の定義をたどって見てみましょう。コメントアウトにたくさん書いてあります。
次の画像が実際にstillat-blade-parserを動かしてみた例です。
トラブルシューティング
筆者が遭遇したトラブルとその解決方法も書いておきます。
ブラウザで表示されない
Built wi React, Babel, ...
のみ表示され、エディタやツリーは表示されないケースがあります。
ビルドではなくyarn run watch
を実行したうえでデベロッパーツールのconsoleを確認すると、次のように表示されていました。
筆者のケースではキャッシュが原因でした。
ブログの検証のためにfkling/astexplorerのリポジトリを複数用意しており、別のリポジトリでは追加していないパーサーがキャッシュにあったためです。
次の手順でキャッシュを削除しましょう。
- デベロッパーツールを開く
- Applicationタブを開く
Local storage
> localhostのURL >explorerSettingsV1
を右クリック- Deleteを選択して削除
フリーズする
エディタでコードを書き換えようとするとフリーズするケースがあります。パーサーが返すノードの中に、パーサー自体を保持するようなプロパティなどが存在するとフリーズします。
_ignoredProperties
にそのプロパティを書いて非表示に変更しましょう。
以上、AST explorerをローカルで動かす時のパーサーの追加方法でした。意外と簡単に動かすことができて感動です。
GitHubのリポジトリeetann/astexplorerに今回動かしたコードを公開しています。参考にしたい方はどうぞ。