-- {-# LANGUAGE BlockArguments #-} module Main where import qualified Data.ByteString.Lazy as Lbs import Data.Foldable import Frontend.Lexer.Tokens import Frontend.Autogen.Lexer import Frontend.Autogen.Parser import qualified Data.Text.Encoding as T import qualified Data.Text as T import Control.Monad ( unless ) import System.Environment (getArgs) import Text.Show.Pretty (pPrint) import Debug.Trace main :: IO () main = do args <- getArgs for_ args $ \str -> do Main.lex pPrint parseMod =<< Lbs.readFile str testParse :: String -> IO () testParse s = Main.lex print parseMod (Lbs.fromStrict (T.encodeUtf8 (T.pack s))) testLex :: String -> IO () testLex s = Main.lex (const (pure ())) (scan []) (Lbs.fromStrict (T.encodeUtf8 (T.pack s))) lex :: (a -> IO ()) -> Alex a -> Lbs.ByteString -> IO () lex show cont arg = do let x = runAlex arg cont case x of Left e -> print 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) ] case tokenClass tok of TokEof -> pure (reverse acc) _ -> scan (tok:acc)