{-# OPTIONS_GHC -fglasgow-exts -funbox-strict-fields -fallow-overlapping-instances -fno-warn-orphans -fno-warn-incomplete-patterns -fallow-undecidable-instances -cpp #-} {-| Pugs Intermediate Language, version 1. > Again she fled, but swift he came. > TinĂºviel! TinĂºviel! > He called her by her elvish name; > And there she halted listening. -} module Pugs.PIL1 ( PIL_Environment(..), PIL_Stmts(..), PIL_Stmt(..), PIL_Decl(..), PIL_Expr(..), PIL_Literal(..), PIL_LValue(..), TParam(..), TCxt(..), TEnv(..), ) where import Pugs.AST hiding (Prim) import Pugs.Internals hiding (get, put) import Pugs.Types import Language.PIR -- import DrIFT.XML -- {-! global : Haskell2Xml !-} {-! global : Perl5, JSON, YAML !-} {-| The plan here is to first compile the environment (subroutines, statements, etc.) to an abstract syntax tree ('PIL' -- Pugs Intermediate Language) using the 'compile' function and 'Compile' class. -} data PIL_Environment = PIL_Environment { pilGlob :: [PIL_Decl] , pilMain :: PIL_Stmts } deriving (Show, Eq, Ord, Typeable) data PIL_Stmts = PNil | PStmts { pStmt :: !PIL_Stmt , pStmts :: !PIL_Stmts } | PPad { pScope :: !Scope , pSyms :: ![(VarName, PIL_Expr)] , pStmts :: !PIL_Stmts } deriving (Show, Eq, Ord, Typeable) data PIL_Stmt = PNoop | PStmt { pExpr :: !PIL_Expr } | PPos { pPos :: !Pos , pExp :: !Exp , pNode :: !PIL_Stmt } deriving (Show, Eq, Ord, Typeable) data PIL_Expr = PRawName { pRawName :: !VarName } | PExp { pLV :: !PIL_LValue } | PLit { pLit :: !PIL_Literal } | PThunk { pThunk :: !PIL_Expr } | PCode { pType :: !SubType , pParams :: ![TParam] , pLValue :: !Bool , pIsMulti :: !Bool , pBody :: !PIL_Stmts } deriving (Show, Eq, Ord, Typeable) data PIL_Decl = PSub { pSubName :: !SubName , pSubType :: !SubType , pSubParams :: ![TParam] , pSubLValue :: !Bool , pSubIsMulti :: !Bool , pSubBody :: !PIL_Stmts } deriving (Show, Eq, Ord, Typeable) data PIL_Literal = PVal { pVal :: Val } deriving (Show, Eq, Ord, Typeable) data PIL_LValue = PVar { pVarName :: !VarName } | PApp { pCxt :: !TCxt , pFun :: !PIL_Expr , pInv :: !(Maybe PIL_Expr) , pArgs :: ![PIL_Expr] } | PAssign { pLHS :: ![PIL_LValue] , pRHS :: !PIL_Expr } | PBind { pLHS :: ![PIL_LValue] , pRHS :: !PIL_Expr } deriving (Show, Eq, Ord, Typeable) data TParam = MkTParam { tpParam :: !Param , tpDefault :: !(Maybe (PIL_Expr)) } deriving (Show, Eq, Ord, Typeable) data TCxt = TCxtVoid | TCxtLValue !Type | TCxtItem !Type | TCxtSlurpy !Type | TTailCall !TCxt deriving (Show, Eq, Ord, Typeable) data TEnv = MkTEnv { tLexDepth :: !Int -- ^ Lexical scope depth , tTokDepth :: !Int -- ^ Exp nesting depth , tCxt :: !TCxt -- ^ Current context , tReg :: !(TVar (Int, String))-- ^ Register name supply , tLabel :: !(TVar Int) -- ^ Label name supply } deriving (Show, Eq, Ord, Typeable)