on bb35d68 help sign in
elk/src/AST/Expression/Source.hs
106 lines 2.0 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, zero, getPattern, collectLambdas
7 )
8 where
10import qualified Data.Text as Text
11import Data.Text (Text)
13import qualified AST.Literal as Literal
14import qualified AST.Pattern as Ptrn
15import qualified AST.Type as Type
16import qualified AST.Variable as Var
17import qualified Reporting.Annotation as A
18import qualified Reporting.Region as R
22-- EXPRESSIONS
25type Expr def =
26 A.Located (Expr' def)
29data Expr' def
30 = Literal Literal.Literal
31 | Var Var.Raw
32 | List [Expr def]
33 | Binop [(Expr def, A.Located Text)] (Expr def)
34 | Lambda Ptrn.Raw (Expr def)
35 | App (Expr def) (Expr def)
36 | If [(Expr def, Expr def)] (Expr def)
37 | Let [def] (Expr def)
38 | Case (Expr def) [(Ptrn.Raw, Expr def)]
39 | Ctor Text [Expr def]
40 | Access (Expr def) Text
41 | Update (Expr def) [(A.Located Text, Expr def)]
42 | Record [(A.Located Text, Expr def)]
43 | GLShader Text Text Literal.Shader
46type RawExpr = Expr RawDef
48type RawExpr' = Expr' RawDef
50type ValidExpr = Expr ValidDef
52type ValidExpr' = Expr' ValidDef
56-- DEFINITIONS
59type RawDef =
60 A.Located RawDef'
63data RawDef'
64 = Definition Ptrn.Raw RawExpr
65 | Annotation Text Type.Raw
68data ValidDef =
69 Def R.Region Ptrn.Raw ValidExpr (Maybe Type.Raw)
73-- HELPERS
76var :: Text -> Expr' def
77var x =
78 Var (Var.Raw x)
81tuple :: [Expr def] -> Expr' def
82tuple expressions =
83 Ctor (Text.pack ("_Tuple" ++ show (length expressions))) expressions
86zero :: Expr' def
87zero =
88 Literal (Literal.IntNum 0)
91getPattern :: ValidDef -> Ptrn.Raw
92getPattern (Def _ pattern _ _) =
93 pattern
96collectLambdas :: Expr def -> ([Ptrn.Raw], Expr def)
97collectLambdas lexpr@(A.A _ expr) =
98 case expr of
99 Lambda pattern body ->
100 let
101 (ps, body') = collectLambdas body
102 in
103 (pattern : ps, body')
105 _ ->
106 ([], lexpr)