rc #13

Merged
crumbtoo merged 196 commits from dev into main 2024-02-13 13:22:23 -07:00
7 changed files with 75 additions and 60 deletions
Showing only changes of commit dda0e17358 - Show all commits

14
app/CoreDriver.hs Normal file
View File

@@ -0,0 +1,14 @@
module CoreDriver
( driver
)
where
--------------------------------------------------------------------------------
driver :: RLPCIO ()
driver = undefined
parseProg :: RLPCOptions
-> Text
-> (Maybe Program', [MsgEnvelope RlpcError])
parseProg o = lexCoreR >=> parseCoreProgR

View File

@@ -10,12 +10,16 @@ import Data.HashSet qualified as S
import Data.Text (Text) import Data.Text (Text)
import Data.Text qualified as T import Data.Text qualified as T
import Data.Text.IO qualified as TIO import Data.Text.IO qualified as TIO
import Data.List
import System.IO import System.IO
import System.Exit (exitSuccess) import System.Exit (exitSuccess)
import Core import Core
import TI import TI
import GM import GM
import Lens.Micro.Mtl import Lens.Micro.Mtl
import CoreDriver qualified
import RlpDriver qualified
---------------------------------------------------------------------------------- ----------------------------------------------------------------------------------
optParser :: ParserInfo RLPCOptions optParser :: ParserInfo RLPCOptions
@@ -37,9 +41,15 @@ options = RLPCOptions
{- -d -} {- -d -}
<*> fmap S.fromList # many # option debugFlagReader <*> fmap S.fromList # many # option debugFlagReader
( short 'd' ( short 'd'
<> help "dump evaluation logs" <> help "pass debug flags"
<> metavar "DEBUG FLAG" <> metavar "DEBUG FLAG"
) )
{- -f -}
<*> fmap S.fromList # many # option compilerFlagReader
( short 'f'
<> help "pass compilation flags"
<> metavar "COMPILATION FLAG"
)
{- --evaluator, -e -} {- --evaluator, -e -}
<*> option evaluatorReader <*> option evaluatorReader
( long "evaluator" ( long "evaluator"
@@ -57,6 +67,7 @@ options = RLPCOptions
) )
<*> option languageReader <*> option languageReader
( long "language" ( long "language"
<> short 'x'
) )
<*> some (argument str $ metavar "FILES...") <*> some (argument str $ metavar "FILES...")
where where
@@ -67,9 +78,13 @@ languageReader :: ReadM Language
languageReader = maybeReader $ \case languageReader = maybeReader $ \case
"rlp" -> Just LanguageRlp "rlp" -> Just LanguageRlp
"core" -> Just LanguageCore "core" -> Just LanguageCore
_ -> Nothing
debugFlagReader :: ReadM DebugFlag debugFlagReader :: ReadM DebugFlag
debugFlagReader = maybeReader $ Just debugFlagReader = str
compilerFlagReader :: ReadM CompilerFlag
compilerFlagReader = str
evaluatorReader :: ReadM Evaluator evaluatorReader :: ReadM Evaluator
evaluatorReader = maybeReader $ \case evaluatorReader = maybeReader $ \case
@@ -88,54 +103,9 @@ main = do
void $ evalRLPCIO opts driver void $ evalRLPCIO opts driver
driver :: RLPCIO () driver :: RLPCIO ()
driver = sequence_ driver = view rlpcLanguage >>= \case
[ dshowFlags LanguageCore -> CoreDriver.driver
, ddumpAST LanguageRlp -> RlpDriver.driver
, ddumpEval
]
dshowFlags :: RLPCIO ()
dshowFlags = whenDFlag "dump-flags" do
ask >>= liftIO . print
ddumpAST :: RLPCIO ()
ddumpAST = whenDFlag "dump-ast" $ forFiles_ \o f -> do
liftIO $ withFile f ReadMode $ \h -> do
s <- TIO.hGetContents h
case parseProg o s of
Right (a,_) -> hPutStrLn stderr $ show a
Left e -> error "todo errors lol"
ddumpEval :: RLPCIO ()
ddumpEval = whenDFlag "dump-eval" do
fs <- view rlpcInputFiles
forM_ fs $ \f -> liftIO (TIO.readFile f) >>= doProg
where
doProg :: Text -> RLPCIO ()
doProg = undefined
-- doProg s = ask >>= \o -> case parseProg o s of
-- -- TODO: error handling
-- Left e -> addFatal . CompilerError $ show e
-- Right (a,_) -> do
-- log <- view rlpcLogFile
-- dumpEval <- chooseEval
-- case log of
-- Just f -> liftIO $ withFile f WriteMode $ dumpEval a
-- Nothing -> liftIO $ dumpEval a stderr
-- choose the appropriate model based on the compiler opts
-- chooseEval = do
-- ev <- view rlpcEvaluator
-- pure $ case ev of
-- EvaluatorGM -> v GM.hdbgProg
-- EvaluatorTI -> v TI.hdbgProg
-- where v f p h = f p h *> pure ()
parseProg :: RLPCOptions
-> Text
-> (Maybe Program', [MsgEnvelope RlpcError])
parseProg o = evalRLPC o . (lexCore >=> parseCoreProg)
forFiles_ :: (Monad m) forFiles_ :: (Monad m)
=> (RLPCOptions -> FilePath -> RLPCT m a) => (RLPCOptions -> FilePath -> RLPCT m a)

0
app/RlpDriver.hs Normal file
View File

View File

@@ -11,7 +11,7 @@ errors and the family of RLPC monads.
-- only used for mtl instances -- only used for mtl instances
{-# LANGUAGE UndecidableInstances #-} {-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE DeriveGeneric, DerivingStrategies, DerivingVia #-} {-# LANGUAGE DeriveGeneric, DerivingStrategies, DerivingVia #-}
{-# LANGUAGE BlockArguments #-} {-# LANGUAGE BlockArguments, ViewPatterns #-}
module Compiler.RLPC module Compiler.RLPC
( (
-- * Rlpc Monad transformer -- * Rlpc Monad transformer
@@ -31,6 +31,7 @@ module Compiler.RLPC
-- * Misc. Rlpc Monad -related types -- * Misc. Rlpc Monad -related types
, RLPCOptions(RLPCOptions), IsRlpcError(..), RlpcError(..) , RLPCOptions(RLPCOptions), IsRlpcError(..), RlpcError(..)
, MsgEnvelope(..), Severity(..) , MsgEnvelope(..), Severity(..)
, addDebugMsg
, whenDFlag, whenFFlag , whenDFlag, whenFFlag
-- * Convenient re-exports -- * Convenient re-exports
, addFatal, addWound, def , addFatal, addWound, def
@@ -60,13 +61,15 @@ import Data.Text qualified as T
import Text.ANSI qualified as Ansi import Text.ANSI qualified as Ansi
import Text.PrettyPrint hiding ((<>)) import Text.PrettyPrint hiding ((<>))
import Lens.Micro.Platform import Lens.Micro.Platform
import Lens.Micro.Platform.Internal
import System.Exit import System.Exit
---------------------------------------------------------------------------------- ----------------------------------------------------------------------------------
newtype RLPCT m a = RLPCT { newtype RLPCT m a = RLPCT {
runRLPCT :: ReaderT RLPCOptions (ErrorfulT (MsgEnvelope RlpcError) m) a runRLPCT :: ReaderT RLPCOptions (ErrorfulT (MsgEnvelope RlpcError) m) a
} }
deriving (Functor, Applicative, Monad, MonadReader RLPCOptions) deriving ( Functor, Applicative, Monad
, MonadReader RLPCOptions, MonadErrorful (MsgEnvelope RlpcError))
rlpc :: (IsRlpcError e, Monad m) rlpc :: (IsRlpcError e, Monad m)
=> (RLPCOptions -> (Maybe a, [MsgEnvelope e])) => (RLPCOptions -> (Maybe a, [MsgEnvelope e]))
@@ -103,10 +106,18 @@ evalRLPCIO opt r = do
Nothing -> die "Failed, no code compiled." Nothing -> die "Failed, no code compiled."
putRlpcErrs :: [MsgEnvelope RlpcError] -> IO () putRlpcErrs :: [MsgEnvelope RlpcError] -> IO ()
putRlpcErrs = traverse_ (putStrLn . ('\n':) . render . prettyRlpcErr) putRlpcErrs = traverse_ (putStrLn . ('\n':) . prettyRlpcMsg)
prettyRlpcErr :: MsgEnvelope RlpcError -> Doc prettyRlpcMsg :: MsgEnvelope RlpcError -> String
prettyRlpcErr msg = header prettyRlpcMsg m@(view msgSeverity -> SevDebug) = prettyRlpcDebugMsg m
prettyRlpcMsg m = render $ docRlpcErr m
prettyRlpcDebugMsg :: MsgEnvelope RlpcError -> String
prettyRlpcDebugMsg (view msgDiagnostic -> Text ts) =
T.unpack . foldMap (`T.snoc` '\n') $ ts
docRlpcErr :: MsgEnvelope RlpcError -> Doc
docRlpcErr msg = header
$$ nest 2 bullets $$ nest 2 bullets
$$ source $$ source
where where
@@ -177,6 +188,9 @@ type CompilerFlag = String
makeLenses ''RLPCOptions makeLenses ''RLPCOptions
pure [] pure []
addDebugMsg :: (Monad m, IsText e) => e -> RLPCT m ()
addDebugMsg e = addWound . debugMsg $ Text [e ^. unpacked . packed]
-- TODO: rewrite this with prisms once microlens-pro drops :3 -- TODO: rewrite this with prisms once microlens-pro drops :3
whenDFlag :: (Monad m) => DebugFlag -> RLPCT m () -> RLPCT m () whenDFlag :: (Monad m) => DebugFlag -> RLPCT m () -> RLPCT m ()
whenDFlag f m = do whenDFlag f m = do

View File

@@ -10,6 +10,7 @@ module Compiler.RlpcError
, msgSeverity , msgSeverity
, liftRlpcErrors , liftRlpcErrors
, errorMsg , errorMsg
, debugMsg
-- * Located Comonad -- * Located Comonad
, Located(..) , Located(..)
, SrcSpan(..) , SrcSpan(..)
@@ -46,6 +47,7 @@ instance IsRlpcError RlpcError where
data Severity = SevWarning data Severity = SevWarning
| SevError | SevError
| SevDebug
deriving Show deriving Show
makeLenses ''MsgEnvelope makeLenses ''MsgEnvelope
@@ -65,3 +67,11 @@ errorMsg s e = MsgEnvelope
, _msgSeverity = SevError , _msgSeverity = SevError
} }
debugMsg :: e -> MsgEnvelope e
debugMsg e = MsgEnvelope
-- TODO: not pretty, but it is a debug message after all
{ _msgSpan = SrcSpan 0 0 0 0
, _msgDiagnostic = e
, _msgSeverity = SevDebug
}

View File

@@ -13,6 +13,7 @@ module Control.Monad.Errorful
where where
---------------------------------------------------------------------------------- ----------------------------------------------------------------------------------
import Control.Monad.State.Strict import Control.Monad.State.Strict
import Control.Monad.Reader
import Control.Monad.Trans import Control.Monad.Trans
import Data.Functor.Identity import Data.Functor.Identity
import Data.Coerce import Data.Coerce
@@ -76,7 +77,7 @@ mapErrorful f (ErrorfulT m) = ErrorfulT $
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
-- daily dose of n^2 instances -- daily dose of n^2 instances
instance (Monad m, MonadErrorful e m) => MonadErrorful e (StateT s m) where instance (Monad m, MonadErrorful e m) => MonadErrorful e (ReaderT r m) where
addWound = undefined addWound = lift . addWound
addFatal = undefined addFatal = lift . addFatal

View File

@@ -21,6 +21,7 @@ import Data.Functor.Identity
import Core.Syntax import Core.Syntax
import Core.Lex import Core.Lex
import Compiler.RLPC import Compiler.RLPC
import Control.Monad
import Lens.Micro import Lens.Micro
import Data.Default.Class (def) import Data.Default.Class (def)
import Data.Hashable (Hashable) import Data.Hashable (Hashable)
@@ -225,12 +226,17 @@ insScDef sc = programScDefs %~ (sc:)
singletonScDef :: (Hashable b) => ScDef b -> Program b singletonScDef :: (Hashable b) => ScDef b -> Program b
singletonScDef sc = insScDef sc mempty singletonScDef sc = insScDef sc mempty
parseCoreProgR :: forall m. (Applicative m) => [Located CoreToken] -> RLPCT m Program' parseCoreProgR :: forall m. (Monad m) => [Located CoreToken] -> RLPCT m Program'
parseCoreProgR = hoistRlpcT generalise . parseCoreProg parseCoreProgR = ddumpast <=< (hoistRlpcT generalise . parseCoreProg)
where where
generalise :: forall a. Identity a -> m a generalise :: forall a. Identity a -> m a
generalise (Identity a) = pure a generalise (Identity a) = pure a
ddumpast :: Program' -> RLPCT m Program'
ddumpast p = do
whenDFlag "dump-ast" $ (addDebugMsg . show $ p)
pure p
happyBind :: RLPC a -> (a -> RLPC b) -> RLPC b happyBind :: RLPC a -> (a -> RLPC b) -> RLPC b
happyBind m k = m >>= k happyBind m k = m >>= k