我正在开发我的第一个实现递归下降数学表达式解析器的scala项目。
在任何递归下降解析器中,我都有函数(对应于我的语法程序),它可以返回Success,其余部分要解析,结果或失败。
为此,我在密封特征中使用了两个case类,这样我的函数可以返回一个对应于成功或失败的类型Result
,但是我在编译和工作时遇到了麻烦。 (我在比赛中一直收到type mismatch
错误)
知道我做错了什么?
这是他的代码:
sealed trait Result
case class Success(expr: String, result: Int) extends Result
case object Failure extends Result
class PackratParser() {
var x: Int = 3
def pExpr(expr: String) : Result = {
return Success(32)
}
def parseExpr(expr: String) : Int = {
val p = pExpr(expr)
p match {
case Success(expr, res) => println("success!" + expr + res)
case Failure => println("failure...")
}
}
}
谢谢:)
答案 0 :(得分:0)
有两个问题。首先,在pExpr
内,您只向Success
提供一个参数,即使它需要两个:
def pExpr(expr: String) : Result = {
return Success(32) // Requires String and Int
}
其次,parseExpr
的返回类型为Int
,但您目前没有返回任何内容。这取决于你想要如何处理它,但一个选择是返回Option[Int]
而不是Int
,因为你不会有Int
返回Failure
:
def parseExpr(expr: String): Option[Int] = {
val p = pExpr(expr)
val maybeInt = p match {
case Success(expr, res) => {
println("success!" + expr + res)
Some(res)
}
case Failure => {
println("failure...")
None
}
}
maybeInt
}
工作小提琴here。