summaryrefslogtreecommitdiff
path: root/transfer/compile_to_core.hs
blob: 1f9ea746b65ae75cbdad688de9a7a42127716c42 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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>"