-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathast_builder.go
126 lines (112 loc) · 2.1 KB
/
ast_builder.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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
package lure
func saveListOfExpr(lureSym *LureSymType, list *ExprList) {
lureSym.savePoint = list
}
func exprListAppend(list *ExprList, expr Expr) *ExprList {
if list == nil {
return exprListOfExpr(expr)
}
list.add(expr)
return list
}
func exprListOfExpr(expr Expr) *ExprList {
list := newExprList()
list.add(expr)
return &list
}
// getBinOpType maps XX_TK to binOpTypeXX
func getBinOpType(opTk int) binOpType {
switch opTk {
case TK_AND_LOGIC:
return binOpTypeAND
case TK_OR_LOGIC:
return binOpTypeOR
case TK_EQ:
return binOpTypeEQ
case TK_NE:
return binOpTypeNE
case TK_GT:
return binOpTypeGT
case TK_LT:
return binOpTypeLT
case TK_GE:
return binOpTypeGE
case TK_LE:
return binOpTypeLE
default:
return binOpType(opTk)
}
}
func exprBinOp(lhs Expr, op int, rhs Expr) Expr {
return ExprBinOp{
opTk: getBinOpType(op),
left: lhs,
right: rhs,
}
}
func exprIn(lhs Expr, op int, list *ExprList) Expr {
x := ExprIn{
left: lhs,
list: list,
}
if op == TK_NOTIN {
return ExprBinOp{
opTk: binOpTypeEQ,
left: x,
right: literalFromBoolean(false),
}
}
return x
}
func exprFunction0(fname string) Expr {
return ExprFunction{
left: ExprIdentity{raw: fname},
list: nil,
}
}
func exprFunction(fname string, list *ExprList) Expr {
return ExprFunction{
left: ExprIdentity{raw: fname},
list: list,
}
}
// exprBetween expresses xpMin <= xp <= xpMax
func exprBetween(xp Expr, xpMin Expr, xpMax Expr) Expr {
return ExprBinOp{
opTk: binOpTypeAND,
left: ExprBinOp{
opTk: binOpTypeGE,
left: xp,
right: xpMin,
},
right: ExprBinOp{
opTk: binOpTypeLE,
left: xp,
right: xpMax,
},
}
}
func exprUnaryOp(op int, xp Expr) Expr {
switch op {
case TK_NOT:
return ExprBinOp{
opTk: binOpTypeEQ,
left: xp,
right: literalFromBoolean(false),
}
default:
return nil
}
}
func exprOfInt(val int) Expr {
return literalFromInt(val)
}
func exprOfDouble(val float64) Expr {
return literalFromDouble(val)
}
func exprOfString(val string) Expr {
return literalFromString(val)
}
func exprOfIdentity(val string) Expr {
return ExprIdentity{raw: val}
}