Scala 在列表中间匹配子列表

Scala 在列表中间匹配子列表,scala,pattern-matching,Scala,Pattern Matching,我正在编写一个简单的解析器,它使用Scala的模式匹配功能 然而,解析在数量可变的令牌之后出现的东西似乎相当麻烦 我有没有办法做以下事情: def parse(toks: List[Token]) = toks match { case FuncDef :: Id(v) :: LeftParen :: { args } :: RightParen :: Nil => // impl goes here } 其中,{args}是一个子列表 因此,如果标记列表如下所示: Lis

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

然而,解析在数量可变的令牌之后出现的东西似乎相当麻烦

我有没有办法做以下事情:

def parse(toks: List[Token]) = toks match {
  case FuncDef :: Id(v) :: LeftParen :: { args } :: RightParen :: Nil => 
    // impl goes here
}
其中,
{args}
是一个子列表

因此,如果
标记
列表如下所示:

List(FuncDef, Id("foo"), LeftParen, Id("x"), Id("y"), Id("z"), RightParen)
case FuncDef +: Id(v) +: LeftParen +: args :+ 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
中的正确位置?

您可以使用匹配器分割任何
Seq
的最后一个元素。因此,完整匹配表达式如下所示:

List(FuncDef, Id("foo"), LeftParen, Id("x"), Id("y"), Id("z"), RightParen)
case FuncDef +: Id(v) +: LeftParen +: args :+ RightParen =>
对于列表,
+:
基本上等同于
,因此我在这里使用它与
:+
对称