scala - 为递归方法生成Scala AST

标签 scala abstract-syntax-tree

我正在使用以下代码生成 scala AST:

  val setting = new Settings(error) 
  val reporter = new ConsoleReporter(setting, in, out) {
         override def displayPrompt = ()
  }

  val compiler = new Global(setting, reporter) with ASTExtractor{
        override def onlyPresentation = true
  }
  //setting.PhasesSetting("parser", "parserPhase")
  val run = new compiler.Run
  val sourceFiles:List[String] = List("Test.scala")
  run.compile(sourceFiles.toList)

我猜这是用于在代码中运行编译器并生成要使用的 AST 的标准代码。到目前为止,上面的代码对于 Test.scala 中的任何有效 scala 代码都可以正常工作。当我在 Test.scala 中使用递归函数时,比如

def xMethod(x:Int):Int = if(x == 0) -1 else xMethod(x-1)



它给了我一个 java.lang.NullPointerException。堆栈跟踪的前几行看起来像这样
at scala.tools.nsc.typechecker.Typers$Typer.checkNoDoubleDefsAndAddSynthetics$1(Typers.scala:2170)
at scala.tools.nsc.typechecker.Typers$Typer.typedStats(Typers.scala:2196)
at scala.tools.nsc.typechecker.Typers$Typer.typedBlock(Typers.scala:1951)
at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:3815)
at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:4124)
at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:4177)
at scala.tools.nsc.transform.TailCalls$TailCallElimination.transform(TailCalls.scala:199)

该代码适用于类似的方法
def aMethod(c:Int):Int = { bMethod(c) }
def bMethod(x:Int):Int = aMethod(x)

请让我知道递归函数是否需要任何其他设置。

最佳答案

我不能告诉你你做错了什么,但我使用 compiler.typedTree在我的项目中获得 AST。也许这也适用于你。

http://scala.ifs.hsr.ch/browser/src/scala/tools/refactoring/util/CompilerProvider.scala了解更多背景信息。

关于scala - 为递归方法生成Scala AST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2615095/

相关文章:

scala - Scala Stream 中的#::运算符是什么?

用于 Play 的 Json "Validate"

带有案例类的 Scala 无形类型 Map[Symbol, String]

regex - 斯卡拉正则表达式 : get last number of string

Python 节点转换器 : how to remove nodes?

C++ vector 和段错误

python - Python 中 AST 的抽象语法 : questions for "FunctionDef" et "arguments"

Java spark 无法执行 df.show()

objective-c - 如何从 Objective-C 代码中提取 AST?

parsing - 有没有办法在解析后使用关联性和优先级表来修复其中包含运算符的表达式?