@@ -47,7 +47,8 @@ var predicates = map[string]struct {
47
47
"reduce" : {[]arg {expr , predicate , expr | optional }},
48
48
}
49
49
50
- type parser struct {
50
+ // Parser is a reusable parser. The zero value is ready for use.
51
+ type Parser struct {
51
52
lexer * lexer.Lexer
52
53
current , stashed Token
53
54
hasStash bool
@@ -57,7 +58,38 @@ type parser struct {
57
58
nodeCount uint // tracks number of AST nodes created
58
59
}
59
60
60
- func (p * parser ) checkNodeLimit () error {
61
+ func (p * Parser ) Parse (input string , config * conf.Config ) (* Tree , error ) {
62
+ if p .lexer == nil {
63
+ p .lexer = lexer .New ()
64
+ }
65
+ p .config = config
66
+ source := file .NewSource (input )
67
+ p .lexer .Reset (source )
68
+ p .next ()
69
+ node := p .parseSequenceExpression ()
70
+
71
+ if ! p .current .Is (EOF ) {
72
+ p .error ("unexpected token %v" , p .current )
73
+ }
74
+
75
+ tree := & Tree {
76
+ Node : node ,
77
+ Source : source ,
78
+ }
79
+ err := p .err
80
+
81
+ // cleanup non-reusable pointer values
82
+ p .err = nil
83
+ p .config = nil
84
+
85
+ if err != nil {
86
+ return tree , err .Bind (source )
87
+ }
88
+
89
+ return tree , nil
90
+ }
91
+
92
+ func (p * Parser ) checkNodeLimit () error {
61
93
p .nodeCount ++
62
94
if p .config == nil {
63
95
if p .nodeCount > conf .DefaultMaxNodes {
@@ -73,7 +105,7 @@ func (p *parser) checkNodeLimit() error {
73
105
return nil
74
106
}
75
107
76
- func (p * parser ) createNode (n Node , loc file.Location ) Node {
108
+ func (p * Parser ) createNode (n Node , loc file.Location ) Node {
77
109
if err := p .checkNodeLimit (); err != nil {
78
110
return nil
79
111
}
@@ -84,7 +116,7 @@ func (p *parser) createNode(n Node, loc file.Location) Node {
84
116
return n
85
117
}
86
118
87
- func (p * parser ) createMemberNode (n * MemberNode , loc file.Location ) * MemberNode {
119
+ func (p * Parser ) createMemberNode (n * MemberNode , loc file.Location ) * MemberNode {
88
120
if err := p .checkNodeLimit (); err != nil {
89
121
return nil
90
122
}
@@ -105,37 +137,14 @@ func Parse(input string) (*Tree, error) {
105
137
}
106
138
107
139
func ParseWithConfig (input string , config * conf.Config ) (* Tree , error ) {
108
- p := & parser {
109
- lexer : lexer .New (),
110
- config : config ,
111
- }
112
-
113
- source := file .NewSource (input )
114
- p .lexer .Reset (source )
115
- p .next ()
116
- node := p .parseSequenceExpression ()
117
-
118
- if ! p .current .Is (EOF ) {
119
- p .error ("unexpected token %v" , p .current )
120
- }
121
-
122
- tree := & Tree {
123
- Node : node ,
124
- Source : source ,
125
- }
126
-
127
- if p .err != nil {
128
- return tree , p .err .Bind (source )
129
- }
130
-
131
- return tree , nil
140
+ return new (Parser ).Parse (input , config )
132
141
}
133
142
134
- func (p * parser ) error (format string , args ... any ) {
143
+ func (p * Parser ) error (format string , args ... any ) {
135
144
p .errorAt (p .current , format , args ... )
136
145
}
137
146
138
- func (p * parser ) errorAt (token Token , format string , args ... any ) {
147
+ func (p * Parser ) errorAt (token Token , format string , args ... any ) {
139
148
if p .err == nil { // show first error
140
149
p .err = & file.Error {
141
150
Location : token .Location ,
@@ -144,7 +153,7 @@ func (p *parser) errorAt(token Token, format string, args ...any) {
144
153
}
145
154
}
146
155
147
- func (p * parser ) next () {
156
+ func (p * Parser ) next () {
148
157
if p .hasStash {
149
158
p .current = p .stashed
150
159
p .hasStash = false
@@ -169,7 +178,7 @@ func (p *parser) next() {
169
178
}
170
179
}
171
180
172
- func (p * parser ) expect (kind Kind , values ... string ) {
181
+ func (p * Parser ) expect (kind Kind , values ... string ) {
173
182
if p .current .Is (kind , values ... ) {
174
183
p .next ()
175
184
return
@@ -179,7 +188,7 @@ func (p *parser) expect(kind Kind, values ...string) {
179
188
180
189
// parse functions
181
190
182
- func (p * parser ) parseSequenceExpression () Node {
191
+ func (p * Parser ) parseSequenceExpression () Node {
183
192
nodes := []Node {p .parseExpression (0 )}
184
193
185
194
for p .current .Is (Operator , ";" ) && p .err == nil {
@@ -200,7 +209,7 @@ func (p *parser) parseSequenceExpression() Node {
200
209
}, nodes [0 ].Location ())
201
210
}
202
211
203
- func (p * parser ) parseExpression (precedence int ) Node {
212
+ func (p * Parser ) parseExpression (precedence int ) Node {
204
213
if p .err != nil {
205
214
return nil
206
215
}
@@ -303,7 +312,7 @@ func (p *parser) parseExpression(precedence int) Node {
303
312
return nodeLeft
304
313
}
305
314
306
- func (p * parser ) parseVariableDeclaration () Node {
315
+ func (p * Parser ) parseVariableDeclaration () Node {
307
316
p .expect (Operator , "let" )
308
317
variableName := p .current
309
318
p .expect (Identifier )
@@ -318,7 +327,7 @@ func (p *parser) parseVariableDeclaration() Node {
318
327
}, variableName .Location )
319
328
}
320
329
321
- func (p * parser ) parseConditionalIf () Node {
330
+ func (p * Parser ) parseConditionalIf () Node {
322
331
p .next ()
323
332
nodeCondition := p .parseExpression (0 )
324
333
p .expect (Bracket , "{" )
@@ -337,7 +346,7 @@ func (p *parser) parseConditionalIf() Node {
337
346
338
347
}
339
348
340
- func (p * parser ) parseConditional (node Node ) Node {
349
+ func (p * Parser ) parseConditional (node Node ) Node {
341
350
var expr1 , expr2 Node
342
351
for p .current .Is (Operator , "?" ) && p .err == nil {
343
352
p .next ()
@@ -364,7 +373,7 @@ func (p *parser) parseConditional(node Node) Node {
364
373
return node
365
374
}
366
375
367
- func (p * parser ) parsePrimary () Node {
376
+ func (p * Parser ) parsePrimary () Node {
368
377
token := p .current
369
378
370
379
if token .Is (Operator ) {
@@ -417,7 +426,7 @@ func (p *parser) parsePrimary() Node {
417
426
return p .parseSecondary ()
418
427
}
419
428
420
- func (p * parser ) parseSecondary () Node {
429
+ func (p * Parser ) parseSecondary () Node {
421
430
var node Node
422
431
token := p .current
423
432
@@ -516,23 +525,23 @@ func (p *parser) parseSecondary() Node {
516
525
return p .parsePostfixExpression (node )
517
526
}
518
527
519
- func (p * parser ) toIntegerNode (number int64 ) Node {
528
+ func (p * Parser ) toIntegerNode (number int64 ) Node {
520
529
if number > math .MaxInt {
521
530
p .error ("integer literal is too large" )
522
531
return nil
523
532
}
524
533
return p .createNode (& IntegerNode {Value : int (number )}, p .current .Location )
525
534
}
526
535
527
- func (p * parser ) toFloatNode (number float64 ) Node {
536
+ func (p * Parser ) toFloatNode (number float64 ) Node {
528
537
if number > math .MaxFloat64 {
529
538
p .error ("float literal is too large" )
530
539
return nil
531
540
}
532
541
return p .createNode (& FloatNode {Value : number }, p .current .Location )
533
542
}
534
543
535
- func (p * parser ) parseCall (token Token , arguments []Node , checkOverrides bool ) Node {
544
+ func (p * Parser ) parseCall (token Token , arguments []Node , checkOverrides bool ) Node {
536
545
var node Node
537
546
538
547
isOverridden := false
@@ -610,7 +619,7 @@ func (p *parser) parseCall(token Token, arguments []Node, checkOverrides bool) N
610
619
return node
611
620
}
612
621
613
- func (p * parser ) parseArguments (arguments []Node ) []Node {
622
+ func (p * Parser ) parseArguments (arguments []Node ) []Node {
614
623
// If pipe operator is used, the first argument is the left-hand side
615
624
// of the operator, so we do not parse it as an argument inside brackets.
616
625
offset := len (arguments )
@@ -631,7 +640,7 @@ func (p *parser) parseArguments(arguments []Node) []Node {
631
640
return arguments
632
641
}
633
642
634
- func (p * parser ) parsePredicate () Node {
643
+ func (p * Parser ) parsePredicate () Node {
635
644
startToken := p .current
636
645
withBrackets := false
637
646
if p .current .Is (Bracket , "{" ) {
@@ -663,7 +672,7 @@ func (p *parser) parsePredicate() Node {
663
672
return predicateNode
664
673
}
665
674
666
- func (p * parser ) parseArrayExpression (token Token ) Node {
675
+ func (p * Parser ) parseArrayExpression (token Token ) Node {
667
676
nodes := make ([]Node , 0 )
668
677
669
678
p .expect (Bracket , "[" )
687
696
return node
688
697
}
689
698
690
- func (p * parser ) parseMapExpression (token Token ) Node {
699
+ func (p * Parser ) parseMapExpression (token Token ) Node {
691
700
p .expect (Bracket , "{" )
692
701
693
702
nodes := make ([]Node , 0 )
740
749
return node
741
750
}
742
751
743
- func (p * parser ) parsePostfixExpression (node Node ) Node {
752
+ func (p * Parser ) parsePostfixExpression (node Node ) Node {
744
753
postfixToken := p .current
745
754
for (postfixToken .Is (Operator ) || postfixToken .Is (Bracket )) && p .err == nil {
746
755
optional := postfixToken .Value == "?."
@@ -870,7 +879,7 @@ func (p *parser) parsePostfixExpression(node Node) Node {
870
879
}
871
880
return node
872
881
}
873
- func (p * parser ) parseComparison (left Node , token Token , precedence int ) Node {
882
+ func (p * Parser ) parseComparison (left Node , token Token , precedence int ) Node {
874
883
var rootNode Node
875
884
for {
876
885
comparator := p .parseExpression (precedence + 1 )
0 commit comments