让我用这个例子:
1 2 3 / 4 5 6
应解析为:
[[1, 2, 3], [4, 5, 6]]
所以我写道:
p1 :: Parser (List Char)
p1 = sepBy anyDigit (char ' ')
p2 :: Parser (List (List Char))
p2 = sepBy p1 (string " / ")
唉,这失败了:
(Left Character '/' is not a digit)
走哪条路?
答案 0 :(得分:2)
问题是分隔符/
以空格开头,因此第一个解析器提交解析其分隔符然后解析下一个数字。
您有几个选择。您可以更改p1
,以便明确查找空格而不是运算符:
sepBy anyDigit (char ' ' <* notFollowedBy (char '/'))
或者,让你的词汇急切地消耗任何尾随空格:
myDigit = anyDigit <* many whitespace
p1 = many1 myDigit
p2 = sepBy p1 (char '/' <* many whitespace)
另一种选择是将解析器拆分为初始的lexing阶段,将输入拆分为lexemes,删除空格。然后,您将无法使用string-parsers
,但purescript-parsing
可以处理令牌流。