-
Notifications
You must be signed in to change notification settings - Fork 6
/
tree.go
207 lines (181 loc) · 3.74 KB
/
tree.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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
package validator
import "fmt"
// 节点类型
type NodeKind byte
func (this NodeKind) String() string {
return fmt.Sprint(byte(this))
}
const (
NodeKindSpace NodeKind = iota //空间节点
NodeKindAnd //逻辑与节点
NodeKindOr //逻辑或节点
NodeKindFunc //函数节点
NodeKindRegFunc //正则函数节点
NodeKindExecutor //可执行函数(执行器)节点
)
// 语法节点接口
type SyntaxNode interface {
// Kind 语法节点类型
Kind() NodeKind
// ChangeKind 改变语法节点类型
ChangeKind(kind NodeKind)
// Parent 获取父节点
Parent() SyntaxNode
// SetParent 设置父节点
SetParent(n SyntaxNode)
// Left 返回左节点
Left() SyntaxNode
// SetLeft 设置左节点
SetLeft(n SyntaxNode)
// Right 返回右节点
Right() SyntaxNode
// SetRight 设置右节点
SetRight(n SyntaxNode)
// AddChild 添加子节点
AddChild(n SyntaxNode)
}
// 基础节点
type BaseNode struct {
kind NodeKind //节点类型
parent SyntaxNode //父节点
left SyntaxNode //左节点
right SyntaxNode //右节点
}
// Kind 语法节点类型
func (this *BaseNode) Kind() NodeKind {
return this.kind
}
// ChangeKind 改变语法节点类型
func (this *BaseNode) ChangeKind(kind NodeKind) {
this.kind = kind
}
// Parent 获取父节点
func (this *BaseNode) Parent() SyntaxNode {
return this.parent
}
// SetParent 设置父节点
func (this *BaseNode) SetParent(p SyntaxNode) {
this.parent = p
}
// Left 返回左节点
func (this *BaseNode) Left() SyntaxNode {
return this.left
}
// SetLeft 设置左节点
func (this *BaseNode) SetLeft(n SyntaxNode) {
this.left = n
if n != nil {
n.SetParent(this)
}
}
// Right 返回右节点
func (this *BaseNode) Right() SyntaxNode {
return this.right
}
// SetRight 设置右节点
func (this *BaseNode) SetRight(n SyntaxNode) {
this.right = n
if n != nil {
n.SetParent(this)
}
}
// AddChild 添加子节点
func (this *BaseNode) AddChild(n SyntaxNode) {
if this.left == nil {
this.SetLeft(n)
} else if this.right == nil {
this.SetRight(n)
}
}
// NewSpaceNode 创建空间节点
func NewSpaceNode() SyntaxNode {
return &BaseNode{
NodeKindSpace,
nil,
nil,
nil,
}
}
// NewAndNode 创建逻辑与节点
func NewAndNode() SyntaxNode {
return &BaseNode{
NodeKindAnd,
nil,
nil,
nil,
}
}
// NewOrNode 创建逻辑或节点
func NewOrNode() SyntaxNode {
return &BaseNode{
NodeKindOr,
nil,
nil,
nil,
}
}
// 函数节点
type FuncNode struct {
BaseNode
name string
params []*Token
}
// NewFuncNode 创建函数节点
func NewFuncNode(name string) SyntaxNode {
return &FuncNode{
BaseNode{
NodeKindFunc,
nil,
nil,
nil,
},
name,
make([]*Token, 0),
}
}
// NewRegFuncNode 创建正则函数节点
func NewRegFuncNode(exp string) SyntaxNode {
return &FuncNode{
BaseNode{
NodeKindRegFunc,
nil,
nil,
nil,
},
exp,
nil,
}
}
// SetFuncName 设置函数名称
func (this *FuncNode) SetFuncName(name string) {
this.name = name
}
// AddParam 添加参数信息
func (this *FuncNode) AddParam(t *Token) {
if this.params != nil {
this.params = append(this.params, t)
}
}
// 可执行执行函数节点,由FuncNode和RegFuncNode转换而成
type ExecutableFuncNode struct {
BaseNode
validator ValidatorFunc //验证器函数
params []interface{} //参数列表
}
// NewExecutableFuncNode 创建可执行执行函数节点
func NewExecutableFuncNode(v ValidatorFunc, params []interface{}) SyntaxNode {
return &ExecutableFuncNode{
BaseNode{
NodeKindExecutor,
nil,
nil,
nil,
},
v,
params,
}
}
// Execute 执行
func (this *ExecutableFuncNode) Execute(str string) bool {
return this.validator.Validate(str, this.params...)
}