【发布时间】:2021-11-06 14:41:53
【问题描述】:
我目前正在尝试在 Parsec 中编写一个简单的解析器,但一直遇到有关空格的问题:作为一个最小的示例,我有一个解析器将解析两个字母,两个小写或一个大写和一个小写。我会这样做
testP :: Parser String
testP = do
lookAhead lower
a1 <- lower
a2 <- lower
return [a1,a2]
<|> do
a1 <- upper
a2 <- lower
return [a1,a2]
这对“as”或“Bs”等字符串按预期工作。现在我想在输入字符串的开头处理可能的空格。如果我这样做了
testP :: Parser String
testP = do
spaces
lookAhead lower
a1 <- lower
a2 <- lower
return [a1,a2]
<|> do
a1 <- upper
a2 <- lower
return [a1,a2]
我希望程序现在能够解析“as”和“Bs”,但是对于第二个字符串,我得到一个错误“期望空格或小写字母”。
好的,我认为无论采用哪个选项都会解析空格,但显然不是这样,让我们在第二个选项的开头放置另一个 spaces,如下所示:
testP :: Parser String
testP = do
spaces
lookAhead lower
a1 <- lower
a2 <- lower
return [a1,a2]
<|> do
spaces
a1 <- upper
a2 <- lower
return [a1,a2]
但是,当我尝试解析“Bs”时,这仍然给我同样的错误。我怎么会误解这里的空白处理,我该如何正确地做到这一点?
【问题讨论】: