example_test.go 2.7 KB

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