使用 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
我正在试用 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