为什么Roslyn每种语言都有两种语法版本?

时间:2016-10-26 15:14:06

标签: c# vb.net parsing roslyn

我一直在查看Roslyn代码库,并注意到它们有两个版本的语法(一个内部版本和一个公共版本)。通常这些似乎被称为“红色”节点和“绿色”节点。我想知道是否有人可以解释这两种语法版本的原因是什么。

1 个答案:

答案 0 :(得分:9)

来自Persistence, Facades and Roslyn’s Red-Green Trees

  

“绿色”树是不可变的,持久的,没有父引用,是“自下而上”构建的,并且每个节点都跟踪其宽度而不是其绝对位置。当编辑发生时,我们只重建受编辑影响的绿树部分,通常是树中总解析节点的O(log n)。

     

“红色”树是围绕绿树建造的不可变立面;它根据需要“自上而下”构建,并在每次编辑时丢弃。它通过在从顶部向下穿过树时按需制造它们来计算父引用。它通过从宽度计算它们来制造绝对位置,再次,当你下降时。

     

你是Roslyn API的消费者,只看到红树;绿树是一个实现细节。 (如果你使用调试器来查看解析节点的内部状态,你实际上会看到有另一个类型的另一个解析节点的引用;那就是绿树节点。)

     

顺便提一下,这些被称为“红/绿树”,因为它们是我们在设计会议中用于绘制数据结构的白板标记颜色。颜色没有其他意义。