我已经在Haskell的parsec库中为一种类似Lisp的语言编写了一个解析器,我想改善其错误消息,但是我陷入了以下情况:
p :: Parser Integer
p = do
try (string "number") <|> fail mempty
space
integer
parens :: Parser a -> Parser a
parens p = do
char '('
v <- p
char ')'
return v
finalParser p = p <|> (parens finalParser)
因此,解析器p
在错误方面表现得很好,直到看到关键字“ number”,它才提交并使用输入。成功解析关键字后,将不会在失败时恢复其输入。如果使用<|>
运算符将此解析器与其他解析器组合,并且解析了关键字,它将显示p
的错误消息,而不尝试下一个解析器。
已经parens p
不再具有此属性。
如果解析器parens
使用输入,我想编写一个仅使用输入的函数p
。>
以下是我尝试实现的一些行为示例。 finalParser应该解析:
[我已经在Haskell的parsec库中为一种类似Lisp的语言编写了一个解析器,我想改善它的错误消息,但是我陷于以下情况:p ::解析器整数p = do ...
我想编写一个上面的函数
parens
,它只消耗输入,如果parser p
消耗输入。