summaryrefslogtreecommitdiff
path: root/transfer/compile_to_core.hs
diff options
context:
space:
mode:
authorbringert <bringert@cs.chalmers.se>2005-11-25 16:36:19 +0000
committerbringert <bringert@cs.chalmers.se>2005-11-25 16:36:19 +0000
commitdbe8e61acc616b8f5ac07e8df89eb98a7997c29d (patch)
tree6e379f18986fc60f5606e023def46abdf770dca5 /transfer/compile_to_core.hs
parentfe2731e5f8e301b5a0169bf8b667bb6c13bae80b (diff)
Move transfer into the GF repo.
Diffstat (limited to 'transfer/compile_to_core.hs')
-rw-r--r--transfer/compile_to_core.hs52
1 files changed, 52 insertions, 0 deletions
diff --git a/transfer/compile_to_core.hs b/transfer/compile_to_core.hs
new file mode 100644
index 000000000..1f9ea746b
--- /dev/null
+++ b/transfer/compile_to_core.hs
@@ -0,0 +1,52 @@
+module Main where
+
+import Transfer.Syntax.Lex
+import Transfer.Syntax.Par
+import Transfer.Syntax.Print
+import Transfer.Syntax.Abs
+import Transfer.Syntax.Layout
+
+import Transfer.ErrM
+import Transfer.SyntaxToCore
+
+import Transfer.PathUtil
+
+import System.Environment
+import System.Exit
+import System.IO
+
+import Debug.Trace
+
+myLLexer = resolveLayout True . myLexer
+
+compile :: Monad m => [Decl] -> m String
+compile m = return (printTree $ declsToCore m)
+
+loadModule :: FilePath -> IO [Decl]
+loadModule f =
+ do
+ s <- readFile f
+ Module is ds <- case pModule (myLLexer s) of
+ Bad e -> die $ "Parse error in " ++ f ++ ": " ++ e
+ Ok m -> return m
+ let dir = directoryOf f
+ deps = [ replaceFilename f i ++ ".tr" | Import (Ident i) <- is ]
+ dss <- mapM loadModule deps
+ return $ concat (ds:dss)
+
+die :: String -> IO a
+die s = do
+ hPutStrLn stderr s
+ exitFailure
+
+coreFile :: FilePath -> FilePath
+coreFile f = replaceFilenameSuffix f "trc"
+
+compileFile :: FilePath -> IO String
+compileFile f = loadModule f >>= compile
+
+main :: IO ()
+main = do args <- getArgs
+ case args of
+ [f] -> compileFile f >>= writeFile (coreFile f)
+ _ -> die "Usage: compile_to_core <file>"