{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE InstanceSigs #-}
module Codegen.ExprGen.ExprGen where
import qualified Ast.Types as AT
import qualified Codegen.ExprGen.Assembly as EA
import qualified Codegen.ExprGen.Cast as EC
import qualified Codegen.ExprGen.ControlFlow as EF
import qualified Codegen.ExprGen.DataValue as ED
import qualified Codegen.ExprGen.Function as EFU
import qualified Codegen.ExprGen.Operator as EO
import qualified Codegen.ExprGen.Variable as EV
import qualified Codegen.State as CS
import qualified LLVM.AST as AST
class ExprGen a where
generateExpr :: (CS.MonadCodegen m) => a -> m AST.Operand
instance ExprGen AT.Expr where
generateExpr :: (CS.MonadCodegen m) => AT.Expr -> m AST.Operand
generateExpr :: forall (m :: * -> *). MonadCodegen m => Expr -> m Operand
generateExpr Expr
expr = case Expr
expr of
AT.Lit {} -> Expr -> m Operand
forall (m :: * -> *).
(MonadCodegen m, ExprGen Expr) =>
Expr -> m Operand
EV.generateLiteral Expr
expr
AT.Var {} -> Expr -> m Operand
forall (m :: * -> *).
(MonadCodegen m, ExprGen Expr) =>
Expr -> m Operand
EV.generateVar Expr
expr
AT.Function {} -> Expr -> m Operand
forall (m :: * -> *).
(MonadCodegen m, ExprGen Expr) =>
Expr -> m Operand
EFU.generateFunction Expr
expr
AT.ForeignFunction {} -> Expr -> m Operand
forall (m :: * -> *).
(MonadCodegen m, ExprGen Expr) =>
Expr -> m Operand
EFU.generateForeignFunction Expr
expr
AT.Declaration {} -> Expr -> m Operand
forall (m :: * -> *).
(MonadCodegen m, ExprGen Expr) =>
Expr -> m Operand
EV.generateDeclaration Expr
expr
AT.If {} -> Expr -> m Operand
forall (m :: * -> *).
(MonadCodegen m, ExprGen Expr) =>
Expr -> m Operand
EF.generateIf Expr
expr
AT.Block {} -> Expr -> m Operand
forall (m :: * -> *).
(MonadCodegen m, ExprGen Expr) =>
Expr -> m Operand
EF.generateBlock Expr
expr
AT.Return {} -> Expr -> m Operand
forall (m :: * -> *).
(MonadCodegen m, ExprGen Expr) =>
Expr -> m Operand
EF.generateReturn Expr
expr
AT.Op {} -> Expr -> m Operand
forall (m :: * -> *).
(MonadCodegen m, ExprGen Expr) =>
Expr -> m Operand
EO.generateBinaryOp Expr
expr
AT.UnaryOp {} -> Expr -> m Operand
forall (m :: * -> *).
(MonadCodegen m, ExprGen Expr) =>
Expr -> m Operand
EO.generateUnaryOp Expr
expr
AT.Call {} -> Expr -> m Operand
forall (m :: * -> *).
(MonadCodegen m, ExprGen Expr) =>
Expr -> m Operand
EFU.generateFunctionCall Expr
expr
AT.ArrayAccess {} -> Expr -> m Operand
forall (m :: * -> *).
(MonadCodegen m, ExprGen Expr) =>
Expr -> m Operand
ED.generateArrayAccess Expr
expr
AT.StructAccess {} -> Expr -> m Operand
forall (m :: * -> *).
(MonadCodegen m, ExprGen Expr) =>
Expr -> m Operand
ED.generateStructAccess Expr
expr
AT.Cast {} -> Expr -> m Operand
forall (m :: * -> *).
(MonadCodegen m, ExprGen Expr) =>
Expr -> m Operand
EC.generateCast Expr
expr
AT.From {} -> Expr -> m Operand
forall (m :: * -> *).
(MonadCodegen m, ExprGen Expr) =>
Expr -> m Operand
EF.generateFromLoop Expr
expr
AT.While {} -> Expr -> m Operand
forall (m :: * -> *).
(MonadCodegen m, ExprGen Expr) =>
Expr -> m Operand
EF.generateWhileLoop Expr
expr
AT.Break {} -> Expr -> m Operand
forall (m :: * -> *).
(MonadCodegen m, ExprGen Expr) =>
Expr -> m Operand
EF.generateBreak Expr
expr
AT.Continue {} -> Expr -> m Operand
forall (m :: * -> *).
(MonadCodegen m, ExprGen Expr) =>
Expr -> m Operand
EF.generateContinue Expr
expr
AT.Assignment {} -> Expr -> m Operand
forall (m :: * -> *).
(MonadCodegen m, ExprGen Expr) =>
Expr -> m Operand
EV.generateAssignment Expr
expr
AT.Assembly {} -> Expr -> m Operand
forall (m :: * -> *).
(MonadCodegen m, ExprGen Expr) =>
Expr -> m Operand
EA.generateAssembly Expr
expr