2012-12-28 79 views
2

我在下面的代碼中獲得dup illegal arguments exceptionKiama:dup非法參數異常

package tests.kiama 

import org.junit.runner.RunWith 
import org.scalatest.FunSuite 
import org.scalatest.junit.JUnitRunner 
import org.kiama.rewriting.Rewriter._ 

@RunWith(classOf[JUnitRunner]) 
class KiamaRewrite extends FunSuite { 
    test("test1") { 
     abstract class E 
     case class B(l: E, r: E) extends E 
     case class P() extends E 
     case class Q() extends E 
     case class PP() extends E 
     case class QQ() extends E 

     val t = B(P(), Q()) 
     val d = rule { 
      case P() => PP() 
      case Q() => QQ() 
     } 

     val s = bottomup(d)(t) 
     println("done") 
    } 
} 

例外:

java.lang.RuntimeException: dup illegal arguments: public tests.kiama.KiamaRewrite$$anonfun$1$B$2(tests.kiama.KiamaRewrite$$anonfun$1,tests.kiama.KiamaRewrite$$anonfun$1$E$1,tests.kiama.KiamaRewrite$$anonfun$1$E$1) (PP(),QQ()), expects 3 

我使用的是凱馬庫。 http://code.google.com/p/kiama/

回答

2

Kiama dup方法負責創建與現有實例相同類型的新實例。 dup使用反射來查找構造函數,並抱怨構造函數參數與給定的參數不匹配。在您的測試中,它試圖製作帶有兩個子節點的B節點,但B構造函數有三個參數,因爲BKiamaRewrite的內部類。

B等類聲明移出KiamaRewrite並通過測試。

+0

這是否也適用於內在的特質類? – schlicht

+0

是的,我認爲是。最終,您需要將特徵混合到一個類中,然後該特徵的內部類將具有對該類實例的外部引用。 – inkytonik

+0

謝謝。有沒有其他解決這個問題的方法?或者我可以在哪裏查看更多細節,以更好地瞭解這個問題? – schlicht