Files
quartz-research-note/content/Red Green Syntax Tree.md
Matsuura Tomoya(Windows) 5f422bf2ec
All checks were successful
Build / build (push) Successful in 7m25s
[obsidian] vault backup: 2025-08-05 00:16:00[
2025-08-05 00:16:01 +09:00

2.4 KiB
Raw Blame History

#compiler-design

Red-Green Trees: an Overview. Six months ago I dug into Roslyns… | by Bayastan | Jun, 2025 | Medium

抽象構文木というか具象構文木の実装方法の一つ。

構文の途中で差し込まれたコメントなどのトリビアなどを保持して、完全なソースコードに戻せるけど実行効率などをよくしたままにできるやり方。

部分的に構文木を書き換えたりするとソースコードのロケーション情報がずれたりするので、文字幅とオフセットを別々に持たせるというやり方をしている

ながいけどこれがわかりやすい

Ruby Parser開発日誌 (19) - 最高の構文木の設計 2024年版 - かねこにっき

C#のRoslynで提案されたもので、rust-analyzerとかでも使われている

  • Green Treeが構文的に意味のある単位でのツリーで、Childrenを持ち、Spanの絶対位置ではなく幅を持つ
  • Red Treeは必要に応じて構築される木で、Green Nodeへの参照と親への参照、ドキュメントトップからのSpanの先頭位置を持つ

これで、SpanはRed-GreenTreeの組み合わせでアドホックに生成できるから、部分的な木の差し替えとかにも対応しやすくてうれしい

これってRustでもうちょっとシンプルに作れんのか

Rustで普通にSyntax Tree作ってると、Recursiveなenumを経由して作るのが普通なわけだが、適当なid-arena的仕組みで管理している限りは、普通のSyntax TreeがGreen Tree

愚直に参考にされているやつを使うと、Tagged Unionをゼロから再実装するみたいなことになるので、Rustのenum as Tagged Unionの構造を有効活用したくね

Rust Analyzerだと文字列だけじゃなくSyntax TreeまでInterningされてるらしいRust規模のコードベースなら確かに有効かも

rust-analyzer/docs/dev/syntax.md at c9109f23de57359df39db6fa36b5ca4c64b671e1 · rust-lang/rust-analyzer · GitHub

というかrowanそのままつかえばいいのかな

GitHub - rust-analyzer/rowan