让我使用此示例:
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 " / ")
a,这失败了:
(Left Character '/' is not a digit)
哪种方式去?
问题是分离器/
从空间开始,因此第一个解析器正在承诺解析其分离器,然后是下一个数字。
您有一些选择。您可以更改p1
,以便明确寻找空间而不是操作员:
sepBy anyDigit (char ' ' <* notFollowedBy (char '/'))
另外,让您的词汇热切消耗任何尾随的空间:
myDigit = anyDigit <* many whitespace
p1 = many1 myDigit
p2 = sepBy p1 (char '/' <* many whitespace)
另一种选择是将解析器分为初始的Lexing阶段,该阶段将输入分为词汇,以删除空格。那么您将无法使用string-parsers
,但是purescript-parsing
可以在令牌流上工作。