-
Notifications
You must be signed in to change notification settings - Fork 0
/
expressions.go
102 lines (81 loc) · 1 KB
/
expressions.go
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
package c
import "fmt"
//
type Expression interface {
Node
isExpression()
}
type expression struct {
node
}
func (e expression) isExpression() {}
//
type BinaryOp int8
const (
InvalidBinaryOp BinaryOp = iota
AddOp
SubOp
MulOp
DivOp
ModOp
LtOp
LteOp
EqOp
NeOp
GtOp
GteOp
BitAndOp
BitOrOp
BitXorOp
AndOp
OrOp
)
func (o BinaryOp) String() string {
switch o {
case AddOp:
return "+"
case SubOp:
return "-"
case MulOp:
return "*"
case DivOp:
return "/"
case ModOp:
return "%"
case LtOp:
return "<"
case LteOp:
return "<="
case EqOp:
return "="
case NeOp:
return "!="
case GtOp:
return ">"
case GteOp:
return ">="
case BitAndOp:
return "&"
case BitOrOp:
return "|"
case BitXorOp:
return "^"
case AndOp:
return "&&"
case OrOp:
return "||"
}
panic(fmt.Errorf("invalid binary op: %d", o))
}
type Binary struct {
expression
Op BinaryOp
L Expression
R Expression
}
//
type Call struct {
expression
Fn Expression
Args []Expression
}