summaryrefslogtreecommitdiff
path: root/src/Transfer
diff options
context:
space:
mode:
authorbringert <bringert@cs.chalmers.se>2005-11-30 16:32:13 +0000
committerbringert <bringert@cs.chalmers.se>2005-11-30 16:32:13 +0000
commit3139bd2a2ef47a7959122328e75256442b802094 (patch)
tree62fabe3ecfd4170367f5e55f111fa88f2a6da3a1 /src/Transfer
parentcba2fcb9b118cedb603b171ac7d7581c5adb844c (diff)
Transfer compiler now has a search path. Use -ipath to add to the path. Created CompilerAPI.
Diffstat (limited to 'src/Transfer')
-rw-r--r--src/Transfer/CompilerAPI.hs72
1 files changed, 72 insertions, 0 deletions
diff --git a/src/Transfer/CompilerAPI.hs b/src/Transfer/CompilerAPI.hs
new file mode 100644
index 000000000..e1ef32f62
--- /dev/null
+++ b/src/Transfer/CompilerAPI.hs
@@ -0,0 +1,72 @@
+module Transfer.CompilerAPI 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.Directory
+
+
+-- | Compile a source module file to a a code file.
+compileFile :: [FilePath] -- ^ directories to look for imported modules in
+ -> FilePath -- ^ source module file
+ -> IO FilePath -- ^ path to the core file that was written
+compileFile path f = do
+ ds <- loadModule path f
+ s <- compile ds
+ writeFile coreFile s
+ return coreFile
+ where coreFile = replaceFilenameSuffix f "trc"
+
+-- | Compile a self-contained list of declarations to a core program.
+compile :: Monad m => [Decl] -> m String
+compile m = return (printTree $ declsToCore m)
+
+-- | Load a source module file and all its dependencies.
+loadModule :: [FilePath] -- ^ directories to look for imported modules in
+ -> FilePath -- ^ source module file
+ -> IO [Decl]
+loadModule path f =
+ do
+ s <- readFile f
+ Module is ds <- case pModule (myLLexer s) of
+ Bad e -> fail $ "Parse error in " ++ f ++ ": " ++ e
+ Ok m -> return m
+ let deps = [ i | Import (Ident i) <- is ]
+ let path' = directoryOf f : path
+ files <- mapM (findFile path' . (++".tr")) deps
+ dss <- mapM (loadModule path) files
+ return $ concat (dss++[ds])
+
+myLLexer :: String -> [Token]
+myLLexer = resolveLayout True . myLexer
+
+-- | Find a file in one of the given directories.
+-- Fails if the file was not found.
+findFile :: [FilePath] -- ^ directories to look in
+ -> FilePath -- ^ file name to find
+ -> IO FilePath
+findFile path f =
+ do
+ mf <- findFileM path f
+ case mf of
+ Nothing -> fail $ f ++ " not found in path: " ++ show path
+ Just f' -> return f'
+
+-- | Find a file in one of the given directories.
+findFileM :: [FilePath] -- ^ directories to look in
+ -> FilePath -- ^ file name to find
+ -> IO (Maybe FilePath)
+findFileM [] _ = return Nothing
+findFileM (p:ps) f =
+ do
+ let f' = p ++ "/" ++ f
+ e <- doesFileExist f'
+ if e then return (Just f') else findFileM ps f