首页 > 解决方案 > 在 Haskell (Parsec) 中链接两个解析器

问题描述

Parsec 提供了一个运算符来在两个解析器之间进行选择:

(<|>)
  :: Text.Parsec.Prim.ParsecT s u m a
     -> Text.Parsec.Prim.ParsecT s u m a
     -> Text.Parsec.Prim.ParsecT s u m a

是否有类似的功能来链接两个解析器?我没有使用 Hoogle 找到具有相同签名的人。


例如,假设我想解析任何单词,可选地后跟一个数字。我的第一个想法是使用>>,但它似乎不起作用。

parser = many1 letter >> optional (fmap pure digit)

我用于fmap pure将数字转换为实际字符串,从而匹配many1 letter. 我不知道它是否有用。

标签: parsinghaskellparsec

解决方案


尝试这个:

parser = (++) <$> many1 letter <*> option "" (fmap pure digit)

这相当于:

parser = pure (++) <*> many1 letter <*> option "" (fmap pure digit)

option [] (fmap pure digit)如果解析器失败,则返回空字符串,否则返回digit一个数字字符的字符串。

您还可以使用 do-notation 来获得更易读的代码:

parser = do
    s1 <- many1 letter
    s2 <- option "" (fmap pure digit)
    return (s1 ++ s2)

推荐阅读