-
Notifications
You must be signed in to change notification settings - Fork 0
/
Operators.hs
63 lines (60 loc) · 2.09 KB
/
Operators.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
module Galaxy.Operators (binaryOperators
,unaryOperators
,assignementOperators
,lookupOp
) where
import Galaxy.SyntaxTree
import Data.Maybe
binaryOperators :: [[(String, BinOp)]]
binaryOperators = [ [ ("*", Mul)
, ("/", Div)
, ("%", Mod)
]
, [ ("+", Add)
, ("-", Sub)
]
, [ ("<<", LeftShift)
, (">>", RightShift)
]
, [ (">" , Greater)
, (">=", GreaterEqual)
, ("<=", LessEqual)
, ("<" , Less)
]
, [ ("==", Equals)
, ("!=", NotEquals)
]
, [("&",BinAnd)]
, [("^",BinXor)]
, [("|",BinOr)]
, [("&&",And)]
, [("||",Or)]
]
unaryOperators :: [[(String, UnaryOp)]]
unaryOperators = [ [ ("+", UPos)
, ("-", UNeg)
, ("!", UNot)
, ("~", UBinNot)
, ("&", UAddressOf)
, ("*", UPtrDereference)
]
]
assignementOperators :: [[(String, AssignOp)]]
assignementOperators = [ [ ("=" , SetV)
, ("+=", IncV)
, ("-=", DecV)
, ("*=", MulV)
, ("/=", DivV)
, ("%=", ModV)
, ("&=", BinAndV)
, ("|=", BinOrV)
, ("^=", BinXorV)
, ("~=", BinNotV)
, ("<<=", LeftShiftV)
, (">>=", RightShiftV)
]
]
lookupOp :: Eq a => a -> [[(String, a)]] -> String
lookupOp op ops = head . mapMaybe (lookup op) . swapTuples $ ops
where
swapTuples = map . map $ (\(a, b) -> (b, a))