[obsidian] vault backup: 2025-08-05 00:16:00[
All checks were successful
Build / build (push) Successful in 7m25s

This commit is contained in:
2025-08-05 00:16:01 +09:00
parent 63a356bc95
commit 5f422bf2ec

View File

@@ -10,4 +10,28 @@
ながいけどこれがわかりやすい
[Ruby Parser開発日誌 (19) - 最高の構文木の設計 2024年版 - かねこにっき](https://yui-knk.hatenablog.com/entry/2024/08/23/113543)
[Ruby Parser開発日誌 (19) - 最高の構文木の設計 2024年版 - かねこにっき](https://yui-knk.hatenablog.com/entry/2024/08/23/113543)
[[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](https://github.com/rust-lang/rust-analyzer/blob/c9109f23de57359df39db6fa36b5ca4c64b671e1/docs/dev/syntax.md)
というかrowanそのままつかえばいいのかな
[GitHub - rust-analyzer/rowan](https://github.com/rust-analyzer/rowan)