因此,我正在尝试创建解析器,这是生产规则之一:
app : app "(" ((exp ",")* exp)? ")"
与此相关的案例类如下:
case class AppExp(fn : Expression, args : Vector[Expression])
绊倒我的主要是Vector[Expression]
。我该如何使解析器返回它?
我尝试过转换产品:
lazy val app : PackratParser[Expression] =
app ~ ("(" ~> opt(rep(exp <~ ",") ~> exp) <~ ")") ^^ { case e ~ t => AppExp (e, t) }
但是opt
部分成功了,所以返回的是Option
而不是A Vector
。
found:Option[...]
required:Vector[...]
And it points to the `t` in `AppExp(e, t)` in the error message.
我希望我能解释清楚自己。在这种情况下,但一般来说,Vector
是由什么构成的?因为在其他一些情况下,它们还需要一个表达向量,所以我不知道这意味着什么。我什至在做正确的事吗?任何帮助表示赞赏。谢谢
答案 0 :(得分:0)
opt(rep(exp <~ ",") ~> exp)
构造太复杂了,它丢弃了除最后一个表达式之外的所有表达式。请改用repsep(exp, ",")
。