Abbie's Haskell compiler
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

80 lines
2.0 KiB

-- {-# LANGUAGE BlockArguments #-}
module Main where
import Control.Exception
import qualified Data.Text.Lazy as Lt
import Data.Typeable
import Debug.Trace
import Development.Shake
import Errors
import Frontend.Autogen.Parser
import Frontend.Autogen.Lexer
import Frontend.Lexer.Wrapper
import Frontend.Lexer.Tokens
import GHC.IO.Handle.FD (stdout, handleToFd)
import GHC.IO.FD
import Main.Rules
import System.Environment (getArgs)
import System.Posix.Internals
import Text.Show.Pretty (pPrint)
main :: IO ()
main =
do
args <- getArgs
print args
shake opts (compilerRules args)
`catch` \(ShakeException _ _ some) -> handle some
where
opts =
shakeOptions { shakeFiles = ".ahc-cache"
, shakeVerbosity = Verbose
, shakeProgress = progressDisplay 0.01 putStrLn
}
handle (SomeException e) =
case cast e of
Just x -> printAhcError x
Nothing -> throwIO e
testParse :: String -> IO ()
testParse s = Main.lex "<interactive>" pPrint parseMod (Lt.pack s)
testLex :: String -> IO ()
testLex s = Main.lex "<interactive>" (const (pure ())) (scan []) (Lt.pack s)
lex :: String -> (a -> IO ()) -> Alex a -> Lt.Text -> IO ()
lex fname show cont arg = do
let
x = runAlex fname arg cont
color <- fmap (1 ==) . c_isatty . fdFD =<< handleToFd GHC.IO.Handle.FD.stdout
code <- if fname == "<interactive>"
then pure . lines $ Lt.unpack arg
else lines <$> readFile fname
case x of
Left e -> putStr $ showAhcError color code e
Right x -> show x
scan :: [Token] -> Alex [Token]
scan acc = do
tok <- alexMonadScan
sc <- alexGetStartCode
state <- getUserState
traceM . unlines $
[ "----------------"
, "just lexed: " ++ show tok
, "sc: " ++ show sc
, "sc stack: " ++ show (startCodes state)
, "layout stack: " ++ show (layoutColumns state)
]
case tokenClass tok of
TokEof -> pure (reverse acc)
_ -> scan (tok:acc)