5

次のコードを使用してscalaASTを生成しています。

  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)

再帰関数に他の設定が必要な場合はお知らせください。

4

1 に答える 1

1

何が間違っているのかはわかりませんがcompiler.typedTree、プロジェクトでASTを取得するために使用しています。多分これはあなたにもうまくいくでしょう。

詳細については、 http://scala.ifs.hsr.ch/browser/src/scala/tools/refactoring/util/CompilerProvider.scalaを参照してください。

于 2010-04-11T11:32:09.310 に答える