MiniJavaCompiler/src/Main.hs

33 lines
987 B
Haskell
Raw Normal View History

2024-05-01 19:07:04 +00:00
module Main where
2024-05-07 07:53:16 +00:00
import Typecheck
2024-05-08 13:23:18 +00:00
import Parser.Lexer (alexScanTokens)
import Parser.JavaParser
2024-06-14 06:52:06 +00:00
import ByteCode.Builder
2024-05-08 13:23:18 +00:00
import ByteCode.ClassFile
import Data.ByteString (pack, writeFile)
import System.Environment
import System.FilePath.Posix (takeDirectory)
2024-05-01 19:07:04 +00:00
main = do
args <- getArgs
2024-06-14 06:52:06 +00:00
let filename = if null args
then error "Missing filename, I need to know what to compile"
2024-06-21 07:03:47 +00:00
else head args
let outputDirectory = takeDirectory filename
print ("Compiling " ++ filename)
file <- readFile filename
2024-05-14 11:20:37 +00:00
let untypedAST = parse $ alexScanTokens file
2024-06-21 07:03:47 +00:00
let typedAST = typeCheckCompilationUnit untypedAST
let assembledClasses = map (`classBuilder` emptyClassFile) typedAST
2024-05-08 13:23:18 +00:00
2024-06-21 07:03:47 +00:00
mapM_ (\classFile -> let
fileContent = pack (serialize classFile)
2024-06-21 07:03:47 +00:00
fileName = outputDirectory ++ "/" ++ className classFile ++ ".class"
in Data.ByteString.writeFile fileName fileContent
2024-06-21 07:03:47 +00:00
) assembledClasses