summaryrefslogtreecommitdiff
path: root/src/Main.hs
blob: 456c5adb4173b334693f029019616debfa872bf5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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.Allocator (allocate)
import Language.Elna.Parser (programP)
import Language.Elna.NameAnalysis (nameAnalysis)
import Language.Elna.TypeAnalysis (typeAnalysis)
import Language.Elna.Intermediate (intermediate)
import Language.Elna.CodeGenerator (generateRiscV, riscVConfiguration)
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
                $ intermediate symbolTable program
         in elfObject output
            $ riscv32Elf instructions