rc #13
@@ -37,6 +37,7 @@ library
|
|||||||
, Rlp.Parse.Associate
|
, Rlp.Parse.Associate
|
||||||
, Rlp.Lex
|
, Rlp.Lex
|
||||||
, Rlp.Parse.Types
|
, Rlp.Parse.Types
|
||||||
|
, Rlp.TH
|
||||||
, Compiler.Types
|
, Compiler.Types
|
||||||
, Data.Heap
|
, Data.Heap
|
||||||
, Data.Pretty
|
, Data.Pretty
|
||||||
|
|||||||
@@ -15,11 +15,12 @@ import Control.Comonad
|
|||||||
import Data.Functor.Apply
|
import Data.Functor.Apply
|
||||||
import Data.Functor.Bind
|
import Data.Functor.Bind
|
||||||
import Control.Lens hiding ((<<~))
|
import Control.Lens hiding ((<<~))
|
||||||
|
import Language.Haskell.TH.Syntax (Lift)
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
-- | Token wrapped with a span (line, column, absolute, length)
|
-- | Token wrapped with a span (line, column, absolute, length)
|
||||||
data Located a = Located SrcSpan a
|
data Located a = Located SrcSpan a
|
||||||
deriving (Show, Functor)
|
deriving (Show, Lift, Functor)
|
||||||
|
|
||||||
instance Apply Located where
|
instance Apply Located where
|
||||||
liftF2 f (Located sa p) (Located sb q)
|
liftF2 f (Located sa p) (Located sb q)
|
||||||
@@ -39,7 +40,7 @@ data SrcSpan = SrcSpan
|
|||||||
!Int -- ^ Column
|
!Int -- ^ Column
|
||||||
!Int -- ^ Absolute
|
!Int -- ^ Absolute
|
||||||
!Int -- ^ Length
|
!Int -- ^ Length
|
||||||
deriving Show
|
deriving (Show, Lift)
|
||||||
|
|
||||||
tupling :: Iso' SrcSpan (Int, Int, Int, Int)
|
tupling :: Iso' SrcSpan (Int, Int, Int, Int)
|
||||||
tupling = iso (\ (SrcSpan a b c d) -> (a,b,c,d))
|
tupling = iso (\ (SrcSpan a b c d) -> (a,b,c,d))
|
||||||
|
|||||||
@@ -193,7 +193,10 @@ Con :: { Located PsName }
|
|||||||
|
|
||||||
{
|
{
|
||||||
|
|
||||||
parseRlpExprR = undefined
|
parseRlpExprR :: (Monad m) => Text -> RLPCT m (RlpExpr RlpcPs)
|
||||||
|
parseRlpExprR s = liftErrorful $ pToErrorful parseRlpExpr st
|
||||||
|
where
|
||||||
|
st = programInitState s
|
||||||
|
|
||||||
parseRlpProgR :: (Monad m) => Text -> RLPCT m (RlpProgram RlpcPs)
|
parseRlpProgR :: (Monad m) => Text -> RLPCT m (RlpProgram RlpcPs)
|
||||||
parseRlpProgR s = liftErrorful $ pToErrorful parseRlpProg st
|
parseRlpProgR s = liftErrorful $ pToErrorful parseRlpProg st
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ import Control.Monad.State.Strict
|
|||||||
import Control.Monad.Errorful
|
import Control.Monad.Errorful
|
||||||
import Control.Comonad (extract)
|
import Control.Comonad (extract)
|
||||||
import Compiler.RlpcError
|
import Compiler.RlpcError
|
||||||
|
import Language.Haskell.TH.Syntax (Lift)
|
||||||
import Data.Text (Text)
|
import Data.Text (Text)
|
||||||
import Data.Maybe
|
import Data.Maybe
|
||||||
import Data.Fix
|
import Data.Fix
|
||||||
@@ -71,6 +72,7 @@ type instance XAppE RlpcPs = ()
|
|||||||
type instance XLitE RlpcPs = ()
|
type instance XLitE RlpcPs = ()
|
||||||
type instance XParE RlpcPs = ()
|
type instance XParE RlpcPs = ()
|
||||||
type instance XOAppE RlpcPs = ()
|
type instance XOAppE RlpcPs = ()
|
||||||
|
type instance XXRlpExprE RlpcPs = ()
|
||||||
|
|
||||||
type PsName = Text
|
type PsName = Text
|
||||||
|
|
||||||
@@ -275,3 +277,15 @@ initAlexInput s = AlexInput
|
|||||||
, _aiPos = (1,1,0)
|
, _aiPos = (1,1,0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
deriving instance Lift (RlpProgram RlpcPs)
|
||||||
|
deriving instance Lift (Decl RlpcPs)
|
||||||
|
deriving instance Lift (Pat RlpcPs)
|
||||||
|
deriving instance Lift (Lit RlpcPs)
|
||||||
|
deriving instance Lift (RlpExpr RlpcPs)
|
||||||
|
deriving instance Lift (Binding RlpcPs)
|
||||||
|
deriving instance Lift (RlpType RlpcPs)
|
||||||
|
deriving instance Lift (Alt RlpcPs)
|
||||||
|
deriving instance Lift (ConAlt RlpcPs)
|
||||||
|
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ import Data.Functor.Foldable.TH (makeBaseFunctor)
|
|||||||
import Data.Functor.Classes
|
import Data.Functor.Classes
|
||||||
import Data.Functor.Identity
|
import Data.Functor.Identity
|
||||||
import Data.Kind (Type)
|
import Data.Kind (Type)
|
||||||
|
import Language.Haskell.TH.Syntax (Lift)
|
||||||
import Lens.Micro
|
import Lens.Micro
|
||||||
import Lens.Micro.TH
|
import Lens.Micro.TH
|
||||||
import Core.Syntax hiding (Lit, Type, Binding, Binding')
|
import Core.Syntax hiding (Lit, Type, Binding, Binding')
|
||||||
@@ -156,7 +157,7 @@ type Decl' p = XRec p (Decl p)
|
|||||||
data Assoc = InfixL
|
data Assoc = InfixL
|
||||||
| InfixR
|
| InfixR
|
||||||
| Infix
|
| Infix
|
||||||
deriving (Show)
|
deriving (Show, Lift)
|
||||||
|
|
||||||
data ConAlt p = ConAlt (IdP p) [RlpType' p]
|
data ConAlt p = ConAlt (IdP p) [RlpType' p]
|
||||||
|
|
||||||
|
|||||||
@@ -3,4 +3,34 @@ module Rlp.TH
|
|||||||
, rlpExpr
|
, rlpExpr
|
||||||
)
|
)
|
||||||
where
|
where
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
import Language.Haskell.TH
|
||||||
|
import Language.Haskell.TH.Syntax
|
||||||
|
import Language.Haskell.TH.Quote
|
||||||
|
import Data.Text (Text)
|
||||||
|
import Data.Text qualified as T
|
||||||
|
import Control.Monad.IO.Class
|
||||||
|
import Control.Monad
|
||||||
|
|
||||||
|
import Compiler.RLPC
|
||||||
|
import Rlp.Parse
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
rlpProg :: QuasiQuoter
|
||||||
|
rlpProg = mkqq parseRlpProgR
|
||||||
|
|
||||||
|
rlpExpr :: QuasiQuoter
|
||||||
|
rlpExpr = mkqq parseRlpExprR
|
||||||
|
|
||||||
|
mkq :: (Lift a) => (Text -> RLPCIO a) -> String -> Q Exp
|
||||||
|
mkq parse = evalAndParse >=> lift where
|
||||||
|
evalAndParse = liftIO . evalRLPCIO def . parse . T.pack
|
||||||
|
|
||||||
|
mkqq :: (Lift a) => (Text -> RLPCIO a) -> QuasiQuoter
|
||||||
|
mkqq p = QuasiQuoter
|
||||||
|
{ quoteExp = mkq p
|
||||||
|
, quotePat = error "rlp quasiquotes may only be used in expressions"
|
||||||
|
, quoteType = error "rlp quasiquotes may only be used in expressions"
|
||||||
|
, quoteDec = error "rlp quasiquotes may only be used in expressions"
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user