我可以创造一个分析器,它可以处理两个或三个数字,用逗号分隔,就像这样:的毗连解析结果
number :: Parser Int
number = many1 digit >>= return . read <?> "number"
numbers = do
n1 <- number
n2 <- char ':' >> number
n3 <- optionMaybe $ char ':' >> number
return ... -- return all of n1, n2, n3
只有数是重要的,剩下的就被丢弃。有没有一种方法来连接中间解析结果(n1,n2,n3
)来处理它的input
之外?例如斯卡拉的解析器组合子可以做到这一点:
def numbers: Parser[Int ~ Int ~ Option[Int]] = // only the important numbers are returned
number ~ (":" ~> number) ~ opt(":" ~> number)
我想,为了在不同的地方做这个模式匹配解析器。例如,在斯卡拉我可以做这样的事情:
val result = input.parseAs(numbers) {
case n1 ~ n2 ~ None => // work with n1,n2
case n1 ~ n2 ~ Some(n3) => // work with n1,n2,n3
}
其中输入是一个字符串解析。 parsec是否有内置函数来允许类似的行为?如果不是我自己如何建立这样的行为?