This repository has been archived by the owner on Feb 21, 2018. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
interface.go
170 lines (145 loc) · 2.11 KB
/
interface.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
package node
import "reflect"
const DefaultMaxIterations = 1000
// NodeType is used to distinguish each AST node
type NodeType int
// Node defines the interface for an AST node
type Node interface {
Type() NodeType
Copy() Node
Pos() int
Visit(chan Node)
}
type Appender interface {
Node
Append(Node)
}
const (
Noop NodeType = iota
Root
Text
Number
Int
Float
If
Else
List
Foreach
While
Wrapper
Include
Assignment
LocalVar
FetchField
FetchArrayElement
MethodCall
FunCall
Print
PrintRaw
FetchSymbol
Range
Plus
Minus
Mul
Div
Equals
NotEquals
LT
GT
MakeArray
Group
Filter
Macro
Max
)
// BaseNode is the most basic node with no extra data attached to it
type BaseNode struct {
NodeType // String() is delegated here
pos int
}
type ListNode struct {
BaseNode
Nodes []Node
}
type NumberNode struct {
BaseNode
Value reflect.Value
}
type TextNode struct {
BaseNode
Text []byte
}
type WrapperNode struct {
*ListNode
WrapperName string
// XXX need to make this configurable. currently it's only "content"
// WrapInto string
AssignmentNodes []Node
}
type AssignmentNode struct {
BaseNode
Assignee *LocalVarNode
Expression Node
}
type LocalVarNode struct {
BaseNode
Name string
Offset int
}
type LoopNode struct {
*ListNode // Body of the loop
Condition Node //
MaxIteration int // Max number of iterations
}
type ForeachNode struct {
*LoopNode
IndexVarName string
IndexVarIdx int
List Node
}
type WhileNode struct {
*LoopNode
}
type MethodCallNode struct {
BaseNode
Invocant Node
MethodName string
Args *ListNode
}
type FunCallNode struct {
BaseNode
Invocant Node
Args *ListNode
}
type FetchFieldNode struct {
BaseNode
Container Node
FieldName string
}
type IfNode struct {
*ListNode
BooleanExpression Node
}
type ElseNode struct {
*ListNode
IfNode Node
}
type UnaryNode struct {
BaseNode
Child Node
}
type BinaryNode struct {
BaseNode
Left Node
Right Node
}
type FilterNode struct {
*UnaryNode
Name string
}
type MacroNode struct {
*ListNode
Name string
LocalVar *LocalVarNode
Arguments []*LocalVarNode
}