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.

68 lines
1.9 KiB

  1. -- {-# LANGUAGE BlockArguments #-}
  2. module Main where
  3. import Control.Monad ( unless )
  4. import qualified Data.ByteString.Lazy as Lbs
  5. import qualified Data.Text.Encoding as T
  6. import qualified Data.Text as T
  7. import Data.Foldable
  8. import Debug.Trace
  9. import Frontend.Autogen.Parser
  10. import Frontend.Autogen.Lexer
  11. import Frontend.Lexer.Wrapper
  12. import Frontend.Lexer.Tokens
  13. import System.Environment (getArgs)
  14. import Text.Show.Pretty (pPrint)
  15. import Frontend.Parser.Posn
  16. import System.Posix.Internals
  17. import GHC.IO.Handle.FD (stdout, handleToFd)
  18. import GHC.IO.FD
  19. import Data.Maybe (fromMaybe)
  20. import Errors
  21. main :: IO ()
  22. main = do
  23. args <- getArgs
  24. for_ args $ \str -> do
  25. Main.lex str (\_ -> putStrLn $ str ++ " parsed!") parseMod =<< Lbs.readFile str
  26. testParse :: String -> IO ()
  27. testParse s = Main.lex "<interactive>" pPrint parseMod (Lbs.fromStrict (T.encodeUtf8 (T.pack s)))
  28. testLex :: String -> IO ()
  29. testLex s = Main.lex "<interactive>" (const (pure ())) (scan []) (Lbs.fromStrict (T.encodeUtf8 (T.pack s)))
  30. lex :: String -> (a -> IO ()) -> Alex a -> Lbs.ByteString -> IO ()
  31. lex fname show cont arg = do
  32. let
  33. x = runAlex fname arg cont
  34. color <- fmap (1 ==) . c_isatty . fdFD =<< handleToFd GHC.IO.Handle.FD.stdout
  35. code <- if fname == "<interactive>"
  36. then pure . lines $ T.unpack (T.decodeUtf8 (Lbs.toStrict arg))
  37. else lines <$> readFile fname
  38. case x of
  39. Left e -> putStr $ showAhcError color code e
  40. Right x -> show x
  41. scan :: [Token] -> Alex [Token]
  42. scan acc = do
  43. tok <- alexMonadScan
  44. sc <- alexGetStartCode
  45. state <- getUserState
  46. traceM . unlines $
  47. [ "----------------"
  48. , "just lexed: " ++ show tok
  49. , "sc: " ++ show sc
  50. , "sc stack: " ++ show (startCodes state)
  51. , "layout stack: " ++ show (layoutColumns state)
  52. ]
  53. case tokenClass tok of
  54. TokEof -> pure (reverse acc)
  55. _ -> scan (tok:acc)