0

我正在 Scala (kiama) 中创建一个 mini-java 编译器。我的一个名为“tipe”的代码块给了我一个错误,我的 Scala 入门知识无法破解。

这是我的代码(有点不完整,但我不相信这是给我的错误)

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

当我尝试编译我的程序时出现以下错误:

发现类型不匹配:

找到:SyntaxAnalysis.this.Parser[Object]

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

小费~(“->”~>小费)|

带有指向 | 的箭头

任何帮助将不胜感激,我是 Scala 的新手,这对我来说相当复杂。

4

1 回答 1

0

编译器假设tipe具有您提供的类型:PackratParser[Type]. 这意味着tipe ~("->" ~> tipe)is a Parser[Type ~ Type], while "bool"etc. 被转换为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 回答