如何创建解析器创建的构造的向量

时间:2018-09-29 06:14:24

标签: scala parsing

因此,我正在尝试创建解析器,这是生产规则之一:

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是由什么构成的?因为在其他一些情况下,它们还需要一个表达向量,所以我不知道这意味着什么。我什至在做正确的事吗?任何帮助表示赞赏。谢谢

1 个答案:

答案 0 :(得分:0)

opt(rep(exp <~ ",") ~> exp)构造太复杂了,它丢弃了除最后一个表达式之外的所有表达式。请改用repsep(exp, ",")