MCPcopy Create free account
hub / github.com/yuin/gopher-lua / parsePattern

Function parsePattern

pm/pm.go:380–456  ·  view source on GitHub ↗
(sc *scanner, toplevel bool)

Source from the content-addressed store, hash-verified

378}
379
380func parsePattern(sc *scanner, toplevel bool) *seqPattern {
381 pat := &seqPattern{}
382 if toplevel {
383 if sc.Peek() == '^' {
384 sc.Next()
385 pat.MustHead = true
386 }
387 }
388 for {
389 ch := sc.Peek()
390 switch ch {
391 case '%':
392 sc.Save()
393 sc.Next()
394 switch sc.Peek() {
395 case '0':
396 panic(newError(sc.CurrentPos(), "invalid capture index"))
397 case '1', '2', '3', '4', '5', '6', '7', '8', '9':
398 pat.Patterns = append(pat.Patterns, &numberPattern{sc.Next() - 48})
399 case 'b':
400 sc.Next()
401 pat.Patterns = append(pat.Patterns, &bracePattern{sc.Next(), sc.Next()})
402 default:
403 sc.Restore()
404 pat.Patterns = append(pat.Patterns, &singlePattern{parseClass(sc, true)})
405 }
406 case '.', '[', ']':
407 pat.Patterns = append(pat.Patterns, &singlePattern{parseClass(sc, true)})
408 //case ']':
409 // panic(newError(sc.CurrentPos(), "invalid ']'"))
410 case ')':
411 if toplevel {
412 panic(newError(sc.CurrentPos(), "invalid ')'"))
413 }
414 return pat
415 case '(':
416 sc.Next()
417 if sc.Peek() == ')' {
418 sc.Next()
419 pat.Patterns = append(pat.Patterns, &posCapPattern{})
420 } else {
421 ret := &capPattern{parsePattern(sc, false)}
422 if sc.Peek() != ')' {
423 panic(newError(sc.CurrentPos(), "unfinished capture"))
424 }
425 sc.Next()
426 pat.Patterns = append(pat.Patterns, ret)
427 }
428 case '*', '+', '-', '?':
429 sc.Next()
430 if len(pat.Patterns) > 0 {
431 spat, ok := pat.Patterns[len(pat.Patterns)-1].(*singlePattern)
432 if ok {
433 pat.Patterns = pat.Patterns[0 : len(pat.Patterns)-1]
434 pat.Patterns = append(pat.Patterns, &repeatPattern{ch, spat.Class})
435 continue
436 }
437 }

Callers 1

FindFunction · 0.85

Calls 9

newErrorFunction · 0.85
parseClassFunction · 0.85
SaveMethod · 0.80
CurrentPosMethod · 0.80
RestoreMethod · 0.80
NextPosMethod · 0.80
LengthMethod · 0.80
PeekMethod · 0.45
NextMethod · 0.45

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…