From 5f422bf2eccd4c62aaf5deb19f810bfd3803a811 Mon Sep 17 00:00:00 2001 From: "Matsuura Tomoya(Windows)" Date: Tue, 5 Aug 2025 00:16:01 +0900 Subject: [PATCH] [obsidian] vault backup: 2025-08-05 00:16:00[ --- content/Red Green Syntax Tree.md | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/content/Red Green Syntax Tree.md b/content/Red Green Syntax Tree.md index 99798066..10cd5587 100644 --- a/content/Red Green Syntax Tree.md +++ b/content/Red Green Syntax Tree.md @@ -10,4 +10,28 @@ ながいけどこれがわかりやすい -[Ruby Parser開発日誌 (19) - 最高の構文木の設計 2024年版 - かねこにっき](https://yui-knk.hatenablog.com/entry/2024/08/23/113543) \ No newline at end of file +[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) \ No newline at end of file