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.

51 lines
1.3 KiB

  1. -- {-# LANGUAGE BlockArguments #-}
  2. module Main where
  3. import qualified Data.ByteString.Lazy as Lbs
  4. import Data.Foldable
  5. import Frontend.Lexer.Tokens
  6. import Frontend.Autogen.Lexer
  7. import Frontend.Autogen.Parser
  8. import qualified Data.Text.Encoding as T
  9. import qualified Data.Text as T
  10. import Control.Monad ( unless )
  11. import System.Environment (getArgs)
  12. import Text.Show.Pretty (pPrint)
  13. import Debug.Trace
  14. main :: IO ()
  15. main = do
  16. args <- getArgs
  17. for_ args $ \str -> do
  18. Main.lex pPrint parseMod =<< Lbs.readFile str
  19. testParse :: String -> IO ()
  20. testParse s = Main.lex print parseMod (Lbs.fromStrict (T.encodeUtf8 (T.pack s)))
  21. testLex :: String -> IO ()
  22. testLex s = Main.lex (const (pure ())) (scan []) (Lbs.fromStrict (T.encodeUtf8 (T.pack s)))
  23. lex :: (a -> IO ()) -> Alex a -> Lbs.ByteString -> IO ()
  24. lex show cont arg = do
  25. let x = runAlex arg cont
  26. case x of
  27. Left e -> print e
  28. Right x -> show x
  29. scan :: [Token] -> Alex [Token]
  30. scan acc = do
  31. tok <- alexMonadScan
  32. sc <- alexGetStartCode
  33. state <- getUserState
  34. traceM . unlines $
  35. [ "----------------"
  36. , "just lexed: " ++ show tok
  37. , "sc: " ++ show sc
  38. , "sc stack: " ++ show (startCodes state)
  39. ]
  40. case tokenClass tok of
  41. TokEof -> pure (reverse acc)
  42. _ -> scan (tok:acc)