代码之家  ›  专栏  ›  技术社区  ›  Răzvan Flavius Panda

避免使用解析器库中的失败解析器

  •  2
  • Răzvan Flavius Panda  · 技术社区  · 8 年前

    根据我被告知的使用 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 回复  |  直到 8 年前
        1
  •  6
  •   leftaroundabout    8 年前

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

    但是,对于解析器之类的东西,明智的选择通常是 empty ,它已经存在很久了。

        2
  •  2
  •   Li-yao Xia    8 年前

    解析C:

    三要素:

    唯一的区别是它们产生的错误消息。

    • 使用 想不到的 在意外标记上。 unexpected "token" 将导致如下错误消息 "unexpected: 'token'" 。

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

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

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

    • 使用 失败 对于其他类型的错误,库不能对其中包含的内容进行太多假设,因此它们可能会将其参数视为原始消息。

    推荐文章