我想解析一些文本,其中某些字段大部分时间都有结构,但偶尔(由于特殊的大小写、排字等原因),这种结构是缺少的。
通常情况下是Cost: 5,但偶尔会读到Cost: 5m或Cost: 3 + 1 per ally,或者其他一些随机的东西。
在常规解析器(p)不能工作的情况下,我想回到解析器,它将整行作为字符串。
为此,我想创建一个类型为Parser a -> Parser b -> Either a b的组合器。但是,如果不执行类似case parse p "" txt of ...的操作,我就无法想出如何检查第一个解析器是否成功的结果。
我看不到combinator的构建,但我确信有一些简单的方法可以解决这个问题
发布于 2013-11-24 19:54:38
我想你想要这样的东西
eitherParse :: Parser a -> Parser b -> Parser (Either a b)
eitherParse a b = fmap Left (try a) <|> fmap Right btry只是为了确保如果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发布于 2013-11-24 19:50:50
试试这个:(<|>) :: ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
通常,您可以这样使用它:
try p <|> qhttps://stackoverflow.com/questions/20180053
复制相似问题