带有重叠的分隔符的INT列表的解析列表

  • 本文关键字:列表 INT 分隔符 重叠 purescript
  • 更新时间 :
  • 英文 :


让我使用此示例:

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可以在令牌流上工作。

最新更新