2010-04-10 9 views
5

Je génère le scala AST en utilisant le code suivant:Génération scala AST pour la méthode récursive

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) 

Je suppose que cela est le code standard utilisé pour exécuter le compilateur dans le code et générer l'AST pour travailler avec. Le code ci-dessus a bien fonctionné pour tout code de scala valide dans Test.scala jusqu'à maintenant. Lors de l'utilisation d'une fonction récursive en Test.scala, comme

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

Cela me donne une exception java.lang.NullPointerException. Les principales lignes de la trace de la pile ressemblent à ce

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) 

Le code fonctionne bien pour une méthode comme

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

S'il vous plaît laissez-moi savoir si les fonctions récursives besoin d'un autre paramètre.

Répondre

Questions connexes