parsing - 使解析器忽略所有多余的空格

标签 parsing haskell parsec

假设我有一个Parser p以秒差距计算,我想指定我要忽略 p 中所有多余/冗余的空白。举例来说,假设我定义一个列表,以“[”开头,以“]”结尾,列表中是由空格分隔的整数。但如果“[”前面、“]”后面、“[”和第一个整数之间有空格,等等,我不希望出现任何错误。

就我而言,我希望它适用于我的玩具编程语言的解析器。

如果有要求/有必要,我将使用代码进行更新。

最佳答案

空格包围所有内容:

parseIntList :: Parsec String u [Int]
parseIntList = do
    spaces
    char '['
    spaces
    first <- many1 digit
    rest <- many $ try $ do
        spaces
        char ','
        spaces
        many1 digit
    spaces
    char ']'
    return $ map read $ first : rest

这是一个非常基本的方法,在某些情况下它会失败(例如空列表),但这是一个良好的开始,让某些东西发挥作用。

@Joehillen 的建议也可行,但它需要更多的类型魔法才能使用秒差距的标记功能。 spaces 的定义匹配 0 个或多个满足 Data.Char.isSpace 的字符,即所有标准 ASCII 空格字符。

关于parsing - 使解析器忽略所有多余的空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20339089/

相关文章:

haskell - 如何用 Parsec 读取精确的 N 个字符?

java - 控制字符串是否是数学表达式

javascript - 如何在 PEG.js 中制作可选词

haskell - 虚空是什么样的?

haskell - 使用堆栈时如何查找.cabal中的依赖项

haskell - 为什么 Parsec 不使用 Control.Applicative 运算符

python - 如何更改规则的解析顺序?

python - 使用链接语法解析器

haskell - 替换 Data.Map 中的键

parsing - Haskell 解析 - Parsec 与 Alex