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