首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MegaParsec中,是否有一种方法可以对两个解析器进行分析?

在MegaParsec中,是否有一种方法可以对两个解析器进行分析?
EN

Stack Overflow用户
提问于 2016-02-28 00:23:02
回答 2查看 289关注 0票数 4

如果我有一个解析器,如:

代码语言:javascript
复制
notZeroOrOne :: Parser Char
notZeroOrOne = noneOf ['0' , '1'] 

有没有一种方法可以组合另一个解析器(如digitChar )的规则,这样我就可以得到一个解析器,它只有在两个解析器都通过时才会通过?

有点像

代码语言:javascript
复制
biggerThanOne :: Parser Char
biggerThanOne  = digitChar && notZeroOrOne 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-28 06:19:01

正如user2407038在注释中所建议的,使用lookAhead函数是可以实现的。

代码语言:javascript
复制
biggerThanOne :: Parser Char
biggerThanOne =
  lookAhead digitChar *> notZeroOrOne

然而,解析器本质上是顺序的,因此应用顺序逻辑既有效又易于理解。例如,使用Monad实例Parser

代码语言:javascript
复制
biggerThanOne :: Parser Char
biggerThanOne =
  do
    c <- digitChar
    if c /= '0' && c /= '1'
      then return c
      else unexpected "Not bigger than one"

MonadPlus

代码语言:javascript
复制
biggerThanOne :: Parser Char
biggerThanOne =
  mfilter (\c -> c /= '0' && c /= '1') digitChar

它可以重构为使用Ord实例的Char,并且非常清楚地表达了您的意图:

代码语言:javascript
复制
biggerThanOne :: Parser Char
biggerThanOne =
  mfilter (> '1') digitChar
票数 7
EN

Stack Overflow用户

发布于 2016-02-28 13:46:19

在中有一个,它为您提供了所有可能的解析。你可以用这个来看看你是否同时得到了两个分析。如果您只得到一个解析,则可以使用monad失败。

P pAnd q= amb (p <|> q) >>= \r ->如果长度r == 2,则返回.否则pFail

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35677210

复制
相关文章

相似问题

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