2010-04-10 64 views
5

我使用下面碼生成階AST:生成階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 =如果(X == 0)-1否則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) 

請讓我知道如果遞歸函數需要任何其他設置。

回答