在未提交故障时恢复输入时解析冗余括号

问题描述 投票:4回答:1

我已经在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应该解析:

  1. “((((number 5)))”,“ number 5”,“(number 5)”都应解析为整数5,并消耗所有内容,
  2. “(5)”应该什么也不消耗(甚至不带括号)并且失败
  3. “(数字abc)”,“数字cde”应该失败并消耗输入。

[我已经在Haskell的parsec库中为一种类似Lisp的语言编写了一个解析器,我想改善它的错误消息,但是我陷于以下情况:p ::解析器整数p = do ...

haskell parsec
1个回答
0
投票

我想编写一个上面的函数parens,它只消耗输入,如果parser p消耗输入。

© www.soinside.com 2019 - 2024. All rights reserved.