我正在Parsec玩一个未完成的解析器,用于类似Haskell的语言。
它似乎工作正常,但我对错误消息不满意。
"foo (bar"
expecting letter or digit, operand or ")"
如何才能将其打印为expecting operand or ")"
?我尝试添加<?>
但无法使其正常工作。
这是我的代码:
separator = skipMany1 space
<?> ""
identifier :: Parser String
identifier = (:) <$> letter <*> many alphaNum
<?> "identifier"
number :: Parser String
number = many1 digit
<?> "numeric literal"
primitiveExpr :: Parser String
primitiveExpr = (identifier
<|> number)
<?> "primitive expression"
expr :: Parser ()
expr = do identifier
spaces <?> ""
sepBy operand separator
return ()
parenExpr :: Parser String
parenExpr = do char '('
expr
char ')'
return "foo"
<?> "parenthesized expression"
operand = parenExpr <|> primitiveExpr
<?> "operand"
答案 0 :(得分:3)
我想出了如何获得理想的行为。它是由alphaNum
:
identifier = (:) <$> letter <*> (many alphaNum <?> "")
<?> "identifier"
由于"bar"
可以继续被解析为标识符。