匹配列表中间的子列表

Ele*_*fee 3 scala pattern-matching

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

然而,可变数量的令牌之后解析一些东西似乎很麻烦。

有没有办法让我做如下事情:

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

哪里{ args }是子列表。

所以说如果Token列表看起来像这样:

List(FuncDef, Id("foo"), LeftParen, Id("x"), Id("y"), Id("z"), RightParen)
Run Code Online (Sandbox Code Playgroud)

{ args } 然后会匹配 Id("x"), Id("y"), Id("z")

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

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

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

Kol*_*mar 5

您可以使用:+匹配器拆分 any 的最后一个元素Seq。所以完整的匹配表达式看起来像这样:

case FuncDef +: Id(v) +: LeftParen +: args :+ RightParen =>
Run Code Online (Sandbox Code Playgroud)

For 列表+:基本上等价于::,所以我在这里使用它是为了与:+.