【发布时间】:2012-01-16 10:03:44
【问题描述】:
我想知道除了正常的“在命令行上调用它来编译我的源代码”之外,还有多少种方法可以与 Scala 编译器进行交互。
有什么方法可以解析代码、构建抽象语法树或使用库在运行时编译代码吗?
【问题讨论】:
标签: scala compiler-construction programming-languages compilation abstract-syntax-tree
我想知道除了正常的“在命令行上调用它来编译我的源代码”之外,还有多少种方法可以与 Scala 编译器进行交互。
有什么方法可以解析代码、构建抽象语法树或使用库在运行时编译代码吗?
【问题讨论】:
标签: scala compiler-construction programming-languages compilation abstract-syntax-tree
前段时间我使用(现已弃用)scala.tools.nsc.Interpreter 类来加载、修改和 -- 惊喜! -- 在运行时解释 Scala 代码。如果您想在您的代码和解释代码之间交换值,请查看其bind 方法。它还有一个compileSources 和一个compileString 方法,但到目前为止我还没有使用其中一个。我也不知道如何使用这个(或其他东西)来获取 AST。
另请参阅:What is the purpose of the scala.tools.nsc package? 和 nsc package scaladoc。
更新:这应该回答 AST 问题(从 2009 年开始,可能已过时):Scala AST in Scala
【讨论】:
我过去通过创建一个新的 CompilerCommand 实例来解析命令行参数,更重要的是,通过扩展令人恐惧的 Global 类来做到这一点。
通过覆盖computeInternalPhases 方法,您可以只使用编译器的某些阶段(例如,最多refchecks,仅将其用作解析器/类型检查器),并且您可以添加自己的阶段(插件)作为你会期望的。当然也可以一路生成类文件。
所以是的,这绝对是可能的。毕竟编译器本身也是运行在JVM上的。
【讨论】:
【讨论】: