【问题标题】:Type missmatch with packrat scala/kiama error与 packrat scala/kiama 错误的类型不匹配
【发布时间】:2016-08-31 09:55:47
【问题描述】:

我正在 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]

tipe ~ ( "->" ~> tipe ) |

带有指向 | 的箭头

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

【问题讨论】:

    标签: scala compiler-errors kiama


    【解决方案1】:

    编译器假定tipe 具有您提供的类型:PackratParser[Type]。这意味着tipe ~("-&gt;" ~&gt; 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) =&gt; ... } 语法,我建议您从更基本的开始。)

    【讨论】:

      猜你喜欢
      • 2012-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 2015-04-09
      • 1970-01-01
      相关资源
      最近更新 更多