packages feed

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