我正在使用scala编写玩具编译器.目标语言本身看起来像scala,但它是一个开放的实验领域.
在几次大型重构之后,我找不到一种模拟抽象语法树的好方法.我想使用scala模式匹配的设施,问题是树在编译过程中携带移动信息(如类型,符号).
我可以看到几个解决方案,我都不喜欢它们:
具有可变字段的case类(我相信scala编译器会这样做):问题是这些字段不存在于编译的每个阶段,因此必须被置为空(或者选项)并且调试/它变得非常繁重写代码.此外,如果例如,我在键入阶段后找到一个空类型的节点我很难找到错误的原因.
巨大的特质/案例类层次结构:像Node,NodeWithSymbol,NodeWithType,......似乎很难写和使用
完全用提取器手工制作的东西
我也不确定使用完全不可变的AST是否是一个好习惯,特别是在scala中没有隐式共享(因为编译器不知道不变性)并且它可能会损害性能以便始终复制树.
你能想到使用scala强大的类型系统来模拟我的树的优雅模式吗?