2016-08-31 4 views
0

私はScala(kiama)でミニJavaコンパイラを作成しています。 "tipe"と呼ばれるコードブロックの1つが、私の間違いで、Scalaの入門的な知識がちょうど亀裂を生じさせないというエラーです。packat scala/kiamaエラーのmissmatch

これは(やや不完全、私は私にエラーを与えているとは考えていないことを)私のコードで私は私のプログラムをコンパイルしようとすると

lazy val tipe : PackratParser[Type] = 
"bool"| 
"int" | 
"obj" | 
tipe ~("->" ~> tipe) | 
("(" ~> tipe <~")") 

は、私は次のエラーを取得する:

型の不一致が見つかりました:

見つかり:SyntaxAnalysis.this.Parser [オブジェクト]

必須:SyntaxAnalysis.this.Pa ckratParser [funjs.FunJSTree.type]

tipe〜( " - >"〜tipe)|

矢印が|

私はScalaを初めて使っていて、これは私にとってはかなり複雑です。

答えて

0

tipeは、提供するタイプがPackratParser[Type]であると想定しています。これはtipe ~("->" ~> tipe)Parser[Type ~ Type]であり、"bool"などがParser[String]に変換されていることを意味します。 Parser[String]Parser[Type ~ Type]を組み合わせると、Parser[Object]StringType ~ Typeという共通のスーパータイプとして)が得られます。これを解決するには、すべての代替(引数:|)がParser[Type]であることを確認する必要があります。通常、それは^^^^^コンビネータを使って

lazy val tipe : PackratParser[Type] = 
"bool" ^^^ BoolType | 
... 
tipe ~("->" ~> tipe) ^^ { case (t1, t2) => someFunctionOf(t1, t2) } | 
("(" ~> tipe <~")") 

のようになります。

(注意:あなたが{ case (t1, t2) => ... }構文に慣れていないならば、私はより基本的なものから始まるお勧めします)

+0

はありがとうございました!エラーが解決しました! – reemq8

関連する問題