aboutsummaryrefslogtreecommitdiff
path: root/src/Language
diff options
context:
space:
mode:
Diffstat (limited to 'src/Language')
-rw-r--r--src/Language/SimpleShell/AST.hs114
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'