在ceylon/ceylon.ast
项目中找到的以下示例显示了如何以编程方式构造一些AST,并由锡兰类型检查器(com.redhat.ceylon.compiler.typechecker.TypeChecker
)对其进行类型检查:
https://github.com/ceylon/ceylon.ast/blob/master/source/test/ceylon/ast/samples/turingMachine/powerOfTwo.ceylon
考虑到编译单元通常作为文件而不是作为类型化语法树(来自ceylon.ast
项目)提供给类型检查器,那么随后建议使用类型化语法树来调用什么方法来编译类型化句法树?
这个问题与以下问题有关:锡兰类型检查器:如何获得类型化语法树?。
生成一个AST,然后在实际项目的上下文之外编译它似乎不是一个可行的选择。编译器需要比AST单独提供的信息更多的信息,并且向编译器提供默认或虚假信息(例如文件名)仍然是一项复杂的任务。
另一方面,在实际项目的上下文中使用实际编译单元的AST作为一种宏系统是没有意义的,因为锡兰程序可能会产生副作用,转换必须考虑到这一点。此外,转换规则应该是终止的和融合的,并且应该以使维护它们尽可能容易的形式表达,而不是程序转换器。Ceylon的switch表达式不是合适的工具。最糟糕的情况是一个过程Ast转换器,它转换一个la groovy的过程Ast转换器。
一种解释是对锡兰声明性树状结构的转换。这正是我在问题中所想的:读取数据(不一定是锡兰语法),并将其提供给评估或可选的编译。