我正在编写一个使用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
是否出现在正确的位置?
答案 0 :(得分:4)
您可以使用:+
匹配器拆分任何Seq
的最后一个元素。所以完全匹配的表达式如下所示:
case FuncDef +: Id(v) +: LeftParen +: args :+ RightParen =>
对于列表+:
基本上等同于::
,因此我在此使用它与:+
对称。