我的目标是将Scala3代码作为字符串,并在运行时将其解析为Scala3的抽象语法树。在这个过程中,如果代码有编译错误,我应该将其作为某些异常的一部分。更大的目标是在scala代码有效的情况下以ExprT结束,并通过拼接正确的位来执行它(我已经介绍了这一部分)。
这在Scala2中是可行的。*使用scala-reflect here。
val source =
"""
|object HelloWorld {
| def main(args: Array[String]): Unit = {
| println("Hello, world!")
| }
|}
|
|HelloWorld.main(Array())
|""".stripMargin
val tree = toolbox.parse(source)
val binary = toolbox.compile(tree)
binary()但据我猜测,在Scala3中,scala-reflect将不会被移植。我如何在Scala3中实现同样的目标?
发布于 2021-07-01 02:21:04
哦,你可以看看ammonite: parser:https://github.com/com-lihaoyi/Ammonite/blob/master/amm/compiler/src/main/scala-3/ammonite/compiler/Parsers.scala (他们创建一个虚拟文件并在上面运行编译器)。
如果你不需要评估而只需要AST,那么也许scalameta https://scalameta.org/就足够了。据我所知,最新版本支持scala3语法,但scalameta本身(即解析树的处理)在scala2上。
https://stackoverflow.com/questions/68194436
复制相似问题