2010-04-10 42 views
5

Tôi đang tạo ra AST scala sử dụng đoạn mã sau:Tạo scala AST cho phương pháp đệ quy

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) 

Tôi đoán đây là mã chuẩn được sử dụng để chạy các trình biên dịch trong các mã và tạo ra các AST để làm việc với. Đoạn mã trên làm việc tốt cho bất kỳ mã scala hợp lệ nào trong Test.scala cho đến bây giờ. Khi tôi sử dụng một hàm đệ quy trong Test.scala, như

def xMethod (x: Int): Int = if (x == 0) -1 khác xMethod (x-1)

Nó mang lại cho tôi một java.lang.NullPointerException. Một vài dòng trên cùng của stack trace trông như thế này

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) 

Mã này hoạt động tốt cho một phương pháp như

def aMethod(c:Int):Int = { bMethod(c) } 
def bMethod(x:Int):Int = aMethod(x) 

Xin vui lòng cho tôi biết nếu chức năng đệ quy cần bất kỳ thiết lập khác.

Trả lời

Các vấn đề liên quan