Scala 如何将符号添加到已解析的AST中?

Scala 如何将符号添加到已解析的AST中?,scala,reflection,macros,Scala,Reflection,Macros,这与和有着松散的联系 在下面的代码中,我使用工具箱将代码解析为相应的AST。如何将下面代码中的符号定义前缀添加到AST中,以便在表达式树中使用这些符号 import scala.reflect.runtime.universe._ import scala.tools.reflect.ToolBox object Main extends App { val cm = runtimeMirror(getClass.getClassLoader) val tb = cm.mkToolB

这与和有着松散的联系

在下面的代码中,我使用工具箱将代码解析为相应的AST。如何将下面代码中的符号定义前缀添加到AST中,以便在表达式树中使用这些符号

import scala.reflect.runtime.universe._
import scala.tools.reflect.ToolBox

object Main extends App {

  val cm = runtimeMirror(getClass.getClassLoader)
  val tb = cm.mkToolBox()

  val expr = tb.parse("println(i)")

  val build = internal.reificationSupport

  val prefix = build.setInfo(build.newFreeTerm("i", 2), typeOf[Int])

  // TODO: add prefix before expr by some AST manipulation

  tb.eval(expr)
}

您需要使用Traverser的子类遍历expr,然后针对所有出现的i.e.标识(表示我调用tree.setSymbolprefix)。或者,您可以使用正确的符号开始构建expr,例如类似于qprintln$prefix的符号。@EugeneBurmako谢谢,如果可行,我将尝试遍历器并在此处发布结果,你或我可以将其作为完整答案发布。使用正确的符号进行构建似乎很困难,因为expr是由用户编辑的脚本。因此,我希望它的语法尽可能自然,使用$xxx作为预定义变量是可能的,但如果有其他解决方案,我会更喜欢它。