解析具有重叠分隔符的整数列表 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
将能够处理令牌流。
让我用这个例子:
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
将能够处理令牌流。