如何从此Parsec错误中删除"expecting letter or digit"?



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

我发现了如何获得所需的行为。由alphaNum:引起

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

由于CCD_ 6可以继续被解析为标识符。

相关内容

最新更新