如果我有一个解析器,如:
notZeroOrOne :: Parser Char
notZeroOrOne = noneOf ['0' , '1'] 有没有一种方法可以组合另一个解析器(如digitChar )的规则,这样我就可以得到一个解析器,它只有在两个解析器都通过时才会通过?
有点像
biggerThanOne :: Parser Char
biggerThanOne = digitChar && notZeroOrOne 发布于 2016-02-28 06:19:01
正如user2407038在注释中所建议的,使用lookAhead函数是可以实现的。
biggerThanOne :: Parser Char
biggerThanOne =
lookAhead digitChar *> notZeroOrOne然而,解析器本质上是顺序的,因此应用顺序逻辑既有效又易于理解。例如,使用Monad实例Parser
biggerThanOne :: Parser Char
biggerThanOne =
do
c <- digitChar
if c /= '0' && c /= '1'
then return c
else unexpected "Not bigger than one"或MonadPlus
biggerThanOne :: Parser Char
biggerThanOne =
mfilter (\c -> c /= '0' && c /= '1') digitChar它可以重构为使用Ord实例的Char,并且非常清楚地表达了您的意图:
biggerThanOne :: Parser Char
biggerThanOne =
mfilter (> '1') digitChar发布于 2016-02-28 13:46:19
在中有一个,它为您提供了所有可能的解析。你可以用这个来看看你是否同时得到了两个分析。如果您只得到一个解析,则可以使用monad失败。
P pAnd q= amb (p <|> q) >>= \r ->如果长度r == 2,则返回.否则pFail
https://stackoverflow.com/questions/35677210
复制相似问题