c7cfad53380d4340c633f0191c4ceafd31558ca0
[barrelfish] / tools / sockeye2 / Main.hs
1 {-
2   SockeyeMain.hs: Sockeye
3
4   Copyright (c) 2017, ETH Zurich.
5
6   All rights reserved.
7
8   This file is distributed under the terms in the attached LICENSE file.
9   If you do not find this file, copies can be found by writing to:
10   ETH Zurich D-INFK, CAB F.78, Universitaetstr. 6, CH-8092 Zurich,
11   Attn: Systems Group.
12 -}
13
14 module Main where
15
16 import Control.Monad
17 import System.Console.GetOpt
18 import System.Exit
19 import System.Environment
20 import System.IO
21
22 import SockeyeAST as AST
23 import SockeyeParser
24
25 {- Possible options for the Sockeye Compiler -}
26 data Options = Options { optInputFile :: FilePath }
27
28 {- Default options -}
29 defaultOptions :: Options
30 defaultOptions = Options { optInputFile = ""}
31
32 {- Set the input file name -}
33 optSetInputFileName :: FilePath -> Options -> Options
34 optSetInputFileName f o = o { optInputFile = f }
35
36 {- Prints usage information possibly with usage errors -}
37 usage :: [String] -> IO ()
38 usage errors = do
39     prg <- getProgName
40     let usageString = "Usage: " ++ prg ++ " [options] file\nOptions:"
41         in hPutStrLn stderr (usageInfo (concat errors ++ usageString) options)
42
43 {- Setup option parser -}
44 options :: [OptDescr (Options -> IO Options)]
45 options = 
46     [ Option "h" ["help"]
47         (NoArg (\_ -> do
48                     usage []
49                     exitWith ExitSuccess))
50         "Show help"
51     ]
52
53 {- evaluates the compiler options -}
54 compilerOpts :: [String] -> IO (Options)
55 compilerOpts argv =
56     case getOpt Permute options argv of
57         (actions, [f], []) -> liftM (optSetInputFileName f) $ foldl (>>=) (return defaultOptions) actions
58         (actions, [], [])  -> usage ["No input file\n"] >> exitWith (ExitFailure 1)
59         (_, _, errors)     -> usage errors >> exitWith (ExitFailure 1)
60
61 {- Runs the parser -}
62 parseFile :: FilePath -> IO (AST.NetSpec)
63 parseFile file = do
64     src <- readFile file
65     case parseSockeye file src of
66         Left err -> hPutStrLn stderr ("Parse error at " ++ show err) >> exitWith (ExitFailure 2)
67         Right ast -> return ast
68
69 main = do
70     args <- getArgs
71     opts <- compilerOpts args
72     let inFile = optInputFile opts
73     ast <- parseFile inFile
74     print ast
75