module Main ( main ) where import Language.Elna.CommandLine (CommandLine(..), commandLine, execParser) import Language.Elna.PrinterWriter (riscv32Elf) import Language.Elna.Object.Elf (elfObject) import Language.Elna.Parser (programP) import Language.Elna.NameAnalysis (nameAnalysis) import Language.Elna.TypeAnalysis (typeAnalysis) import Language.Elna.Intermediate (intermediate) import Language.Elna.CodeGenerator (generateCode) 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) = let symbolTable = nameAnalysis program _ = typeAnalysis symbolTable program intermediate' = intermediate symbolTable program in elfObject output $ riscv32Elf $ generateCode symbolTable intermediate' withParsedInput _ (Left errorBundle) = putStrLn $ errorBundlePretty errorBundle