JSゆるふわめも

がっこうでべんきょうしたことをめもがきしてます

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
  • { ( などはそのまま