如何从此Parsec错误中删除“期待字母或数字”?

时间:2012-02-03 02:37:52

标签: haskell parsec

我正在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"

1 个答案:

答案 0 :(得分:3)

我想出了如何获得理想的行为。它是由alphaNum

引起的
identifier = (:) <$> letter <*> (many alphaNum <?> "")
         <?> "identifier"

由于"bar"可以继续被解析为标识符。