Haskell 使用parsec检查剩余的输入是否为空白

Haskell 使用parsec检查剩余的输入是否为空白,haskell,parsec,Haskell,Parsec,我正在试用parsec库,不知道如何处理这个基本任务 假设我有以下几点: data Foo = A | AB 我希望字符串“a”被解析为a和“AB”AB。如果我只是这样做: parseA :: parser Foo parseA = do reserved "a" return A parseAB :: parser Foo parseAB = do reserved "a" reserved "b"

我正在试用parsec库,不知道如何处理这个基本任务

假设我有以下几点:

data Foo = A | AB
我希望字符串“a”被解析为
a
和“AB”
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
parseA::parser Foo
parseA=do
保留“a”
归还
parseAB::parser Foo
parseAB=do
保留“a”
保留“b”
返回AB
parseFoo::解析器Foo
parseFoo=parseA
帕塞布

然后
parseFoo
将把“ab”解析为
a
,因为
parseA
并不关心在使用“a”之后是否还有非空白。如何解决这个问题?

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

这应该行得通

parseFoo = try Parse AB <|> parse A
parseFoo=尝试解析AB解析A

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

这应该行得通

parseFoo = try Parse AB <|> parse A
parseFoo=尝试解析AB解析A

对不起,我应该澄清我的
parseAB
工作正常,我遇到问题的是
parseFoo
。啊,明白了。您的语法需要回溯您需要将语法更改为AB | A,并从语法分析中使用
try
。这确实符合我的目的,但现在我想知道如何防止字符串“AB c”作为
AB
进行语法分析?基本上,如果还有剩余的非空白文本,我希望解析失败。你肯定可以在parsec中完成,但更大的问题可能是首先完全定义语法对不起,我应该澄清我的
parseAB
工作正常,我遇到的问题是
parseFoo
。啊,明白了。您的语法需要回溯您需要将语法更改为AB | A,并从语法分析中使用
try
。这确实符合我的目的,但现在我想知道如何防止字符串“AB c”作为
AB
进行语法分析?基本上,我希望如果还有剩余的非空白文本,解析就会失败。你当然可以在parsec中完成,但更大的问题可能是首先完全定义你的语法