46 lines
1.4 KiB
Haskell
46 lines
1.4 KiB
Haskell
module Core.TH
|
|
( coreExpr
|
|
, core
|
|
)
|
|
where
|
|
----------------------------------------------------------------------------------
|
|
import Language.Haskell.TH
|
|
import Language.Haskell.TH.Syntax hiding (Module)
|
|
import Language.Haskell.TH.Quote
|
|
import Control.Monad ((>=>))
|
|
import Compiler.RLPC
|
|
import Core.Parse
|
|
import Core.Lex
|
|
----------------------------------------------------------------------------------
|
|
|
|
core :: QuasiQuoter
|
|
core = QuasiQuoter
|
|
{ quoteExp = qCore
|
|
, quotePat = error "core quasiquotes may only be used in expressions"
|
|
, quoteType = error "core quasiquotes may only be used in expressions"
|
|
, quoteDec = error "core quasiquotes may only be used in expressions"
|
|
}
|
|
|
|
coreExpr :: QuasiQuoter
|
|
coreExpr = QuasiQuoter
|
|
{ quoteExp = qCoreExpr
|
|
, quotePat = error "core quasiquotes may only be used in expressions"
|
|
, quoteType = error "core quasiquotes may only be used in expressions"
|
|
, quoteDec = error "core quasiquotes may only be used in expressions"
|
|
}
|
|
|
|
qCore :: String -> Q Exp
|
|
qCore s = case parse s of
|
|
Left e -> error (show e)
|
|
Right (m,ts) -> lift m
|
|
where
|
|
parse = evalRLPC RLPCOptions . (lexCore >=> parseCore)
|
|
|
|
qCoreExpr :: String -> Q Exp
|
|
qCoreExpr s = case parseExpr s of
|
|
Left e -> error (show e)
|
|
Right (m,ts) -> lift m
|
|
where
|
|
parseExpr = evalRLPC RLPCOptions . (lexCore >=> parseCoreExpr)
|
|
|