4

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

1 回答 1

3

我想出了如何获得所需的行为。它是由以下原因引起的alphaNum

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

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

于 2012-02-03T02:57:30.667 回答