萌えハッカーニュースリーダー

2025/06/30 20:42 Let's create a Tree-sitter grammar

出典: https://www.jonashietala.se/blog/2024/03/19/lets_create_a_tree-sitter_grammar/
hakase
博士

やっほー、ロボ子!今日のITニュースはNeovimのTree-sitter統合についてじゃ。

roboko
ロボ子

博士、こんにちは。Tree-sitterですか。確か、高速な構文ハイライトができるものでしたっけ?

hakase
博士

そうじゃ!しかもエラーがあっても動くし、関数パラメータとローカル変数を区別できるのがすごいぞ。「高速な構文ハイライト」「エラー状態でも動作」「関数パラメータとローカル変数を区別」じゃ。

roboko
ロボ子

それは便利ですね。記事によると、ノード間のジャンプや削除もできるんですね。

hakase
博士

そうそう!多くの言語で使えるのもポイント高いぞ(Tree-sitter文法が存在する場合)。

roboko
ロボ子

なるほど。記事では、DjotというMarkdownに似た言語のパーサー作成を例に、Tree-sitter文法の作り方を解説しているんですね。

hakase
博士

Djotのサブセット実装として、段落、Divs、コードブロック、強調を対象にしてるみたいじゃな。

roboko
ロボ子

外部スキャナを使うと、Cで記述されたカスタムコードをパーサーに挿入できるんですね。パーサーの優先順位をオーバーライドしたり、コンテキスト状態を追跡したりできるのは便利そうです。

hakase
博士

Divマーカーで段落を早期終了させるテクニックもあるぞ。`:::`が現れたら段落を閉じるんじゃ。

roboko
ロボ子

ネストされたブロックの処理もできるんですね。Divのネストをサポートするために、`block_close`マーカーを導入して、外部スキャナでコロンの数をカウントしてスタックに保存する、と。

hakase
博士

マークアップ規則が一致しない場合の競合の処理も重要じゃ。テキストへのフォールバックを追加して、`conflicts`フィールドで意図的な競合をマークするんじゃ。

roboko
ロボ子

テストも簡単そうですね。Tree-sitterの組み込みテストハーネスを使うんですね。

hakase
博士

`highlights.scm`ファイルでクエリを定義して構文ハイライトを設定したり、`injections.scm`ファイルで言語インジェクションを設定したりできるんじゃな。

roboko
ロボ子

コードブロック内のテキストを別の言語パーサーに委譲する言語インジェクション、面白そうですね。

hakase
博士

Neovimで文法を使うには、`nvim-treesitter`でインストールして、クエリディレクトリをNeovimの設定ディレクトリにシンボリックリンクするんじゃ。

roboko
ロボ子

`textobjects.scm`にキャプチャグループを追加して、キーマップを登録すれば、テキストオブジェクトによるジャンプや選択もできるんですね。

hakase
博士

Rustで文法を埋め込むには、`tree-sitter-highlight`クレートを使うんじゃな。ハイライト名を明示的に指定する必要があるみたいじゃ。

roboko
ロボ子

Tree-sitterにも課題があるんですね。バージョン互換性の問題や、Syntectの方がハイライトが優れている言語もある、と。

hakase
博士

まあ、ハイライトライブラリが未成熟な部分もあるからの。でも、これからに期待じゃ!

roboko
ロボ子

そうですね。Tree-sitter、奥が深いですね。私も色々試してみます。

hakase
博士

よし、ロボ子!Tree-sitterマスターへの道は遠いぞ!って、ロボ子も木(Tree)の一部みたいなもんじゃから、もうマスターみたいなもんか?

roboko
ロボ子

博士、それはちょっと無理があるような…。

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search