scala解析不会返回正确的结果

时间:2015-02-20 15:11:53

标签: scala parsing

我正在研究scala,我正在尝试创建这个解析器:

<expr> ::= <num>
     | (cond (<expr> <expr>) ...) # multi-armed conditional
     | (cond (<expr> <expr>) ... (else <expr>)) # multi-armed conditional w/ else

这是我这部分的代码:

  case SList(List(SSym(cond),SList(List(a,b)))) => CondExt(parse(SList(List.apply(a,b))))

当我运行此代码时,我收到此错误:

Status: CompilationFailure
solution.scala:53: error: type mismatch;
 found   : ExprExt
 required: List[(ExprExt, ExprExt)]
      case SList(List(SSym(cond),SList(List(a,b)))) => CondExt(parse(SList(List.apply(a,b))))

如何修复此错误我尝试了其他几种不同的方法:

  case SList(List(SSym(cond),SList(List((a,b)),SList(List((c,d)))))) =>  CondExt(SList(List(parse(a),parse(b))))

and for this I get this error:
Status: CompilationFailure
solution.scala:54: error: wrong number of arguments for <none>: (list: List[Library.SExpr])Library.SList
      case SList(List(SSym(cond),SList(List((a,b)),SList(List((c,d)))))) =>  CondExt(SList(List(parse(a),parse(b))))
                                      ^
solution.scala:54: error: not found: value a
      case SList(List(SSym(cond),SList(List((a,b)),SList(List((c,d)))))) =>  CondExt(SList(List(parse(a),parse(b))))

有人怎么能指出我正在做的错误。

额外信息:

case class CondExt(cs: List[(ExprExt, ExprExt)]) extends ExprExt
case class CondEExt(cs: List[(ExprExt, ExprExt)], e: ExprExt) extends ExprExt

sealed abstract class SExpr
case class SNum(n : Int) extends SExpr
case class SSym(s : String) extends SExpr
case class SList(l  : List[SExpr]) extends SExpr


object Parser {
  def parse(str: String): ExprExt = parse(Reader.read(str))

  def parse(sexpr: SExpr): ExprExt = {
  }
}

1 个答案:

答案 0 :(得分:1)

问题在于:

CondExt(parse(SList(List.apply(a,b))))

parse(SList(...))来电parse(arg:SExpr):ExprExt。这会尝试调用CondExt(arg:ExprExt),但CondExt只为apply类型的参数定义了List[(ExprExt, ExprExt)]方法。

您需要让CondExt获取ExprExt s,让parse返回List[(ExprExt, ExprExt)],或者执行其他操作以使类型匹配。