rc #13
12
README.md
12
README.md
@@ -57,9 +57,8 @@ Listed in order of importance.
|
|||||||
- [x] Garbage Collection
|
- [x] Garbage Collection
|
||||||
- [ ] Emitter
|
- [ ] Emitter
|
||||||
- [ ] Code-gen (target yet to be decided)
|
- [ ] Code-gen (target yet to be decided)
|
||||||
- [ ] Core language emitter
|
- [x] Core linter (Type-checker)
|
||||||
- [ ] Core linter (Type-checker)
|
- [ ] Core2Core pass (optimisations and misc. preprocessing)
|
||||||
- [ ] Core2Core pass
|
|
||||||
- [x] GM prep
|
- [x] GM prep
|
||||||
- [x] Non-strict case-floating
|
- [x] Non-strict case-floating
|
||||||
- [ ] Let-floating
|
- [ ] Let-floating
|
||||||
@@ -101,9 +100,10 @@ Listed in order of importance.
|
|||||||
### January Release Plan
|
### January Release Plan
|
||||||
- [ ] Beta rl' to Core
|
- [ ] Beta rl' to Core
|
||||||
- [ ] UX improvements
|
- [ ] UX improvements
|
||||||
- [ ] Actual compiler errors -- no more unexceptional `error` calls
|
- [x] Actual compiler errors -- no more unexceptional `error` calls
|
||||||
- [ ] Better CLI dump flags
|
- [x] Better CLI dump flags
|
||||||
- [ ] Annotate the AST with token positions for errors
|
- [ ] Annotate the AST with token positions for errors (NOTE: As of Feb. 1,
|
||||||
|
this has been done, but the locational info is not yet used in error messages)
|
||||||
- [ ] More examples
|
- [ ] More examples
|
||||||
|
|
||||||
### March Release Plan
|
### March Release Plan
|
||||||
|
|||||||
@@ -68,6 +68,8 @@ options = RLPCOptions
|
|||||||
<*> option languageReader
|
<*> option languageReader
|
||||||
( long "language"
|
( long "language"
|
||||||
<> short 'x'
|
<> short 'x'
|
||||||
|
<> metavar "rlp|core"
|
||||||
|
<> help "the language to be compiled -- see README"
|
||||||
)
|
)
|
||||||
<*> some (argument str $ metavar "FILES...")
|
<*> some (argument str $ metavar "FILES...")
|
||||||
where
|
where
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ library
|
|||||||
, Core.Parse
|
, Core.Parse
|
||||||
, Core.Lex
|
, Core.Lex
|
||||||
, Core2Core
|
, Core2Core
|
||||||
|
, Rlp2Core
|
||||||
, Control.Monad.Utils
|
, Control.Monad.Utils
|
||||||
|
|
||||||
build-tool-depends: happy:happy, alex:alex
|
build-tool-depends: happy:happy, alex:alex
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ import Compiler.Types
|
|||||||
|
|
||||||
data RlpcPs
|
data RlpcPs
|
||||||
|
|
||||||
type instance XRec RlpcPs f = Located (f RlpcPs)
|
type instance XRec RlpcPs a = Located a
|
||||||
type instance IdP RlpcPs = PsName
|
type instance IdP RlpcPs = PsName
|
||||||
|
|
||||||
type instance XFunD RlpcPs = ()
|
type instance XFunD RlpcPs = ()
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ module Rlp.Syntax
|
|||||||
(
|
(
|
||||||
-- * AST
|
-- * AST
|
||||||
RlpProgram(..)
|
RlpProgram(..)
|
||||||
|
, progDecls
|
||||||
, Decl(..), Decl', RlpExpr(..), RlpExpr'
|
, Decl(..), Decl', RlpExpr(..), RlpExpr'
|
||||||
, Pat(..), Pat'
|
, Pat(..), Pat'
|
||||||
, Assoc(..)
|
, Assoc(..)
|
||||||
@@ -53,15 +54,20 @@ data RlpModule p = RlpModule
|
|||||||
|
|
||||||
-- | dear god.
|
-- | dear god.
|
||||||
type PhaseShow p =
|
type PhaseShow p =
|
||||||
( Show (XRec p Pat), Show (XRec p RlpExpr)
|
( Show (XRec p (Pat p)), Show (XRec p (RlpExpr p))
|
||||||
, Show (XRec p Lit), Show (IdP p)
|
, Show (XRec p (Lit p)), Show (IdP p)
|
||||||
, Show (XRec p RlpType)
|
, Show (XRec p (RlpType p))
|
||||||
, Show (XRec p Binding)
|
, Show (XRec p (Binding p))
|
||||||
)
|
)
|
||||||
|
|
||||||
newtype RlpProgram p = RlpProgram [Decl' p]
|
newtype RlpProgram p = RlpProgram [Decl' p]
|
||||||
|
|
||||||
deriving instance (PhaseShow p, Show (XRec p Decl)) => Show (RlpProgram p)
|
progDecls :: Lens' (RlpProgram p) [Decl' p]
|
||||||
|
progDecls = lens
|
||||||
|
(\ (RlpProgram ds) -> ds)
|
||||||
|
(const RlpProgram)
|
||||||
|
|
||||||
|
deriving instance (PhaseShow p, Show (XRec p (Decl p))) => Show (RlpProgram p)
|
||||||
|
|
||||||
data RlpType p = FunConT
|
data RlpType p = FunConT
|
||||||
| FunT (RlpType' p) (RlpType' p)
|
| FunT (RlpType' p) (RlpType' p)
|
||||||
@@ -69,7 +75,7 @@ data RlpType p = FunConT
|
|||||||
| VarT (IdP p)
|
| VarT (IdP p)
|
||||||
| ConT (IdP p)
|
| ConT (IdP p)
|
||||||
|
|
||||||
type RlpType' p = XRec p RlpType
|
type RlpType' p = XRec p (RlpType p)
|
||||||
|
|
||||||
deriving instance (PhaseShow p)
|
deriving instance (PhaseShow p)
|
||||||
=> Show (RlpType p)
|
=> Show (RlpType p)
|
||||||
@@ -95,11 +101,11 @@ type family XInfixD p
|
|||||||
type family XXDeclD p
|
type family XXDeclD p
|
||||||
|
|
||||||
pattern FunD :: (XFunD p ~ ())
|
pattern FunD :: (XFunD p ~ ())
|
||||||
=> (IdP p) -> [Pat' p] -> (RlpExpr' p) -> (Maybe (Where p))
|
=> IdP p -> [Pat' p] -> RlpExpr' p -> Maybe (Where p)
|
||||||
-> Decl p
|
-> Decl p
|
||||||
pattern TySigD :: (XTySigD p ~ ()) => [IdP p] -> (RlpType' p) -> Decl p
|
pattern TySigD :: (XTySigD p ~ ()) => [IdP p] -> RlpType' p -> Decl p
|
||||||
pattern DataD :: (XDataD p ~ ()) => (IdP p) -> [IdP p] -> [ConAlt p] -> Decl p
|
pattern DataD :: (XDataD p ~ ()) => IdP p -> [IdP p] -> [ConAlt p] -> Decl p
|
||||||
pattern InfixD :: (XInfixD p ~ ()) => Assoc -> Int -> (IdP p) -> Decl p
|
pattern InfixD :: (XInfixD p ~ ()) => Assoc -> Int -> IdP p -> Decl p
|
||||||
pattern XDeclD :: (XXDeclD p ~ ()) => Decl p
|
pattern XDeclD :: (XXDeclD p ~ ()) => Decl p
|
||||||
|
|
||||||
pattern FunD n as e wh = FunD' () n as e wh
|
pattern FunD n as e wh = FunD' () n as e wh
|
||||||
@@ -108,7 +114,7 @@ pattern DataD n as cs = DataD' () n as cs
|
|||||||
pattern InfixD a p n = InfixD' () a p n
|
pattern InfixD a p n = InfixD' () a p n
|
||||||
pattern XDeclD = XDeclD' ()
|
pattern XDeclD = XDeclD' ()
|
||||||
|
|
||||||
type Decl' p = XRec p Decl
|
type Decl' p = XRec p (Decl p)
|
||||||
|
|
||||||
data Assoc = InfixL
|
data Assoc = InfixL
|
||||||
| InfixR
|
| InfixR
|
||||||
@@ -117,7 +123,7 @@ data Assoc = InfixL
|
|||||||
|
|
||||||
data ConAlt p = ConAlt (IdP p) [RlpType' p]
|
data ConAlt p = ConAlt (IdP p) [RlpType' p]
|
||||||
|
|
||||||
deriving instance (Show (IdP p), Show (XRec p RlpType)) => Show (ConAlt p)
|
deriving instance (Show (IdP p), Show (XRec p (RlpType p))) => Show (ConAlt p)
|
||||||
|
|
||||||
data RlpExpr p = LetE' (XLetE p) [Binding' p] (RlpExpr' p)
|
data RlpExpr p = LetE' (XLetE p) [Binding' p] (RlpExpr' p)
|
||||||
| VarE' (XVarE p) (IdP p)
|
| VarE' (XVarE p) (IdP p)
|
||||||
@@ -171,15 +177,15 @@ deriving instance
|
|||||||
, PhaseShow p
|
, PhaseShow p
|
||||||
) => Show (RlpExpr p)
|
) => Show (RlpExpr p)
|
||||||
|
|
||||||
type RlpExpr' p = XRec p RlpExpr
|
type RlpExpr' p = XRec p (RlpExpr p)
|
||||||
|
|
||||||
class UnXRec p where
|
class UnXRec p where
|
||||||
unXRec :: XRec p f -> f p
|
unXRec :: XRec p a -> a
|
||||||
|
|
||||||
class MapXRec p where
|
class MapXRec p where
|
||||||
mapXRec :: (f p -> f' p') -> XRec p f -> XRec p' f'
|
mapXRec :: (a -> b) -> XRec p a -> XRec p b
|
||||||
|
|
||||||
type family XRec p (f :: Type -> Type) = (r :: Type) | r -> p f
|
type family XRec p a = (r :: Type) | r -> p a
|
||||||
|
|
||||||
type family IdP p
|
type family IdP p
|
||||||
|
|
||||||
@@ -193,9 +199,9 @@ deriving instance (PhaseShow p) => Show (Alt p)
|
|||||||
data Binding p = PatB (Pat' p) (RlpExpr' p)
|
data Binding p = PatB (Pat' p) (RlpExpr' p)
|
||||||
| FunB (IdP p) [Pat' p] (RlpExpr' p)
|
| FunB (IdP p) [Pat' p] (RlpExpr' p)
|
||||||
|
|
||||||
type Binding' p = XRec p Binding
|
type Binding' p = XRec p (Binding p)
|
||||||
|
|
||||||
deriving instance (Show (XRec p Pat), Show (XRec p RlpExpr), Show (IdP p)
|
deriving instance (Show (XRec p (Pat p)), Show (XRec p (RlpExpr p)), Show (IdP p)
|
||||||
) => Show (Binding p)
|
) => Show (Binding p)
|
||||||
|
|
||||||
data Pat p = VarP (IdP p)
|
data Pat p = VarP (IdP p)
|
||||||
@@ -204,7 +210,7 @@ data Pat p = VarP (IdP p)
|
|||||||
|
|
||||||
deriving instance (PhaseShow p) => Show (Pat p)
|
deriving instance (PhaseShow p) => Show (Pat p)
|
||||||
|
|
||||||
type Pat' p = XRec p Pat
|
type Pat' p = XRec p (Pat p)
|
||||||
|
|
||||||
data Lit p = IntL Int
|
data Lit p = IntL Int
|
||||||
| CharL Char
|
| CharL Char
|
||||||
@@ -212,7 +218,7 @@ data Lit p = IntL Int
|
|||||||
|
|
||||||
deriving instance (PhaseShow p) => Show (Lit p)
|
deriving instance (PhaseShow p) => Show (Lit p)
|
||||||
|
|
||||||
type Lit' p = XRec p Lit
|
type Lit' p = XRec p (Lit p)
|
||||||
|
|
||||||
-- instance HasLHS Alt Alt Pat Pat where
|
-- instance HasLHS Alt Alt Pat Pat where
|
||||||
-- _lhs = lens
|
-- _lhs = lens
|
||||||
@@ -224,7 +230,7 @@ type Lit' p = XRec p Lit
|
|||||||
-- (\ (AltA _ e) -> e)
|
-- (\ (AltA _ e) -> e)
|
||||||
-- (\ (AltA p _) e' -> AltA p e')
|
-- (\ (AltA p _) e' -> AltA p e')
|
||||||
|
|
||||||
makeBaseFunctor ''RlpExpr
|
-- makeBaseFunctor ''RlpExpr
|
||||||
|
|
||||||
-- showsTernaryWith :: (Int -> x -> ShowS)
|
-- showsTernaryWith :: (Int -> x -> ShowS)
|
||||||
-- -> (Int -> y -> ShowS)
|
-- -> (Int -> y -> ShowS)
|
||||||
|
|||||||
40
src/Rlp2Core.hs
Normal file
40
src/Rlp2Core.hs
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
module Rlp2Core
|
||||||
|
( rlpProgToCore
|
||||||
|
)
|
||||||
|
where
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
import Control.Monad
|
||||||
|
import Control.Monad.Writer.CPS
|
||||||
|
import Lens.Micro
|
||||||
|
import Lens.Micro.Internal
|
||||||
|
import Data.Text (Text)
|
||||||
|
import Data.Text qualified as T
|
||||||
|
import Data.HashMap.Strict qualified as H
|
||||||
|
|
||||||
|
import Core.Syntax as Core
|
||||||
|
import Rlp.Syntax as Rlp
|
||||||
|
import Rlp.Parse.Types (RlpcPs)
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
rlpProgToCore :: RlpProgram RlpcPs -> Program'
|
||||||
|
rlpProgToCore = foldMapOf (progDecls . each) declToCore
|
||||||
|
|
||||||
|
declToCore :: Decl' RlpcPs -> Program'
|
||||||
|
|
||||||
|
declToCore = undefined
|
||||||
|
|
||||||
|
-- declToCore (TySigD ns t) =
|
||||||
|
-- mempty & programTypeSigs .~ H.fromList [ (n, typeToCore t) | n <- ns ]
|
||||||
|
|
||||||
|
typeToCore :: RlpType RlpcPs -> Type
|
||||||
|
typeToCore = undefined
|
||||||
|
-- typeToCore FunConT = TyFun
|
||||||
|
-- typeToCore (FunT s t) = typeToCore s :-> typeToCore t
|
||||||
|
-- typeToCore (AppT s t) = TyApp (typeToCore s) (typeToCore t)
|
||||||
|
-- typeToCore (ConT n) = TyCon (dsNameToName n)
|
||||||
|
-- typeToCore (VarT x) = TyVar (dsNameToName x)
|
||||||
|
|
||||||
|
-- | Forwards-compatiblity if IdP RlpDs is changed
|
||||||
|
dsNameToName :: IdP RlpcPs -> Name
|
||||||
|
dsNameToName = id
|
||||||
|
|
||||||
Reference in New Issue
Block a user