@@ -64,9 +64,7 @@ func (st *MatchData) setCapture(s, pos int) uint32 {
64
64
return v
65
65
}
66
66
67
- func (st * MatchData ) restoreCapture (s int , pos uint32 ) {
68
- st .captures [s ] = pos
69
- }
67
+ func (st * MatchData ) restoreCapture (s int , pos uint32 ) { st .captures [s ] = pos }
70
68
71
69
func (st * MatchData ) CaptureLength () int { return len (st .captures ) }
72
70
@@ -81,7 +79,6 @@ func (st *MatchData) Capture(idx int) int { return int(st.captures[idx] >> 1) }
81
79
type scannerState struct {
82
80
Pos int
83
81
started bool
84
- blace int
85
82
}
86
83
87
84
type scanner struct {
@@ -96,7 +93,6 @@ func newScanner(src []byte) *scanner {
96
93
State : scannerState {
97
94
Pos : 0 ,
98
95
started : false ,
99
- blace : 0 ,
100
96
},
101
97
saved : scannerState {},
102
98
}
@@ -151,21 +147,6 @@ func (sc *scanner) Peek() int {
151
147
return ch
152
148
}
153
149
154
- func (sc * scanner ) OpenBlace () {
155
- sc .State .blace ++
156
- }
157
-
158
- func (sc * scanner ) HasUnfinishedBlace () bool {
159
- return sc .State .blace > 0
160
- }
161
-
162
- func (sc * scanner ) CloseBlace () {
163
- sc .State .blace --
164
- if sc .State .blace < 0 {
165
- panic (newError (sc .State .Pos , "too many ')'" ))
166
- }
167
- }
168
-
169
150
func (sc * scanner ) Save () { sc .saved = sc .State }
170
151
171
152
func (sc * scanner ) Restore () { sc .State = sc .saved }
@@ -287,8 +268,7 @@ func (pn *rangeClass) Matches(ch int) bool {
287
268
288
269
// patterns {{{
289
270
290
- type pattern interface {
291
- }
271
+ type pattern interface {}
292
272
293
273
type singlePattern struct {
294
274
Class class
@@ -325,26 +305,22 @@ type bracePattern struct {
325
305
/* parse {{{ */
326
306
327
307
func parseClass (sc * scanner , allowset bool ) class {
328
- ch := sc .Peek ()
308
+ ch := sc .Next ()
329
309
switch ch {
330
310
case '%' :
331
- sc .Next ()
332
311
return & singleClass {sc .Next ()}
333
312
case '.' :
334
- sc .Next ()
335
313
return & dotClass {}
336
314
case '[' :
337
315
if ! allowset {
338
316
panic (newError (sc .CurrentPos (), "invalid '['" ))
339
317
}
340
- sc .Next ()
341
318
return parseClassSet (sc )
342
319
//case '^' '$', '(', ')', ']', '*', '+', '-', '?':
343
320
// panic(newError(sc.CurrentPos(), "invalid %c", ch))
344
321
case _EOS :
345
322
panic (newError (sc .CurrentPos (), "unexpected EOS" ))
346
323
default :
347
- sc .Next ()
348
324
return & charClass {ch }
349
325
}
350
326
}
@@ -421,19 +397,23 @@ func parsePattern(sc *scanner, toplevel bool) *seqPattern {
421
397
case '.' , '[' :
422
398
pat .Patterns = append (pat .Patterns , & singlePattern {parseClass (sc , true )})
423
399
case ']' :
424
- panic (newError (sc .CurrentPos (), "invalid '%c'" , ch ))
400
+ panic (newError (sc .CurrentPos (), "invalid ']'" ))
425
401
case ')' :
426
- sc .CloseBlace ()
427
- sc .Next ()
402
+ if toplevel {
403
+ panic (newError (sc .CurrentPos (), "invalid ')'" ))
404
+ }
428
405
return pat
429
406
case '(' :
430
407
sc .Next ()
431
408
if sc .Peek () == ')' {
432
409
sc .Next ()
433
410
pat .Patterns = append (pat .Patterns , & posCapPattern {})
434
411
} else {
435
- sc .OpenBlace ()
436
412
ret := & capPattern {parsePattern (sc , false )}
413
+ if sc .Peek () != ')' {
414
+ panic (newError (sc .CurrentPos (), "unfinished capture" ))
415
+ }
416
+ sc .Next ()
437
417
pat .Patterns = append (pat .Patterns , ret )
438
418
}
439
419
case '*' , '+' , '-' , '?' :
@@ -463,12 +443,6 @@ func parsePattern(sc *scanner, toplevel bool) *seqPattern {
463
443
}
464
444
}
465
445
exit:
466
- if toplevel {
467
- if sc .HasUnfinishedBlace () {
468
- panic (newError (sc .CurrentPos (), "unfinished capture" ))
469
- }
470
- }
471
-
472
446
return pat
473
447
}
474
448
0 commit comments