4

我试图以编程方式使用/嵌入 Ceylon Typechecker 来分析 Ceylon 源代码。在这个用例中,我想访问编译器通常会使用的所有信息。但我不会编译,也不会添加对编译器的依赖。

在我看来, ceylon/typechecker/src/main/Main.java 中的 main.Main 入口点不是这个用例的合适入口点(获取类型树和附加模型),因为这个信息是访问者在三个检查通行证中收集的信息将被丢弃,仅打印错误。

所以,我的问题是:

如何对编译单元进行解析和类型检查,然后获取 1. 类型化语法树,以及 2. 分析访问者在树中遇到的类型的关联模型对象,这些对象从树中链接到。

编辑:

我对 3 种不同的 AST 存在(并且现在)有些困惑。

在 ceylon /ceylon.ast 的自述文件中说:

¨ ... ceylon.ast.core – 代表 Ceylon AST 的 Ceylon 类。纯锡兰(后端独立)。... 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。为什么?

4

1 回答 1

5

简而言之,您需要:

  • 使用您要进行类型检查的源文件配置 a TypeCheckerBuilder
  • TypeChecker从 builder ( builder.typechecker) 中获取 a ,
  • 调用类型检查器 ( typeChecker.process()),
  • 处理从 中获得的结果typeChecker.phasedUnits。具体来说,typeChecker.getPhasedUnits().getPhasedUnits()会给您一个List<PhasedUnit>,并且对于每个PhasedUnit,您都可以调用getCompilationUnit()以获取它的Tree.CompilationUnit,这是 AST 的根。AST 节点还包括模型对象的 getter。

有关详细示例,您可以查看 Dart 后端的代码,从函数中的调用process()compileDart()向前和向后工作。

有关调用compileDart(). _

于 2016-02-08T20:59:47.283 回答