module Main ( main ) where import Language.Elna.CommandLine (CommandLine(..), commandLine, execParser) import Language.Elna.Object.Elf (elfObject) import Language.Elna.Backend.Allocator (allocate) import Language.Elna.Glue (glue) import Language.Elna.Frontend.NameAnalysis (nameAnalysis) import Language.Elna.Frontend.Parser (programP) import Language.Elna.Frontend.TypeAnalysis (typeAnalysis) import Language.Elna.RiscV.CodeGenerator (generateRiscV, riscVConfiguration) import Language.Elna.RiscV.ElfWriter (riscv32Elf) import Data.Maybe (fromMaybe) import System.FilePath (replaceExtension, takeFileName) import Text.Megaparsec (runParser, errorBundlePretty) import qualified Data.Text.IO as Text main :: IO () main = execParser commandLine >>= withCommandLine where withCommandLine CommandLine{..} = let defaultOutput = flip fromMaybe output $ replaceExtension (takeFileName input) "o" in Text.readFile input >>= withParsedInput defaultOutput . runParser programP input withParsedInput output (Right program) = either print (withSymbolTable output program) $ nameAnalysis program withParsedInput _ (Left errorBundle) = putStrLn $ errorBundlePretty errorBundle withSymbolTable output program symbolTable = let _ = typeAnalysis symbolTable program instructions = generateRiscV $ allocate riscVConfiguration $ glue symbolTable program in elfObject output $ riscv32Elf instructions