quasiquoters

This commit is contained in:
crumbtoo
2023-11-21 18:15:05 -07:00
parent 878e92395a
commit d65ac970b1
3 changed files with 25 additions and 13 deletions

View File

@@ -27,6 +27,8 @@ library
, Core.TH , Core.TH
, Core.Examples , Core.Examples
, Core.Lex , Core.Lex
, Compiler.RLPC
, Control.Monad.Errorful
build-tool-depends: happy:happy, alex:alex build-tool-depends: happy:happy, alex:alex

View File

@@ -4,6 +4,9 @@ module Core.Parse
, parseCoreExpr , parseCoreExpr
, module Core.Lex -- temp convenience , module Core.Lex -- temp convenience
, parseTmp , parseTmp
, SrcError
, ParseError
, Module
) )
where where
@@ -15,7 +18,7 @@ import Compiler.RLPC
} }
%name parseCore Module %name parseCore Module
%name parseCoreExpr Expr %name parseCoreExpr StandaloneExpr
%tokentype { Located CoreToken } %tokentype { Located CoreToken }
%error { parseError } %error { parseError }
%monad { RLPC ParseError } %monad { RLPC ParseError }
@@ -75,6 +78,9 @@ ParList :: { [Name] }
ParList : Var ParList { $1 : $2 } ParList : Var ParList { $1 : $2 }
| {- epsilon -} { [] } | {- epsilon -} { [] }
StandaloneExpr :: { Expr }
StandaloneExpr : Expr eof { $1 }
Expr :: { Expr } Expr :: { Expr }
Expr : LetExpr { $1 } Expr : LetExpr { $1 }
| 'λ' Binders '->' Expr { Lam $2 $4 } | 'λ' Binders '->' Expr { Lam $2 $4 }
@@ -141,5 +147,6 @@ parseTmp = do
Right (ts,_) -> pure ts Right (ts,_) -> pure ts
where where
parse = evalRLPC RLPCOptions . (lexCore >=> parseCore) parse = evalRLPC RLPCOptions . (lexCore >=> parseCore)
} }

View File

@@ -5,8 +5,10 @@ module Core.TH
where where
---------------------------------------------------------------------------------- ----------------------------------------------------------------------------------
import Language.Haskell.TH import Language.Haskell.TH
import Language.Haskell.TH.Syntax import Language.Haskell.TH.Syntax hiding (Module)
import Language.Haskell.TH.Quote import Language.Haskell.TH.Quote
import Control.Monad ((>=>))
import Compiler.RLPC
import Core.Parse import Core.Parse
import Core.Lex import Core.Lex
---------------------------------------------------------------------------------- ----------------------------------------------------------------------------------
@@ -27,16 +29,17 @@ coreExpr = QuasiQuoter
, quoteDec = error "core quasiquotes may only be used in expressions" , quoteDec = error "core quasiquotes may only be used in expressions"
} }
qCore = undefined qCore :: String -> Q Exp
qCoreExpr = undefined qCore s = case parse s of
Left e -> error (show e)
Right (m,ts) -> lift m
where
parse = evalRLPC RLPCOptions . (lexCore >=> parseCore)
-- qCore :: String -> Q Exp qCoreExpr :: String -> Q Exp
-- qCore s = case lexCore s >>= parseCore of qCoreExpr s = case parseExpr s of
-- Success a -> lift a Left e -> error (show e)
-- Error e _ _ -> error e Right (m,ts) -> lift m
where
-- qCoreExpr :: String -> Q Exp parseExpr = evalRLPC RLPCOptions . (lexCore >=> parseCoreExpr)
-- qCoreExpr s = case lexCore s >>= parseCoreExpr of
-- Success a -> lift a
-- Error e _ _ -> error e