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