解析具有重叠分隔符的整数列表 purescript-string-parsers

Parsing list of list of ints with overlapping separators purescript-string-parsers

让我用这个例子:

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)

走哪条路?

问题是分隔符 / 以 space 开头,因此第一个解析器致力于解析其分隔符,然后是下一个数字。

你有几个选择。您可以更改 p1 以便它明确查找 space 而不是运算符:

sepBy anyDigit (char ' ' <* notFollowedBy (char '/'))

或者,让你的词素急切地消耗任何尾随的白色space:

myDigit = anyDigit <* many whitespace

p1 = many1 myDigit
p2 = sepBy p1 (char '/' <* many whitespace)

另一种选择是将您的解析器拆分为初始词法分析阶段,将输入拆分为词素,删除白色space。那么你将无法使用 string-parsers,但 purescript-parsing 将能够处理令牌流。