parsing - 在 Haskell 中链接两个解析器 (Parsec)

标签 parsing 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 的解析类型。不知道有没有用。

最佳答案

试试这个:

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)

关于parsing - 在 Haskell 中链接两个解析器 (Parsec),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63780263/

相关文章:

javascript - node.js 解析页面并捕获外部前端 js 错误

haskell - 让 Parsec 函数失败而不是等待更多输入

algorithm - 使用自然语言生成解读句子中的单词

php - 如何在 PHP 中解析 HTML?

haskell - 具有更大域的 Euler #4

Haskell 函数组合 - (a -> b) -> (a -> c) -> (b -> c -> d) -> (a -> d)

database - Haskell persistent w/esqueleto : read entire table, 和计数记录

haskell - 对结果被丢弃的解析器使用应用符号

json - 修复错误的 JSON 语法

java - 如何消除 JavaCC 中的选择冲突?