1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | choosing = choice . trying infixr 0 // f // x = return $ f x literal :: GenParser Char st Expr literal = choosing [ do b <- choosing [ string "true" >> return True , string "false" >> return False] LitE// OBool b <?> "boolean" , choosing [ do a <- many1 digit char '.' b <- many digit LitE// ONum (read (a ++ "." ++ b) :: ℝ) , do a <- many1 digit LitE// ONum (read a :: ℝ) ] <?> "number" , do string "\"" strlit <- many $ choosing [ string "\\\"" >> return '\"' , string "\\n" >> return '\n' , noneOf "\"\n"] string "\"" LitE// OString strlit <?> "string" ] <?> "literal" |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | literal :: GenParser Char st Expr literal = ("literal" ?:) $ "boolean" ?: do b <- (string "true" >> return True ) *<|> (string "false" >> return False) return $ LitE $ OBool b *<|> "number" ?: ( do a <- many1 digit char '.' b <- many digit return $ LitE $ ONum (read (a ++ "." ++ b) :: ℝ) *<|> do a <- many1 digit return $ LitE $ ONum (read a :: ℝ) ) *<|> "string" ?: do string "\"" strlit <- many $ (string "\\\"" >> return '\"') *<|> (string "\\n" >> return '\n') *<|> ( noneOf "\"\n") string "\"" return $ LitE $ OString strlit |
19:35: Warning: Redundant bracket
Found:
(string "\\\"" >> return '"') *<|> (string "\\n" >> return '\n')
*<|> (noneOf "\"\n")
Why not:
(string "\\\"" >> return '"') *<|> (string "\\n" >> return '\n')
*<|> noneOf "\"\n"
1 2 3 4 5 | -- forgot to add this doubtful definition, or something like it trying [] = [] trying [x] = [x] trying [x,y] = [try x , y] trying (x:xs) = try x : trying xs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | {-#LANGUAGE RebindableSyntax,CPP#-} import Text.ParserCombinators.Parsec import Control.Applicative ((*>),(<*),(<$)) import Prelude #define parsing let ((>>),(>>=)) = ((>>>>),(>>>=)) #define attempts let x >> y = try x <|> y literal :: GenParser Char st Expr literal = do attempts do parsing b <- do attempts True <$ string "true" False <$ string "false" OBool// b <?> "boolean" do attempts do parsing a <- many1 digit <* char '.' b <- many digit ONum// (read (a ++ "." ++ b) :: Double) do parsing a <- many1 digit ONum// (read a :: Double) <?> "number" do parsing string "\"" strlit <- many $ do attempts '\"' <$ string "\\\"" '\n' <$ string "\\n" noneOf "\"\n" string "\"" OString// strlit <?> "string" <?> "literal" infixr 1 // f // x = return (f x) data Expr = ONum Double | OString String | OBool Bool (>>>=) :: GenParser a b c -> (c -> GenParser a b d) -> GenParser a b d (>>>>) :: GenParser a b c -> GenParser a b d -> GenParser a b d ((>>>=),(>>>>)) = ((>>=),(>>)) |