summaryrefslogtreecommitdiff
path: root/src/Main.hs
blob: 872cad9fe05797ebbce1cf0aaa0246bb4b98dafb (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
module Main
    ( main
    ) where

import Language.Elna.CommandLine (CommandLine(..), commandLine, execParser)
import Language.Elna.PrinterWriter (riscv32Elf, riscv32Header)
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 riscv32Header
            $ riscv32Elf
            $ generateCode symbolTable intermediate'
    withParsedInput _ (Left errorBundle) = putStrLn
        $ errorBundlePretty errorBundle