diff options
| author | bringert <bringert@cs.chalmers.se> | 2005-11-30 16:32:13 +0000 |
|---|---|---|
| committer | bringert <bringert@cs.chalmers.se> | 2005-11-30 16:32:13 +0000 |
| commit | 3139bd2a2ef47a7959122328e75256442b802094 (patch) | |
| tree | 62fabe3ecfd4170367f5e55f111fa88f2a6da3a1 /src/Transfer/CompilerAPI.hs | |
| parent | cba2fcb9b118cedb603b171ac7d7581c5adb844c (diff) | |
Transfer compiler now has a search path. Use -ipath to add to the path. Created CompilerAPI.
Diffstat (limited to 'src/Transfer/CompilerAPI.hs')
| -rw-r--r-- | src/Transfer/CompilerAPI.hs | 72 |
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 |
