【发布时间】:2020-12-22 06:34:30
【问题描述】:
我正在尝试在 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
在我看来,这应该会成功,因为我在 parseConst 的定义中使用了 try 组合子 parseExp。
我错过了什么?我也对如何自己调试这个指针感兴趣,我尝试使用parserTraced,这让我得出结论,它确实没有回溯。
附言。 我知道这是一种编写表达式解析器的糟糕方法,但我想了解它为什么不起作用。
【问题讨论】:
-
try使parseExpr在parseConst失败时尝试使用原始输入parseAdd。但是在这种情况下,parseConst成功解析了1,所以这个try什么都不做。