diff options
Diffstat (limited to 'src/Language')
-rw-r--r-- | src/Language/SimpleShell/AST.hs | 114 |
1 files changed, 78 insertions, 36 deletions
diff --git a/src/Language/SimpleShell/AST.hs b/src/Language/SimpleShell/AST.hs index 7549626..5a222c3 100644 --- a/src/Language/SimpleShell/AST.hs +++ b/src/Language/SimpleShell/AST.hs @@ -1,24 +1,22 @@ {-# LANGUAGE GADTs #-} -{-# LANGUAGE TypeSynonymInstances #-} -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE MultiParamTypeClasses #-} module Language.SimpleShell.AST where -class SimpleType a -instance SimpleType Integer -instance SimpleType String -instance SimpleType Bool +data SimpleType a where + IntType :: SimpleType Integer + StringType :: SimpleType String + BoolType :: SimpleType Bool -class Castable a b -instance Castable Integer String -instance Castable String Integer +data SimpleTypeList a where + NilTs :: SimpleTypeList () + ConsTs :: SimpleType a -> SimpleTypeList as -> SimpleTypeList (a, as) +-- | Pure expression (no side effects). data Expr a where - Literal :: (SimpleType a) => a -> Expr a + Literal :: SimpleType a -> a -> Expr a VarE :: Var a -> Expr a - FunctionCall :: Function a args -> ExprList args -> Expr a + FunctionCall :: FunctionRef a args -> ExprList args -> Expr a And :: Expr Bool -> Expr Bool -> Expr Bool Or :: Expr Bool -> Expr Bool -> Expr Bool Not :: Expr Bool -> Expr Bool @@ -28,35 +26,79 @@ data Expr a where Ge :: Expr Integer -> Expr Integer -> Expr Bool Lt :: Expr Integer -> Expr Integer -> Expr Bool Le :: Expr Integer -> Expr Integer -> Expr Bool - Ternary :: (SimpleType a) => Expr Bool -> Expr a -> Expr a -> Expr a - Cast :: (Castable a b) => Expr a -> Expr b + Ternary :: Expr Bool -> Expr a -> Expr a -> Expr a + Length :: Expr String -> Expr Integer + StrToInt :: Expr String -> Expr Integer + IntToStr :: Expr Integer -> Expr String + +data FunctionRef a args = FunctionRef String + +data Function a args + = Function + (Args args) + (Expr a) + +data Function' where + Function' + :: SimpleType a + -> SimpleTypeList as + -> Function a as + -> Function' data ExprList a where NilE :: ExprList () ConsE :: Expr a -> ExprList as -> ExprList (a, as) -data Var a where - Var :: (SimpleType a) => String -> Var a +data Var a = Var (SimpleType a) String + +data Var' where + Var' :: Var a -> Var' data Args args where NilArgs :: Args () - ConsArgs :: (SimpleType a) => Var a -> Args as -> Args (a, as) - -data Statement a where - Declare :: Var a -> Statement b - Assign :: Var a -> Expr a -> Statement b - Print :: Expr String -> Statement b - Command - :: (Maybe (Var Integer)) -- shell return value - -> (Maybe (Var String)) -- stdout - -> (Maybe (Var String)) -- stderr - -> Command a - -> Statement a - Return :: Expr a -> Statement a - -data Command a where - ExtCmd :: Expr String -> [Expr String] -> Command b - CompundCmd :: [Statement a] -> Command a - -data Function a args where - Function :: (SimpleType a) => Args args -> Command a -> Function a args + ConsArgs :: Var a -> Args as -> Args (a, as) + +data Statement ret + = AssignExpr ExprAssignment' + | Print (Expr String) + | PrintErr (Expr String) + | If (Expr Bool) [Statement ret] [Statement ret] + | While (Expr Bool) [Statement ret] + | RunCommand + (Maybe (Var Integer)) -- shell return value + (Maybe (Var String)) -- stdout + (Maybe (Var String)) -- stderr + (Command ret) + | RunProcedure ProcAssignment' + | Return (Expr ret) + +data ExprAssignment' where + ExprAssignment' :: Var a -> Expr a -> ExprAssignment' + +data ProcAssignment' where + ProcAssignment' + :: Maybe (Var a) -- procedure return value + -> Maybe (Var String) -- stdout + -> Maybe (Var String) -- stderr + -> ProcRef a args + -> Args args + -> ProcAssignment' + +data Command ret + = ExtCmd (Expr String) [Expr String] + | CompoundCmd [Statement ret] + +data Procedure ret args + = Procedure + (Args args) + [Var'] -- ^ variable declarations + (Command ret) + +data ProcRef ret args = ProcRef String + +data Procedure' where + Procedure' + :: SimpleType ret + -> SimpleTypeList args + -> Procedure ret args + -> Procedure' |