2012-02-03 9 views
4

私はハスケルのような言葉のための未完成のパーサーでParsecで遊んでいます。このParsecエラーから "expecting letter or digit"を取り除くにはどうしたらいいですか?

エラーメッセージが表示されない場合でも、正常に動作しているようです。

  • 入力:"foo (bar"
  • エラー:私はそれだけでexpecting operand or ")"を印刷するために得ることができますどのようexpecting letter or digit, 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"識別子として解析され続ける可能性があるため。

関連する問題