假设我有一个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/