我试图在 Haskell 中使用 parsec 编写解析器,特别是回溯是如何工作的。
采用以下简单的解析器:
import Text.Parsec
type Parser = Parsec String () String
parseConst :: Parser
parseConst = do {
x <- many digit;
return $ read x
}
parseAdd :: Parser
parseAdd = do {
l <- parseExp;
char '+';
r <- parseExp;
return $ l <> "+" <> r
}
parseExp :: Parser
parseExp = try parseConst <|> parseAdd
pp :: Parser
pp = parseExp <* eof
test = parse pp "" "1+1"
test有价值
Left (line 1, column 2):
unexpected '+'
expecting digit or end of input
在我看来,这应该会成功,因为我try在parseConst.parseExp
我错过了什么?我也对如何自己调试的指针感兴趣,我尝试使用parserTraced它让我得出结论,它确实不是回溯。
PS。我知道这是编写表达式解析器的一种糟糕的方式,但我想了解它为什么不起作用。