paragon-0.1.3: src/Language/Java/Paragon/QuasiQuoter.hs
{-# LANGUAGE QuasiQuotes, TemplateHaskell #-}
module Language.Java.Paragon.QuasiQuoter where
--import Language.Haskell.TH.Syntax
import Language.Haskell.TH.Quote
import Language.Haskell.TH.Lift
import Language.Java.Paragon.Parser
import Language.Java.Paragon.Syntax
import Text.ParserCombinators.Parsec
import Language.Java.Paragon.Lexer
import Language.Haskell.Meta.Parse
import Prelude hiding(exp)
import qualified GHC.Enum as GE
fromRight :: Either a b -> b
fromRight (Right res) = res
instance Lift Double where
lift d = let s = show d
cs = lift s
in [|(read $cs)::Double|]
$(deriveLiftMany [''Exp,''Literal,''ClassType,''TypeArgument,
''ClassBody,''ArrayInit,''MethodInvocation,''Name,''Op,
''AssignOp,''PolicyExp,''Ident,''Lhs,''RefType,''Type,
''ArrayIndex,''FieldAccess,''NonWildTypeArgument,
''WildcardBound,''Decl,''VarInit,
''Clause,
''PrimType,
''Atom,
''Actor,
''ActorName,
''Lock,
''Block,
''MemberDecl,
''MethodBody,
''FormalParam,
''ExceptionSpec,
''ConstructorBody,
''InterfaceDecl,
''BlockStmt,
''Modifier,
''LockProperties,
''ClassDecl,
''TypeParam,
''VarDecl,
''InterfaceBody,
''VarDeclId,
''ExplConstrInv,
''Stmt,
''EnumConstant, ''ForInit, ''SwitchBlock, ''Catch,
''SwitchLabel, ''EnumBody])
--expToPat :: TS.Exp -> Pat
--expToPat (LitE l) = [p|$l|]
--expToPat (VarE n) = [p|$n|]
parserQQ :: (Lift a,Show a) => GenParser (L Token) () a -> QuasiQuoter
parserQQ f = QuasiQuoter{ quoteExp=lift.fromRight.(parser f),
quotePat=return.fromRight.parsePat.show.fromRight.(parser f)}
expQQ = parserQQ exp
typeQQ = parserQQ ttype
stmtQQ = parserQQ stmt
varDeclQQ=parserQQ varDecl
methodBodyQQ=parserQQ methodBody
--memberDeclQQ= parserQQ memberDecl