...
Run Format

Source file src/text/scanner/example_test.go

Documentation: text/scanner

  // Copyright 2018 The Go Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style
  // license that can be found in the LICENSE file.
  
  package scanner_test
  
  import (
  	"fmt"
  	"strings"
  	"text/scanner"
  	"unicode"
  )
  
  func Example() {
  	const src = `
  // This is scanned code.
  if a > 10 {
  	someParsable = text
  }`
  
  	var s scanner.Scanner
  	s.Init(strings.NewReader(src))
  	s.Filename = "example"
  	for tok := s.Scan(); tok != scanner.EOF; tok = s.Scan() {
  		fmt.Printf("%s: %s\n", s.Position, s.TokenText())
  	}
  
  	// Output:
  	// example:3:1: if
  	// example:3:4: a
  	// example:3:6: >
  	// example:3:8: 10
  	// example:3:11: {
  	// example:4:2: someParsable
  	// example:4:15: =
  	// example:4:17: text
  	// example:5:1: }
  }
  
  func Example_isIdentRune() {
  	const src = "%var1 var2%"
  
  	var s scanner.Scanner
  	s.Init(strings.NewReader(src))
  	s.Filename = "default"
  
  	for tok := s.Scan(); tok != scanner.EOF; tok = s.Scan() {
  		fmt.Printf("%s: %s\n", s.Position, s.TokenText())
  	}
  
  	fmt.Println()
  	s.Init(strings.NewReader(src))
  	s.Filename = "percent"
  
  	// treat leading '%' as part of an identifier
  	s.IsIdentRune = func(ch rune, i int) bool {
  		return ch == '%' && i == 0 || unicode.IsLetter(ch) || unicode.IsDigit(ch) && i > 0
  	}
  
  	for tok := s.Scan(); tok != scanner.EOF; tok = s.Scan() {
  		fmt.Printf("%s: %s\n", s.Position, s.TokenText())
  	}
  
  	// Output:
  	// default:1:1: %
  	// default:1:2: var1
  	// default:1:7: var2
  	// default:1:11: %
  	//
  	// percent:1:1: %var1
  	// percent:1:7: var2
  	// percent:1:11: %
  }
  
  func Example_mode() {
  	const src = `
      // Comment begins at column 5.
  
  This line should not be included in the output.
  
  /*
  This multiline comment
  should be extracted in
  its entirety.
  */
  `
  
  	var s scanner.Scanner
  	s.Init(strings.NewReader(src))
  	s.Filename = "comments"
  	s.Mode ^= scanner.SkipComments // don't skip comments
  
  	for tok := s.Scan(); tok != scanner.EOF; tok = s.Scan() {
  		txt := s.TokenText()
  		if strings.HasPrefix(txt, "//") || strings.HasPrefix(txt, "/*") {
  			fmt.Printf("%s: %s\n", s.Position, txt)
  		}
  	}
  
  	// Output:
  	// comments:2:5: // Comment begins at column 5.
  	// comments:6:1: /*
  	// This multiline comment
  	// should be extracted in
  	// its entirety.
  	// */
  }
  
  func Example_whitespace() {
  	// tab-separated values
  	const src = `aa	ab	ac	ad
  ba	bb	bc	bd
  ca	cb	cc	cd
  da	db	dc	dd`
  
  	var (
  		col, row int
  		s        scanner.Scanner
  		tsv      [4][4]string // large enough for example above
  	)
  	s.Init(strings.NewReader(src))
  	s.Whitespace ^= 1<<'\t' | 1<<'\n' // don't skip tabs and new lines
  
  	for tok := s.Scan(); tok != scanner.EOF; tok = s.Scan() {
  		switch tok {
  		case '\n':
  			row++
  			col = 0
  		case '\t':
  			col++
  		default:
  			tsv[row][col] = s.TokenText()
  		}
  	}
  
  	fmt.Print(tsv)
  
  	// Output:
  	// [[aa ab ac ad] [ba bb bc bd] [ca cb cc cd] [da db dc dd]]
  }
  

View as plain text