■
Parsec分からん。まあろくに説明も読まずに使っているけれど、なんでこれでCのexpressionがうまくパース出来ないのでしょう…ちゃんと解説読むか…
module Main where import Text.ParserCombinators.Parsec main = do src <- getContents putStrLn $ makeSrc src makeSrc :: String -> String makeSrc src = case parse expression "" src of Right madeSrc -> madeSrc Left err -> show err expression :: Parser String expression = assignment_expression <|> do a <- expression b <- string "," c <- assignment_expression return $ a ++ b ++ c assignment_expression = conditional_expression <|> do a <- unary_expression b <- assignment_operator c <- assignment_expression return $ a ++ b ++ c assignment_operator = string "=" <|> string "*=" <|> string "/=" <|> string "%=" <|> string "+=" <|> string "-=" <|> string "<<=" <|> string ">>=" <|> string "&=" <|> string "^=" <|> string "|=" conditional_expression = logical_OR_expression <|> do a <- logical_OR_expression b <- string "?" c <- expression d <- string ":" e <- conditional_expression return $ a ++ b ++ c ++ d ++ e constant_expression = conditional_expression logical_OR_expression = logical_AND_expression <|> do a <- logical_OR_expression b <- string "||" c <- logical_AND_expression return $ a ++ b ++ c logical_AND_expression = inclusive_OR_expression <|> do a <- logical_AND_expression b <- string "&&" c <- inclusive_OR_expression return $ a ++ b ++ c inclusive_OR_expression = exclusive_OR_expression <|> do a <- inclusive_OR_expression b <- string "|" c <- exclusive_OR_expression return $ a ++ b ++ c exclusive_OR_expression = aND_expression <|> do a <- inclusive_OR_expression b <- string "^" c <- aND_expression return $ a ++ b ++ c aND_expression = equality_expression <|> do a <- aND_expression b <- string "&" c <- equality_expression return $ a ++ b ++ c equality_expression = relational_expression <|> do a <- equality_expression b <- string "==" c <- relational_expression return $ a ++ b ++ c <|> do a <- equality_expression b <- string "!=" c <- relational_expression return $ a ++ b ++ c relational_expression = shift_expression <|> do a <- relational_expression b <- string "<" c <- shift_expression return $ a ++ b ++ c <|> do a <- relational_expression b <- string ">" c <- shift_expression return $ a ++ b ++ c <|> do a <- relational_expression b <- string "<=" c <- shift_expression return $ a ++ b ++ c <|> do a <- relational_expression b <- string ">=" c <- shift_expression return $ a ++ b ++ c shift_expression = additive_expression <|> do a <- shift_expression b <- string "<<" c <- additive_expression return $ a ++ b ++ c <|> do a <- shift_expression b <- string ">>" c <- additive_expression return $ a ++ b ++ c additive_expression = multiplicative_expression <|> do a <- additive_expression b <- string "+" c <- multiplicative_expression return $ a ++ b ++ c <|> do a <- additive_expression b <- string "-" c <- multiplicative_expression return $ a ++ b ++ c multiplicative_expression = cast_expression <|> do a <- multiplicative_expression b <- string "*" c <- cast_expression return $ a ++ b ++ c <|> do a <- multiplicative_expression b <- string "/" c <- cast_expression return $ a ++ b ++ c <|> do a <- multiplicative_expression b <- string "%" c <- cast_expression return $ a ++ b ++ c cast_expression = unary_expression -- also cast unary_expression = postfix_expression -- also something postfix_expression = primary_expression -- also something primary_expression = identifier <|> do char '(' a <- expression char ')' return $ "(" ++ a ++ ")" -- also something identifier = do spaces a <- many1 alphaNum --also underbar spaces return a