Haskell 使用parsec检查剩余的输入是否为空白
我正在试用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"
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中完成,但更大的问题可能是首先完全定义你的语法