我正在研究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 = {
}
}
答案 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)]
,或者执行其他操作以使类型匹配。