使用 parsec 检查剩余输入是否为空格

Checking if the remaining input is whitespace with parsec

我正在试用 parsec 库,但不确定如何处理这项基本任务。

假设我有以下内容:

data Foo = A | AB

并且我希望将字符串 "a" 解析为 A 和 "a b" AB。如果我这样做:

parseA :: parser Foo
parseA = do
           reserved "a"
           return A

parseAB :: parser Foo
parseAB = do
            reserved "a"
            reserved "b"
            return AB

parseFoo :: parser Foo
parseFoo =  parseA
        <|> parseAB

然后 parseFoo 会将 "a b" 解析为 A,因为 parseA 不关心在使用 'a' 之后仍然存在非空白.如何解决?

您需要将语法更改为 AB | A 并使用来自 parsec 的 try,这为您的解析器提供了前瞻能力。

这应该有效

parseFoo = try Parse AB <|> parse A