Add support for plugin in different backends
authorDaniel Schwyn <danielschwyn@gmail.com>
Thu, 11 May 2017 15:45:08 +0000 (17:45 +0200)
committerDaniel Schwyn <schwyda@student.ethz.ch>
Tue, 13 Jun 2017 12:20:55 +0000 (14:20 +0200)
Signed-off-by: Daniel Schwyn <schwyda@student.ethz.ch>

tools/sockeye2/Main.hs
tools/sockeye2/SockeyeBackendPrintAST.hs [new file with mode: 0644]

index dbfc07e..2ebb2ce 100644 (file)
@@ -23,18 +23,30 @@ import System.IO
 import SockeyeAST as AST
 import SockeyeParser
 import SockeyeChecker
+import qualified SockeyeBackendPrintAST as PrintAST
+
+{- Compilation targets -}
+data Target = None | PrintAST
 
 {- Possible options for the Sockeye Compiler -}
-data Options = Options { optInputFile :: FilePath }
+data Options = Options { optInputFile :: FilePath
+                       , optTarget    :: Target
+                       }
 
 {- Default options -}
 defaultOptions :: Options
-defaultOptions = Options { optInputFile = ""}
+defaultOptions = Options { optInputFile = ""
+                         , optTarget = None
+                         }
 
 {- Set the input file name -}
 optSetInputFileName :: FilePath -> Options -> Options
 optSetInputFileName f o = o { optInputFile = f }
 
+{- Set the target -}
+optSetTarget :: Target -> Options -> Options
+optSetTarget t o = o { optTarget = t }
+
 {- Prints usage information possibly with usage errors -}
 usage :: [String] -> IO ()
 usage errors = do
@@ -45,7 +57,10 @@ usage errors = do
 {- Setup option parser -}
 options :: [OptDescr (Options -> IO Options)]
 options = 
-    [ Option "h" ["help"]
+    [ Option "P" ["print"]
+        (NoArg (\opts -> return $ optSetTarget PrintAST opts))
+        "Print the AST to the console"
+    , Option "h" ["help"]
         (NoArg (\_ -> do
                     usage []
                     exitWith ExitSuccess))
@@ -75,8 +90,8 @@ parseFile file = do
         Right ast -> return ast
 
 {- Runs the checker -}
-checkAst :: AST.NetSpec -> IO ()
-checkAst ast = do
+checkAST :: AST.NetSpec -> IO ()
+checkAST ast = do
     case checkSockeye ast of 
         [] -> return ()
         errors -> do
@@ -87,11 +102,16 @@ checkAst ast = do
                   in es ++ case key of Nothing     -> errors
                                        Just nodeId -> ("In specification of node '" ++ show nodeId ++ "':"):indented
 
+{- Runs the chosen backend -}
+runBackend :: Target -> AST.NetSpec -> IO ()
+runBackend None     = \_ -> return ()
+runBackend PrintAST = PrintAST.compile
+
 main = do
     args <- getArgs
     opts <- compilerOpts args
     let inFile = optInputFile opts
     ast <- parseFile inFile
-    checkAst ast
-    print ast
+    checkAST ast
+    runBackend (optTarget opts) ast
     
\ No newline at end of file
diff --git a/tools/sockeye2/SockeyeBackendPrintAST.hs b/tools/sockeye2/SockeyeBackendPrintAST.hs
new file mode 100644 (file)
index 0000000..d22bbf3
--- /dev/null
@@ -0,0 +1,22 @@
+{-
+  SockeyeBackendPrintAST.hs: Backend for printing the AST for Sockeye
+
+  Part of Sockeye
+
+  Copyright (c) 2017, ETH Zurich.
+
+  All rights reserved.
+
+  This file is distributed under the terms in the attached LICENSE file.
+  If you do not find this file, copies can be found by writing to:
+  ETH Zurich D-INFK, CAB F.78, Universitaetstr. 6, CH-8092 Zurich,
+  Attn: Systems Group.
+-}
+
+module SockeyeBackendPrintAST
+( compile ) where
+
+import qualified SockeyeAST as AST
+
+compile :: AST.NetSpec -> IO ()
+compile ast = print ast