| |
| |
| |
|
|
| 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()) |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| } |
|
|
| 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" |
|
|
| |
| 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()) |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| } |
|
|
| 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 |
|
|
| 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) |
| } |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| } |
|
|
| func Example_whitespace() { |
| |
| 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 |
| ) |
| s.Init(strings.NewReader(src)) |
| s.Whitespace ^= 1<<'\t' | 1<<'\n' |
|
|
| 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) |
|
|
| |
| |
| } |
|
|