-ddump-ast
This commit is contained in:
14
app/CoreDriver.hs
Normal file
14
app/CoreDriver.hs
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
module CoreDriver
|
||||||
|
( driver
|
||||||
|
)
|
||||||
|
where
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
driver :: RLPCIO ()
|
||||||
|
driver = undefined
|
||||||
|
|
||||||
|
parseProg :: RLPCOptions
|
||||||
|
-> Text
|
||||||
|
-> (Maybe Program', [MsgEnvelope RlpcError])
|
||||||
|
parseProg o = lexCoreR >=> parseCoreProgR
|
||||||
|
|
||||||
70
app/Main.hs
70
app/Main.hs
@@ -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
0
app/RlpDriver.hs
Normal 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
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user