创建解析器类型的解析器组合器 - >解析器b - >解析器(a b)

时间:2013-11-24 19:44:37

标签: parsing haskell parsec

我想解析一些文本,其中某些字段在大多数情况下具有结构但偶尔(由于特殊的大小写,拼写错误等),这种结构缺失。

E.g。常规案例为Cost: 5,但有时会显示Cost: 5mCost: 3 + 1 per ally或其他随机内容。

在普通解析器(p)无法正常工作的情况下,我想回退到一个只将整行作为字符串的解析器。

为此,我想创建一个Parser a -> Parser b -> Either a b类型的组合子。但是,我无法确定如何检查第一个解析器是否成功的结果,而不执行case parse p "" txt of ...之类的操作。

我看不到组合器中的构建,但我确信有一些简单的方法可以解决这个问题,我很想知道

2 个答案:

答案 0 :(得分:6)

我想你想要这样的东西

eitherParse :: Parser a -> Parser b -> Parser (Either a b)
eitherParse a b = fmap Left (try a) <|> fmap Right b

try只是为了确保a消耗某些输入然后失败,您将正确回溯。然后,您可以使用常规方法运行解析器以生成Either ParseError (Either a b)

很容易转换为Either a b

case parse p "" str of
  Right  (Left a) -> useA a
  Right (Right b) -> useB b
  Left   err      -> handleParserError err

答案 1 :(得分:-1)

试试这个:(<|>) :: ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a

通常你可以这样使用它:

try p <|> q