匹配列表中间的子列表

时间:2016-02-25 15:07:25

标签: scala pattern-matching

我正在编写一个使用Scala模式匹配功能的简单解析器。

然而,在可变数量的令牌之后解析之后的事情似乎相当麻烦。

我有办法做以下事情:

def parse(toks: List[Token]) = toks match {
  case FuncDef :: Id(v) :: LeftParen :: { args } :: RightParen :: Nil => 
    // impl goes here
}

其中{ args }是子列表。

所以说如果Token列表如下:

List(FuncDef, Id("foo"), LeftParen, Id("x"), Id("y"), Id("z"), RightParen)
然后

{ args }将匹配Id("x"), Id("y"), Id("z")

这是可行的,还是我需要去做呢

def parse(toks: List[Token]) = toks match {
  case FuncDef :: Id(v) :: LeftParen :: tail => 
    // impl goes here
}

然后去手动检查RightParen中的tail是否出现在正确的位置?

1 个答案:

答案 0 :(得分:4)

您可以使用:+匹配器拆分任何Seq的最后一个元素。所以完全匹配的表达式如下所示:

case FuncDef +: Id(v) +: LeftParen +: args :+ RightParen =>

对于列表+:基本上等同于::,因此我在此使用它与:+对称。