Lines Matching full:sc
266 sc := &scanner{
272 sc.readline, _ = src.(func() ([]byte, error)) // ParseCompoundStmt (REPL) only
273 if sc.readline == nil {
278 sc.rest = data
280 return sc, nil
315 func (sc *scanner) error(pos Position, s string) {
319 func (sc *scanner) errorf(pos Position, format string, args ...interface{}) {
320 sc.error(pos, fmt.Sprintf(format, args...))
323 func (sc *scanner) recover(err *error) {
334 *err = Error{sc.pos, fmt.Sprintf("internal error: %v", e)}
342 func (sc *scanner) eof() bool {
343 return len(sc.rest) == 0 && !sc.readLine()
347 // Precondition: len(sc.rest)==0.
348 func (sc *scanner) readLine() bool {
349 if sc.readline != nil {
351 sc.rest, err = sc.readline()
353 sc.errorf(sc.pos, "%v", err) // EOF or ErrInterrupt
355 return len(sc.rest) > 0
362 func (sc *scanner) peekRune() rune {
364 if sc.eof() {
369 if b := sc.rest[0]; b < utf8.RuneSelf {
376 r, _ := utf8.DecodeRune(sc.rest)
382 func (sc *scanner) readRune() rune {
385 if len(sc.rest) == 0 {
386 if !sc.readLine() {
387 sc.error(sc.pos, "internal scanner error: readRune at EOF")
390 if len(sc.rest) == 0 {
396 if b := sc.rest[0]; b < utf8.RuneSelf {
398 sc.rest = sc.rest[1:]
400 if len(sc.rest) > 0 && sc.rest[0] == '\n' {
401 sc.rest = sc.rest[1:]
406 sc.pos.Line++
407 sc.pos.Col = 1
409 sc.pos.Col++
414 r, size := utf8.DecodeRune(sc.rest)
415 sc.rest = sc.rest[size:]
416 sc.pos.Col++
433 func (sc *scanner) startToken(val *tokenValue) {
434 sc.token = sc.rest
436 val.pos = sc.pos
442 func (sc *scanner) endToken(val *tokenValue) {
444 val.raw = string(sc.token[:len(sc.token)-len(sc.rest)])
456 func (sc *scanner) nextToken(val *tokenValue) Token {
481 savedLineStart := sc.lineStart
482 if sc.lineStart {
483 sc.lineStart = false
486 c = sc.peekRune()
489 sc.readRune()
492 col += int(tab - (sc.pos.Col-1)%tab)
493 sc.readRune()
506 if !blank && sc.depth == 0 {
507 cur := sc.indentstk[len(sc.indentstk)-1]
510 sc.dents++
511 sc.indentstk = append(sc.indentstk, col)
514 for len(sc.indentstk) > 0 && col < sc.indentstk[len(sc.indentstk)-1] {
515 sc.dents--
516 sc.indentstk = sc.indentstk[:len(sc.indentstk)-1] // pop
518 if col != sc.indentstk[len(sc.indentstk)-1] {
519 sc.error(sc.pos, "unindent does not match any outer indentation level")
526 if sc.dents != 0 {
527 sc.startToken(val)
528 sc.endToken(val)
529 if sc.dents < 0 {
530 sc.dents++
533 sc.dents--
539 c = sc.peekRune()
543 sc.readRune()
544 c = sc.peekRune()
549 if sc.keepComments {
550 sc.startToken(val)
554 sc.readRune()
555 c = sc.peekRune()
557 if sc.keepComments {
558 sc.endToken(val)
560 sc.lineComments = append(sc.lineComments, Comment{val.pos, val.raw})
562 sc.suffixComments = append(sc.suffixComments, Comment{val.pos, val.raw})
569 sc.lineStart = true
572 if sc.depth > 0 {
573 sc.readRune()
580 if sc.readline == nil {
581 sc.readRune()
583 } else if len(sc.indentstk) > 1 {
584 sc.dents = 1 - len(sc.indentstk)
585 sc.indentstk = sc.indentstk[:1]
591 sc.startToken(val)
592 sc.readRune()
601 if len(sc.indentstk) > 1 {
603 sc.dents = 1 - len(sc.indentstk)
604 sc.indentstk = sc.indentstk[:1]
607 sc.lineStart = true
608 sc.startToken(val)
614 sc.startToken(val)
615 sc.endToken(val)
621 sc.readRune()
622 if sc.peekRune() != '\n' {
623 sc.errorf(sc.pos, "stray backslash in program")
625 sc.readRune()
630 sc.startToken(val)
634 sc.readRune()
635 sc.endToken(val)
641 return sc.scanString(val, c)
646 if (c == 'r' || c == 'b') && len(sc.rest) > 1 && (sc.rest[1] == '"' || sc.rest[1] == '\'') {
649 sc.readRune()
650 c = sc.peekRune()
651 return sc.scanString(val, c)
652 …} else if c == 'r' && len(sc.rest) > 2 && sc.rest[1] == 'b' && (sc.rest[2] == '"' || sc.rest[2] ==…
654 sc.readRune()
655 sc.readRune()
656 c = sc.peekRune()
657 return sc.scanString(val, c)
661 sc.readRune()
662 c = sc.peekRune()
664 sc.endToken(val)
675 sc.depth++
676 sc.readRune()
677 sc.endToken(val)
689 if sc.depth == 0 {
690 sc.errorf(sc.pos, "unexpected %q", c)
692 sc.depth--
694 sc.readRune()
695 sc.endToken(val)
709 return sc.scanNumber(val, c)
713 defer sc.endToken(val)
716 start := sc.pos
717 sc.readRune()
718 if sc.peekRune() == '=' {
719 sc.readRune()
749 if sc.peekRune() == '<' {
750 sc.readRune()
751 if sc.peekRune() == '=' {
752 sc.readRune()
760 if sc.peekRune() == '>' {
761 sc.readRune()
762 if sc.peekRune() == '=' {
763 sc.readRune()
771 sc.error(start, "unexpected input character '!'")
777 if sc.peekRune() == '/' {
778 sc.readRune()
779 if sc.peekRune() == '=' {
780 sc.readRune()
799 sc.readRune()
811 sc.readRune()
812 switch sc.peekRune() {
814 sc.readRune()
817 sc.readRune()
823 sc.errorf(sc.pos, "unexpected input character %#q", c)
827 func (sc *scanner) scanString(val *tokenValue, quote rune) Token {
828 start := sc.pos
829 …triple := len(sc.rest) >= 3 && sc.rest[0] == byte(quote) && sc.rest[1] == byte(quote) && sc.rest[2…
830 sc.readRune()
835 // as it assumes sc.rest is unchanged since startToken.
841 raw.Write(sc.token[:len(sc.token)-len(sc.rest)])
846 if sc.eof() {
847 sc.error(val.pos, "unexpected EOF in string")
849 c := sc.readRune()
855 sc.error(val.pos, "unexpected newline in string")
858 if sc.eof() {
859 sc.error(val.pos, "unexpected EOF in string")
861 c = sc.readRune()
867 sc.readRune()
869 sc.readRune()
874 if sc.eof() {
875 sc.error(val.pos, "unexpected EOF in string")
877 c := sc.readRune()
888 if sc.eof() {
889 sc.error(val.pos, "unexpected EOF in string")
891 c = sc.readRune()
900 sc.error(start, err.Error())
910 func (sc *scanner) scanNumber(val *tokenValue, c rune) Token {
919 start := sc.pos
924 sc.readRune()
925 c = sc.peekRune()
927 sc.endToken(val)
933 sc.readRune()
934 c = sc.peekRune()
940 sc.readRune()
941 c = sc.peekRune()
943 sc.error(start, "invalid hex literal")
946 sc.readRune()
947 c = sc.peekRune()
951 sc.readRune()
952 c = sc.peekRune()
954 sc.error(sc.pos, "invalid octal literal")
957 sc.readRune()
958 c = sc.peekRune()
962 sc.readRune()
963 c = sc.peekRune()
965 sc.error(sc.pos, "invalid binary literal")
968 sc.readRune()
969 c = sc.peekRune()
981 sc.readRune()
982 c = sc.peekRune()
989 sc.endToken(val)
990 sc.errorf(sc.pos, "obsolete form of octal literal; use 0o%s", val.raw[1:])
996 sc.readRune()
997 c = sc.peekRune()
1008 sc.readRune() // consume '.'
1009 c = sc.peekRune()
1011 sc.readRune()
1012 c = sc.peekRune()
1021 sc.readRune() // consume [eE]
1022 c = sc.peekRune()
1024 sc.readRune()
1025 c = sc.peekRune()
1027 sc.error(sc.pos, "invalid float literal")
1031 sc.readRune()
1032 c = sc.peekRune()
1036 sc.endToken(val)
1041 sc.error(sc.pos, "invalid float literal")
1064 sc.error(start, "invalid int literal")