text/scanner
Package scanner provides a scanner and tokenizer for UTF-8-encoded text. It takes an io.Reader providing the source, which then can be tokenized through repeated calls to the Scan function. For compatibility with existing tools, the NUL character is not allowed. If the first character in the source is a UTF-8 encoded byte order mark (BOM), it is discarded.
By default, a Scanner skips white space and Go comments and recognizes all literals as defined by the Go language specification. It may be customized to recognize only a subset of those literals and to recognize different identifier and white space characters.
スキャナパッケージはUTF-8エンコーディングされたテキストを対象にしたscannerとtokenizerを持っている。Scanメソッドを繰り返し呼び出すことで、ソースコードが記述されたio.Readerをtokenizedできる。既存のツールとの互換性を維持するために、ヌル文字は使用することができない。もしソースコードの先頭にBOMが付いていても無視される。
基本的にScannerは空白文字とコメントは読み飛ばし、Go言語仕様で定義された全てのリテラル値をパースする。しかし、scannerは異なるルールのソースコードをパースするためにカスタマイズされている場合もある。
サンプル
import ( "fmt" "strings" "text/scanner" ) func main() { const c = ` // This is scanned code. var i int var s string = "text" if a > 10 { someParsable = text }` var s scanner.Scanner s.Init(strings.NewReader(c)) s.Filename = "test" for tok := s.Scan(); tok != scanner.EOF; tok = s.Scan() { fmt.Printf("%s:%v %v\n", s.Position, scanner.TokenString(tok), s.TokenText()) } }
実行結果
test:3:1:Ident var test:3:5:Ident i test:3:7:Ident int test:4:1:Ident var test:4:5:Ident s test:4:7:Ident string test:4:14:"=" = test:4:16:String "text" test:5:1:Ident if test:5:4:Ident a test:5:6:">" > test:5:8:Int 10 test:5:11:"{" { test:6:2:Ident someParsable test:6:15:"=" = test:6:17:Ident text test:7:1:"}" }
Scanメソッドの返り値は
- リテラル値は型
- 変数・関数名(上記以外のもの)はIdent
- { ( などはそのまま