2012-02-03 50 views
4

我在Parsec中玩弄了一个Haskell式语言的未完成解析器。如何从此Parsec错误中删除“期待的字母或数字”?

它似乎工作正常,虽然我不满意的错误消息。

  • 输入:"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" 

回答

3

我想出如何获得所需的行为。它是造成alphaNum

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

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