0

Scala (kiama) でミニ Java コンパイラを作成しています。「tipe」と呼ばれるコード ブロックの 1 つにエラーが表示され、Scala の初歩的な知識だけでは解読できません。

これは私のコードです(やや不完全ですが、エラーが発生しているとは思いません)

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

プログラムをコンパイルしようとすると、次のエラーが発生します。

タイプの不一致が見つかりました:

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

必須: SyntaxAnalysis.this.PackratParser[funjs.FunJSTree.type]

ヒント ~ ( "->" ~> ヒント ) |

| を指す矢印付き

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

4

1 に答える 1

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) => ... }(注:構文に慣れていない場合は、より基本的なものから始めることをお勧めします。)

于 2016-08-31T12:14:56.420 に答える