4

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

1 に答える 1

3

目的の動作を取得する方法を見つけました。原因alphaNum:

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

"bar"識別子として引き続き解析される可能性があるため。

于 2012-02-03T02:57:30.667 に答える