The Ceylon Typechecker:如何获取类型化的语法树?
The Ceylon Typechecker: How to obtain the typed syntax tree?
我正在尝试以编程方式使用/嵌入 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 编译器(锡兰规范 AST,还包含从代码字符串编译 ceylon.ast.core AST 的函数(使用 RedHat 编译器)
... ¨.
所以有 3 个 AST:1. antlr 生成的,2. ceylon.ast.core,和 3. ceylon.ast.redhat。
为什么?
简而言之,您需要:
- 配置一个
TypeCheckerBuilder
你想要类型检查的源文件,
- 从建造者那里获得一个
TypeChecker
(builder.typechecker
),
- 调用类型检查器 (
typeChecker.process()
),
- 处理来自
typeChecker.phasedUnits
的可用结果。具体来说,typeChecker.getPhasedUnits().getPhasedUnits()
会给你一个List<PhasedUnit>
,对于每个PhasedUnit
,你可以调用getCompilationUnit()
得到它的Tree.CompilationUnit
,也就是AST的根. AST 节点还包括模型对象的吸气剂。
有关详细示例,您可以查看 Dart 后端的代码,在 compileDart()
函数中从 the call to process()
向前和向后工作。
有关调用 compileDart()
.
的示例代码,请参阅 testCompile
我正在尝试以编程方式使用/嵌入 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 编译器(锡兰规范 AST,还包含从代码字符串编译 ceylon.ast.core AST 的函数(使用 RedHat 编译器) ... ¨.
所以有 3 个 AST:1. antlr 生成的,2. ceylon.ast.core,和 3. ceylon.ast.redhat。 为什么?
简而言之,您需要:
- 配置一个
TypeCheckerBuilder
你想要类型检查的源文件, - 从建造者那里获得一个
TypeChecker
(builder.typechecker
), - 调用类型检查器 (
typeChecker.process()
), - 处理来自
typeChecker.phasedUnits
的可用结果。具体来说,typeChecker.getPhasedUnits().getPhasedUnits()
会给你一个List<PhasedUnit>
,对于每个PhasedUnit
,你可以调用getCompilationUnit()
得到它的Tree.CompilationUnit
,也就是AST的根. AST 节点还包括模型对象的吸气剂。
有关详细示例,您可以查看 Dart 后端的代码,在 compileDart()
函数中从 the call to process()
向前和向后工作。
有关调用 compileDart()
.