解析器功能中的故障处理

时间:2019-01-27 13:10:10

标签: parsing haskell parser-combinators trifecta

我正在使用Trifecta库学习解析器组合器。我被介绍给Alternative类型类,它是<|>函数。

我的代码中有一个解析器函数,其定义是

fractionOrDecimal :: Parser DoubleOrRational
fractionOrDecimal =
        (Left <$> try parseDecimal)                  -- A
    <|> (Right <$> try parseFraction)                -- B
    <|> (fail  "Expected Fraction or Decimal.")      -- Err

尝试将输入解析为十进制或小数,如果没有任何作用,则失败。这种方法是正确的还是我应该对故障(fail)进行不同的编码,而不是作为<|>操作的一部分。

1 个答案:

答案 0 :(得分:4)

失败是由没有成功的解析器进行编码的。 Trifecta会为您跟踪预期的令牌,但是您必须使用<?>告诉它们它们叫什么。所以你会做

fractionOrDecimal :: Parser DoubleOrRational
fractionOrDecimal =
        (Left  <$> try parseDecimal  <?> "Decimal")
    <|> (Right <$> try parseFraction <?> "Fractional")

我们现在收到这样的错误:

>>> parseTest fractionalOrDecimal "neither fractional nor decimal"
error: expected: Decimal, Fractional
neither fractional nor decimal<EOF> 
^