code: func (s *Scanner) next() rune {
  	ch, size, err := s.buf.ReadRune()
  	if err != nil {
  		// advance for error reporting
  		s.srcPos.Column++
  		s.srcPos.Offset += size
  		s.lastCharLen = size
  		return eof
  	}
  
  	// remember last position
  	s.prevPos = s.srcPos
  
  	s.srcPos.Column++
  	s.lastCharLen = size
  	s.srcPos.Offset += size
  
  	if ch == utf8.RuneError && size == 1 {
  		s.err("illegal UTF-8 encoding")
  		return ch
  	}
  
  	if ch == '\n' {
  		s.srcPos.Line++
  		s.lastLineLen = s.srcPos.Column
  		s.srcPos.Column = 0
  	}
  
  	if ch == '\x00' {
  		s.err("unexpected null character (0x00)")
  		return eof
  	}
  
  	if ch == '\uE123' {
  		s.err("unicode code point U+E123 reserved for internal use")
  		return utf8.RuneError
  	}
  
  	// debug
  	// fmt.Printf("ch: %q, offset:column: %d:%d\n", ch, s.srcPos.Offset, s.srcPos.Column)
  	return ch
  }
docs: // next reads the next rune from the bufferred reader. Returns the rune(0) if
  // an error occurs (or io.EOF is returned).