1
Fork 0
simple-sql-parser/tools/SimpleSqlParserTool.lhs

94 lines
2.7 KiB
Plaintext

Simple command line tool to experiment with simple-sql-parser
Commands:
parse: parse sql from file, stdin or from command line
lex: lex sql same
indent: parse then pretty print sql
> {-# LANGUAGE TupleSections #-}
> import System.Environment
> import Control.Monad
> import Data.Maybe
> import System.Exit
> import Data.List
> import Text.Show.Pretty
> --import Control.Applicative
> import Language.SQL.SimpleSQL.Pretty
> import Language.SQL.SimpleSQL.Parse
> import Language.SQL.SimpleSQL.Lex
> main :: IO ()
> main = do
> args <- getArgs
> case args of
> [] -> do
> showHelp $ Just "no command given"
> (c:as) -> do
> let cmd = lookup c commands
> maybe (showHelp (Just "command not recognised"))
> (\(_,cmd') -> cmd' as)
> cmd
> commands :: [(String, (String,[String] -> IO ()))]
> commands =
> [("help", helpCommand)
> ,("parse", parseCommand)
> ,("lex", lexCommand)
> ,("indent", indentCommand)]
> showHelp :: Maybe String -> IO ()
> showHelp msg = do
> maybe (return ()) (\e -> putStrLn $ "Error: " ++ e) msg
> putStrLn "Usage:\n SimpleSqlParserTool command args"
> forM_ commands $ \(c, (h,_)) -> do
> putStrLn $ c ++ "\t" ++ h
> when (isJust msg) $ exitFailure
> helpCommand :: (String,[String] -> IO ())
> helpCommand =
> ("show help for this progam", \_ -> showHelp Nothing)
> getInput :: [String] -> IO (FilePath,String)
> getInput as =
> case as of
> ["-"] -> ("",) <$> getContents
> ("-c":as') -> return ("", unwords as')
> [filename] -> (filename,) <$> readFile filename
> _ -> showHelp (Just "arguments not recognised") >> error ""
> parseCommand :: (String,[String] -> IO ())
> parseCommand =
> ("parse SQL from file/stdin/command line (use -c to parse from command line)"
> ,\args -> do
> (f,src) <- getInput args
> either (error . peFormattedError)
> (putStrLn . ppShow)
> $ parseStatements ansi2011 f Nothing src
> )
> lexCommand :: (String,[String] -> IO ())
> lexCommand =
> ("lex SQL from file/stdin/command line (use -c to parse from command line)"
> ,\args -> do
> (f,src) <- getInput args
> either (error . peFormattedError)
> (putStrLn . intercalate ",\n" . map show)
> $ lexSQL ansi2011 f Nothing src
> )
> indentCommand :: (String,[String] -> IO ())
> indentCommand =
> ("parse then pretty print SQL from file/stdin/command line (use -c to parse from command line)"
> ,\args -> do
> (f,src) <- getInput args
> either (error . peFormattedError)
> (putStrLn . prettyStatements ansi2011)
> $ parseStatements ansi2011 f Nothing src
> )