github.com/guyezi/gofrontend@v0.0.0-20200228202240-7a62a49e62c0/libgo/go/text/scanner/example_test.go (about) 1 // Copyright 2018 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package scanner_test 6 7 import ( 8 "fmt" 9 "strings" 10 "text/scanner" 11 "unicode" 12 ) 13 14 func Example() { 15 const src = ` 16 // This is scanned code. 17 if a > 10 { 18 someParsable = text 19 }` 20 21 var s scanner.Scanner 22 s.Init(strings.NewReader(src)) 23 s.Filename = "example" 24 for tok := s.Scan(); tok != scanner.EOF; tok = s.Scan() { 25 fmt.Printf("%s: %s\n", s.Position, s.TokenText()) 26 } 27 28 // Output: 29 // example:3:1: if 30 // example:3:4: a 31 // example:3:6: > 32 // example:3:8: 10 33 // example:3:11: { 34 // example:4:2: someParsable 35 // example:4:15: = 36 // example:4:17: text 37 // example:5:1: } 38 } 39 40 func Example_isIdentRune() { 41 const src = "%var1 var2%" 42 43 var s scanner.Scanner 44 s.Init(strings.NewReader(src)) 45 s.Filename = "default" 46 47 for tok := s.Scan(); tok != scanner.EOF; tok = s.Scan() { 48 fmt.Printf("%s: %s\n", s.Position, s.TokenText()) 49 } 50 51 fmt.Println() 52 s.Init(strings.NewReader(src)) 53 s.Filename = "percent" 54 55 // treat leading '%' as part of an identifier 56 s.IsIdentRune = func(ch rune, i int) bool { 57 return ch == '%' && i == 0 || unicode.IsLetter(ch) || unicode.IsDigit(ch) && i > 0 58 } 59 60 for tok := s.Scan(); tok != scanner.EOF; tok = s.Scan() { 61 fmt.Printf("%s: %s\n", s.Position, s.TokenText()) 62 } 63 64 // Output: 65 // default:1:1: % 66 // default:1:2: var1 67 // default:1:7: var2 68 // default:1:11: % 69 // 70 // percent:1:1: %var1 71 // percent:1:7: var2 72 // percent:1:11: % 73 } 74 75 func Example_mode() { 76 const src = ` 77 // Comment begins at column 5. 78 79 This line should not be included in the output. 80 81 /* 82 This multiline comment 83 should be extracted in 84 its entirety. 85 */ 86 ` 87 88 var s scanner.Scanner 89 s.Init(strings.NewReader(src)) 90 s.Filename = "comments" 91 s.Mode ^= scanner.SkipComments // don't skip comments 92 93 for tok := s.Scan(); tok != scanner.EOF; tok = s.Scan() { 94 txt := s.TokenText() 95 if strings.HasPrefix(txt, "//") || strings.HasPrefix(txt, "/*") { 96 fmt.Printf("%s: %s\n", s.Position, txt) 97 } 98 } 99 100 // Output: 101 // comments:2:5: // Comment begins at column 5. 102 // comments:6:1: /* 103 // This multiline comment 104 // should be extracted in 105 // its entirety. 106 // */ 107 } 108 109 func Example_whitespace() { 110 // tab-separated values 111 const src = `aa ab ac ad 112 ba bb bc bd 113 ca cb cc cd 114 da db dc dd` 115 116 var ( 117 col, row int 118 s scanner.Scanner 119 tsv [4][4]string // large enough for example above 120 ) 121 s.Init(strings.NewReader(src)) 122 s.Whitespace ^= 1<<'\t' | 1<<'\n' // don't skip tabs and new lines 123 124 for tok := s.Scan(); tok != scanner.EOF; tok = s.Scan() { 125 switch tok { 126 case '\n': 127 row++ 128 col = 0 129 case '\t': 130 col++ 131 default: 132 tsv[row][col] = s.TokenText() 133 } 134 } 135 136 fmt.Print(tsv) 137 138 // Output: 139 // [[aa ab ac ad] [ba bb bc bd] [ca cb cc cd] [da db dc dd]] 140 }