以前C++で書いたものをHaskellのParsecで。
まだテストしてないので間違えてるかもしれない。
(2010/02/03追記:やっぱり間違えてた。quoteString
はエスケープしたダブルコーテーションをきちんと処理できない。修正版は後日)
import Text.ParserCombinators.Parsec quoteString = do char '\"' s <- many ( noneOf "\"" <|> char '\\' <|> do { char '\\'; char '\"' } ) char '\"' return $ "\"" ++ s ++ "\"" cStyleComment = do string "/*" manyTill anyChar (try (string "*/")) return " " cxxStyleComment = do string "//" manyTill anyChar (try newline) return "\n" removeComment = many (try quoteString <|> try cStyleComment <|> try cxxStyleComment <|> do { c <- noneOf "\""; return [c] } ) main = do contents <- getContents case (parse removeComment "" contents) of Right result -> putStrLn $ concat result Left err -> print err