scala - 在运行时将 Scala 3 代码从字符串解析为 Scala 3 AST

标签 scala reflection scala-3

我的目标是将 Scala 3 代码作为字符串获取,并在运行时将其解析为 Scala 3 的抽象语法树。在这个过程中,如果代码有编译错误,我应该把它作为一些异常的一部分。
更大的目标是如果 scala 代码有效,则以 Expr[T] 结束,并通过拼接正确的位来执行它(我已经介绍了这部分)。
这在 Scala 2.* 中是可行的,使用 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()
但据我推测,在 Scala 3 中,不会移植 scala-reflect。
我如何在 Scala 3 中实现相同的目标?
一些相关链接 herehere

最佳答案

哦,你可以看看菊石:解析器: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 上。

关于scala - 在运行时将 Scala 3 代码从字符串解析为 Scala 3 AST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68194436/

相关文章:

scala - 具有多个匹配项的模式匹配

scala - 给定关键字在 Scala 3 或 dotty 中如何工作?

Java - 在不知道构造函数参数的情况下使用反射创建新实例

web-services - 接收数据大小的 DynamicProxyFactory 错误

go - 用反射设置零指针的地址

scala - Scala 3.0 中访问注释值

scala - 如何在 dotty 中解压元组中的元素类型?

scala - 在 Scala 中命名案例类

Scala 2.8 Actor

Scala 流计算抛出 StackOverflowError