3

私はこれをたくさん持っています:

comment :: GenParser Char st ()
comment =
    (string "--" >> manyTill anyChar newline >> spaces >> return ()) <|>
    (string "/*" >> manyTill anyChar (string "*/") >> spaces >> return ())

eatComments :: GenParser Char st String
eatComments = do
  xs <- many (do
          optional comment
          x <- manyTill anyChar (try comment)
          return x)
  return $ intercalate " " xs

これは、入力がコメントで終わっている場合は機能しますが、それ以外で終わっている場合は失敗します。その場合、エラーメッセージは次のようになります

No match (line 13, column 1):
unexpected end of input
expecting "--" or "/*"

そのため、パーサーは、eof到着するまでにコメントを探しています。考えられるすべてのケースですべてのコメントを使い果たすために必要な適切なコンビネータを見つける手助けが必要です。

4

2 に答える 2

3

たぶんeofのようなものを使用しますか?

comment :: GenParser Char st ()
comment =
    (string "--" >> manyTill anyChar newline >> spaces >> return ()) <|>
    (string "/*" >> manyTill anyChar ((try (string "*/") >> return ()) <|> eof) >> spaces >> return ())
于 2012-10-17T18:21:48.010 に答える
0

私はうまくいくと思われるこれを思いつきました。しかし、自由に批判してください:

comment :: GenParser Char st ()
comment =
    (string "--" >> manyTill anyChar newline >> spaces >> return ()) <|>
    (string "/*" >> manyTill anyChar (string "*/") >>  spaces >> return ())

notComment = manyTill anyChar (lookAhead (comment <|> eof))

eatComments :: GenParser Char st String
eatComments = do
  optional comment
  xs <- sepBy notComment comment
  optional comment
  return $ intercalate "" xs
于 2012-10-17T19:09:09.623 に答える