微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在运行时将 Scala 3 代码从字符串解析为 Scala 3 AST

我的目标是将 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 上。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。