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) = either print (withSymbolTable output program) $ nameAnalysis program withParsedInput _ (Left errorBundle) = putStrLn $ errorBundlePretty errorBundle withSymbolTable output program symbolTable = let _ = typeAnalysis symbolTable program intermediate' = intermediate symbolTable program instructions = generateCode symbolTable intermediate' in elfObject output $ riscv32Elf instructions