diff options
| author | bringert <bringert@cs.chalmers.se> | 2005-11-25 16:36:19 +0000 |
|---|---|---|
| committer | bringert <bringert@cs.chalmers.se> | 2005-11-25 16:36:19 +0000 |
| commit | dbe8e61acc616b8f5ac07e8df89eb98a7997c29d (patch) | |
| tree | 6e379f18986fc60f5606e023def46abdf770dca5 /transfer/compile_to_core.hs | |
| parent | fe2731e5f8e301b5a0169bf8b667bb6c13bae80b (diff) | |
Move transfer into the GF repo.
Diffstat (limited to 'transfer/compile_to_core.hs')
| -rw-r--r-- | transfer/compile_to_core.hs | 52 |
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>" |
