首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建解析器组合器,类型为parser a -> Parser b -> Parser ( b)

创建解析器组合器,类型为parser a -> Parser b -> Parser ( b)
EN

Stack Overflow用户
提问于 2013-11-24 19:44:37
回答 2查看 132关注 0票数 3

我想解析一些文本,其中某些字段大部分时间都有结构,但偶尔(由于特殊的大小写、排字等原因),这种结构是缺少的。

通常情况下是Cost: 5,但偶尔会读到Cost: 5mCost: 3 + 1 per ally,或者其他一些随机的东西。

在常规解析器(p)不能工作的情况下,我想回到解析器,它将整行作为字符串。

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

我看不到combinator的构建,但我确信有一些简单的方法可以解决这个问题

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-24 19:54:38

我想你想要这样的东西

代码语言:javascript
复制
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

代码语言:javascript
复制
case parse p "" str of
  Right  (Left a) -> useA a
  Right (Right b) -> useB b
  Left   err      -> handleParserError err
票数 6
EN

Stack Overflow用户

发布于 2013-11-24 19:50:50

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

通常,您可以这样使用它:

代码语言:javascript
复制
try p <|> q
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20180053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档