on 41df71f help sign in
elk/src/AST/Expression/Source.hs
99 lines 1.9 kB history raw
1{-# OPTIONS_GHC -Wall #-}
2module AST.Expression.Source
3 ( RawExpr, RawExpr', RawDef, RawDef'(..)
4 , ValidExpr, ValidExpr', ValidDef(..)
5 , Expr, Expr'(..)
6 , var, tuple, getPattern, collectLambdas
7 )
8 where
11import qualified AST.Literal as Literal
12import qualified AST.Pattern as Ptrn
13import qualified AST.Type as Type
14import qualified AST.Variable as Var
15import qualified Reporting.Annotation as A
16import qualified Reporting.Region as R
20-- EXPRESSIONS
23type Expr def =
24 A.Located (Expr' def)
27data Expr' def
28 = Literal Literal.Literal
29 | Var Var.Raw
30 | List [Expr def]
31 | Binop [(Expr def, A.Located String)] (Expr def)
32 | Lambda Ptrn.Raw (Expr def)
33 | App (Expr def) (Expr def)
34 | If [(Expr def, Expr def)] (Expr def)
35 | Let [def] (Expr def)
36 | Case (Expr def) [(Ptrn.Raw, Expr def)]
37 | Ctor String [Expr def]
38 | Access (Expr def) String
39 | Update (Expr def) [(A.Located String, Expr def)]
40 | Record [(A.Located String, Expr def)]
41 | GLShader String String Literal.GLShaderTipe
44type RawExpr = Expr RawDef
46type RawExpr' = Expr' RawDef
48type ValidExpr = Expr ValidDef
50type ValidExpr' = Expr' ValidDef
54-- DEFINITIONS
57type RawDef =
58 A.Located RawDef'
61data RawDef'
62 = Definition Ptrn.Raw RawExpr
63 | Annotation String Type.Raw
66data ValidDef =
67 Def R.Region Ptrn.Raw ValidExpr (Maybe Type.Raw)
71-- HELPERS
74var :: String -> Expr' def
75var x =
76 Var (Var.Raw x)
79tuple :: [Expr def] -> Expr' def
80tuple expressions =
81 Ctor ("_Tuple" ++ show (length expressions)) expressions
84getPattern :: ValidDef -> Ptrn.Raw
85getPattern (Def _ pattern _ _) =
86 pattern
89collectLambdas :: Expr def -> ([Ptrn.Raw], Expr def)
90collectLambdas lexpr@(A.A _ expr) =
91 case expr of
92 Lambda pattern body ->
93 let
94 (ps, body') = collectLambdas body
95 in
96 (pattern : ps, body')
98 _ ->
99 ([], lexpr)