我正在Scala (kiama)中创建一个迷你java编译器。我的一个名为"tipe“的代码块给了我一个错误,我对Scala的入门知识无法破解。
这是我的代码(有点不完整,但我不认为这会给我带来错误)
lazy val tipe : PackratParser[Type] =
"bool"|
"int" |
"obj" |
tipe ~("->" ~> tipe) |
("(" ~> tipe <~")")当我试图编译我的程序时,我会得到以下错误:
发现类型错配: 发现: SyntaxAnalysis.this.ParserObject 所需: SyntaxAnalysis.this.PackratParserfunjs.FunJSTree.type tipe ~( "->“~> tipe )
有一个箭头指向了
任何帮助都将不胜感激,我是Scala新手,这对我来说相当复杂。
发布于 2016-08-31 12:14:56
编译器假设tipe具有您提供的类型:PackratParser[Type]。这意味着tipe ~("->" ~> tipe)是Parser[Type ~ Type],而"bool"等则转换为Parser[String]。使用Parser[String]和Parser[Type ~ Type]结合使用|会给您一个Parser[Object] (作为String和Type ~ Type的常见超级类型)。要解决这个问题,您需要确保每个选项(|的参数)都是一个Parser[Type]。通常它应该看起来像
lazy val tipe : PackratParser[Type] =
"bool" ^^^ BoolType |
...
tipe ~("->" ~> tipe) ^^ { case (t1, t2) => someFunctionOf(t1, t2) } |
("(" ~> tipe <~")")使用^^和^^^组合子。
(注意:如果您不熟悉{ case (t1, t2) => ... }语法,我建议您从一些更基本的东西开始。)
https://stackoverflow.com/questions/39246396
复制相似问题