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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
-----------------------------------------------------------------------------
-- |
-- Module : Language.C.Syntax.Ops
-- Copyright : (c) 2008 Benedikt Huber
-- License : BSD-style
-- Maintainer : benedikt.huber@gmail.com
-- Stability : experimental
-- Portability : ghc
--
-- Unary, binary and asssignment operators. Exported via AST.
-----------------------------------------------------------------------------
-- | C assignment operators (K&R A7.17)
data CAssignOp = CAssignOp
| CMulAssOp
| CDivAssOp
| CRmdAssOp -- ^ remainder and assignment
| CAddAssOp
| CSubAssOp
| CShlAssOp
| CShrAssOp
| CAndAssOp
| CXorAssOp
| COrAssOp
assignBinop CAssignOp = error "direct assignment has no binary operator"
assignBinop CMulAssOp = CMulOp
assignBinop CDivAssOp = CDivOp
assignBinop CRmdAssOp = CRmdOp
assignBinop CAddAssOp = CAddOp
assignBinop CSubAssOp = CSubOp
assignBinop CShlAssOp = CShlOp
assignBinop CShrAssOp = CShrOp
assignBinop CAndAssOp = CAndOp
assignBinop CXorAssOp = CXorOp
assignBinop COrAssOp = COrOp
-- | C binary operators (K&R A7.6-15)
--
data CBinaryOp = CMulOp
| CDivOp
| CRmdOp -- ^ remainder of division
| CAddOp
| CSubOp
| CShlOp -- ^ shift left
| CShrOp -- ^ shift right
| CLeOp -- ^ less
| CGrOp -- ^ greater
| CLeqOp -- ^ less or equal
| CGeqOp -- ^ greater or equal
| CEqOp -- ^ equal
| CNeqOp -- ^ not equal
| CAndOp -- ^ bitwise and
| CXorOp -- ^ exclusive bitwise or
| COrOp -- ^ inclusive bitwise or
| CLndOp -- ^ logical and
| CLorOp -- ^ logical or
isCmpOp op = op `elem` [ CLeqOp, CGeqOp, CLeOp, CGrOp, CEqOp, CNeqOp ]
isPtrOp op = op `elem` [ CAddOp, CSubOp ]
isBitOp op = op `elem` [ CShlOp, CShrOp, CAndOp, COrOp, CXorOp ]
isLogicOp op = op `elem` [ CLndOp, CLorOp ]
-- | C unary operator (K&R A7.3-4)
--
data CUnaryOp = CPreIncOp -- ^ prefix increment operator
| CPreDecOp -- ^ prefix decrement operator
| CPostIncOp -- ^ postfix increment operator
| CPostDecOp -- ^ postfix decrement operator
| CAdrOp -- ^ address operator
| CIndOp -- ^ indirection operator
| CPlusOp -- ^ prefix plus
| CMinOp -- ^ prefix minus
| CCompOp -- ^ one's complement
| CNegOp -- ^ logical negation
isEffectfulOp op = op `elem` [ CPreIncOp, CPreDecOp, CPostIncOp, CPostDecOp ]