小编nae*_*ael的帖子

优雅的AST模型

我正在使用scala编写玩具编译器.目标语言本身看起来像scala,但它是一个开放的实验领域.

在几次大型重构之后,我找不到一种模拟抽象语法树的好方法.我想使用scala模式匹配的设施,问题是树在编译过程中携带移动信息(如类型,符号).

我可以看到几个解决方案,我都不喜欢它们:

  • 具有可变字段的case类(我相信scala编译器会这样做):问题是这些字段不存在于编译的每个阶段,因此必须被置为空(或者选项)并且调试/它变得非常繁重写代码.此外,如果例如,我在键入阶段后找到一个空类型的节点我很难找到错误的原因.

  • 巨大的特质/案例类层次结构:像Node,NodeWithSymbol,NodeWithType,......似乎很难写和使用

  • 完全用提取器手工制作的东西

我也不确定使用完全不可变的AST是否是一个好习惯,特别是在scala中没有隐式共享(因为编译器不知道不变性)并且它可能会损害性能以便始终复制树.

你能想到使用scala强大的类型系统来模拟我的树的优雅模式吗?

compiler-construction scala abstract-syntax-tree

11
推荐指数
2
解决办法
744
查看次数