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

Parsing 避免使用解析器库中的失败解析器,parsing,haskell,parser-combinators,Parsing,Haskell,Parser Combinators,据我所知,不建议使用,稍后将删除 在下面的例子中,什么应该正确使用而不是失败 parserNaturalNoLeadZero::解析器整数 parserNaturalNoLeadZero=do 数字1和标题数字=='0' 然后失败“前导零” 否则返回$read数字 如文档所示,将引入一个新类来履行该角色 但是,对于像解析器这样的东西,明智的选择通常是,这已经存在了很久了。Parsec: 三位一体: 唯一的区别是它们产生的错误消息 对意外令牌使用unexpected意外的“令

据我所知,不建议使用,稍后将删除

在下面的例子中,什么应该正确使用而不是失败

parserNaturalNoLeadZero::解析器整数
parserNaturalNoLeadZero=do
数字1和标题数字=='0'
然后失败“前导零”
否则返回$read数字

如文档所示,将引入一个新类来履行该角色

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

Parsec:

三位一体:

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

  • 对意外令牌使用
    unexpected
    <代码>意外的“令牌”将导致错误消息,如
    意外的:“令牌”

  • 使用语法分析器表示的高级结构对语法分析器进行注释

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

    parsexpr=。。。“表达”
    parseId=。。。“标识符”
    帕西蒂=。。。“类型”
    
  • empty
    不会产生任何错误消息。回溯并让另一个分支成功或负责报告有意义的错误仍然是有用的

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


从IRC的讨论中,您认为使用意外:?
parserNaturalNoLeadZero :: Parser Integer
parserNaturalNoLeadZero = do
  digits <- some digit
  if length digits > 1 && head digits == '0'
    then fail "Leading Zeros"
    else return $ read digits
parseExpr = ... <?> "expression"
parseId = ... <?> "identifier"
parseTy = ... <?> "type"