【问题标题】:The Ceylon Typechecker: How to obtain the typed syntax tree?Ceylon Typechecker:如何获取类型化的语法树?
【发布时间】:2016-02-11 07:08:33
【问题描述】:

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

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

所以,我的问题是:

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

编辑:

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

在 ceylon /ceylon.ast 的 README 中说:

¨ ... 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。 为什么?

【问题讨论】:

    标签: java typechecking ceylon


    【解决方案1】:

    简而言之,您需要:

    • 使用您要进行类型检查的源文件配置 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() 的示例代码。

    【讨论】:

    • 好的,我在最后一个项目符号中添加了细节。您当然可以随意处理Tree.CompilationUnits,但您喜欢:切换、访问者或其他。您还可以将基于 Java 的 AST 转换为基于 Ceylon 的 ceylon.ast,就像我为 Dart 后端所做的那样。
    猜你喜欢
    • 2018-01-16
    • 1970-01-01
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多