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

Mic*_*ael 4 java typechecking ceylon

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

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

所以,我的问题是:

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

编辑:

我身边有三种不同的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.为什么?

Joh*_*eff 5

简而言之,您需要:

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

对于一个具体的例子,你可以查看达特后端代码,从向前和向后工作调用process()compileDart()函数.

有关调用的示例代码,请参阅testCompilecompileDart().

  • 好的,我在最后一颗子弹中添加了细节.您当然可以自由地处理`Tree.CompilationUnit,但是你喜欢:switch,visitor或者其他东西.您也可以将基于Java的AST转换为基于Ceylon的[`ceylon.ast`](https://herd.ceylon-lang.org/modules/ceylon.ast.core),就像我为Dart后端所做的那样. (2认同)