从解析器库

时间:2018-04-02 23:58:27

标签: parsing haskell parser-combinators

我建议不要使用fail来告诉我,之后会删除它。

在以下Parsers/Trifecta示例中应该正确使用什么而不是失败?

parserNaturalNoLeadZero :: Parser Integer
parserNaturalNoLeadZero = do
  digits <- some digit
  if length digits > 1 && head digits == '0'
    then fail "Leading Zeros"
    else return $ read digits

2 个答案:

答案 0 :(得分:4)

正如文档所述,正在引入一个新的MonadFail类来实现该角色。

但是,对于像解析器这样的东西,明智的选择通常是empty,它已经存在了很长时间。

答案 1 :(得分:1)

秒差距:

连击:

唯一的区别是他们产生的错误信息。

  • 对意外令牌使用module_info = client[db1][t].find().distinct("module_name") unexpected会产生错误消息,例如unexpected "token"

  • 使用(<?>)使用它们代表的高级构造注释解析器。

      

    这通常在设置备选方案的末尾使用,我们希望根据更高级别的构造返回错误消息,而不是返回所有可能的字符。

    "unexpected: 'token'"
  • parseExpr = ... <?> "expression" parseId = ... <?> "identifier" parseTy = ... <?> "type" 不会产生任何错误消息。回溯并让另一个分支成功或负责报告有意义的错误仍然有用。

  • empty用于其他类型的错误,图书馆无法对其中的内容进行多少假设,因此他们可能会将其参数视为原始消息。