elna/src/Main.hs

40 lines
1.5 KiB
Haskell
Raw Normal View History

module Main
( main
) where
2024-07-21 16:15:17 +02:00
2024-09-05 23:18:48 +02:00
import Language.Elna.CommandLine (CommandLine(..), commandLine, execParser)
2024-09-12 02:21:48 +02:00
import Language.Elna.PrinterWriter (riscv32Elf)
2024-09-08 02:08:13 +02:00
import Language.Elna.Object.Elf (elfObject)
2024-10-01 00:02:19 +02:00
import Language.Elna.Allocator (allocate)
2024-09-08 02:08:13 +02:00
import Language.Elna.Parser (programP)
import Language.Elna.NameAnalysis (nameAnalysis)
import Language.Elna.TypeAnalysis (typeAnalysis)
import Language.Elna.Intermediate (intermediate)
2024-10-01 00:02:19 +02:00
import Language.Elna.CodeGenerator (generateRiscV, riscVConfiguration)
2024-09-05 23:18:48 +02:00
import Data.Maybe (fromMaybe)
import System.FilePath (replaceExtension, takeFileName)
2024-09-08 02:08:13 +02:00
import Text.Megaparsec (runParser, errorBundlePretty)
import qualified Data.Text.IO as Text
main :: IO ()
2024-09-05 23:18:48 +02:00
main = execParser commandLine >>= withCommandLine
where
withCommandLine CommandLine{..} =
2024-09-08 02:08:13 +02:00
let defaultOutput = flip fromMaybe output
$ replaceExtension (takeFileName input) "o"
in Text.readFile input
>>= withParsedInput defaultOutput
. runParser programP input
withParsedInput output (Right program) =
2024-09-20 13:32:24 +02:00
either print (withSymbolTable output program)
$ nameAnalysis program
2024-09-08 02:08:13 +02:00
withParsedInput _ (Left errorBundle) = putStrLn
$ errorBundlePretty errorBundle
2024-09-20 13:32:24 +02:00
withSymbolTable output program symbolTable =
let _ = typeAnalysis symbolTable program
2024-10-01 00:02:19 +02:00
instructions = generateRiscV
$ allocate riscVConfiguration
$ intermediate symbolTable program
2024-09-20 13:32:24 +02:00
in elfObject output
$ riscv32Elf instructions