我试图以编程方式使用/嵌入Ceylon Typechecker来分析Ceylon源代码。在这个用例中,我想访问编译器通常会使用的所有信息。但我不打算编译,我不会添加对编译器的依赖。
在我看来,ceylon / typechecker / src / main / Main.java中的main.Main入口点不是此用例的适当入口点(获取类型树和附加模型),因为这些信息三个检查通行证中的访客收集的信息被丢弃,只打印错误。
所以,我的问题是:
如何解析和检查编译单元然后获取 1.键入的语法树,和 2.分析访问者在树中遇到的类型的关联模型对象,它们从树中链接。
编辑:
我身边有一些关于3种不同AST的混淆。
在ceylon /ceylon.ast的README中,有人说:
¨... ceylon.ast.core - 代表锡兰AST的锡兰类。纯锡兰(后端独立)。 ... ceylon.ast.redhat - 将ceylon.ast.core AST从+转换为RedHat编译器(ceylon-spec AST,还包含从代码字符串中编译ceylon.ast.core AST的函数(使用RedHat编译器) ......¨。
因此有3个AST:1。由antlr,2.ceylon.ast.core和3. ceylon.ast.redhat生成的AST。 为什么呢?
答案 0 :(得分:5)
简而言之,您想:
TypeCheckerBuilder
TypeChecker
)获取builder.typechecker
,typeChecker.process()
),typeChecker.phasedUnits
提供的结果。具体来说,typeChecker.getPhasedUnits().getPhasedUnits()
将为您提供List<PhasedUnit>
,并且对于每个PhasedUnit
,您可以调用getCompilationUnit()
来获取其Tree.CompilationUnit
,这是AST的根。 AST节点还包括模型对象的getter。有关详细示例,您可以查看Dart后端的代码,从compileDart()
函数中的the call to process()
开始向前和向后工作。
请参阅testCompile,了解调用compileDart()
的代码。