Ceylon Typechecker:如何获取键入的语法树?

时间:2016-02-08 16:44:43

标签: java typechecking ceylon

我试图以编程方式使用/嵌入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。 为什么呢?

1 个答案:

答案 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()的代码。