?
本文檔使用 php中文網(wǎng)手冊(cè) 發(fā)布
import "text/scanner"
概觀
索引
示例
程序包掃描程序?yàn)?UTF-8 編碼的文本提供掃描程序和標(biāo)記程序。它需要一個(gè)提供源的 io.Reader ,然后可以通過(guò)重復(fù)調(diào)用掃描功能對(duì)其進(jìn)行標(biāo)記。為了與現(xiàn)有工具兼容, NUL 字符是不允許的。如果源中的第一個(gè)字符是 UTF-8 編碼的字節(jié)順序標(biāo)記 (BOM) ,它將被丟棄。
默認(rèn)情況下,掃描程序會(huì)跳過(guò)空格并執(zhí)行注釋并識(shí)別 Go 語(yǔ)言規(guī)范定義的所有文字。它可以被定制為僅識(shí)別這些文字的一個(gè)子集并識(shí)別不同的標(biāo)識(shí)符和空白字符。
package mainimport ("fmt""strings""text/scanner")func main() {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 TokenString(tok rune) string
type Position
func (pos *Position) IsValid() bool
func (pos Position) String() string
type Scanner
func (s *Scanner) Init(src io.Reader) *Scanner
func (s *Scanner) Next() rune
func (s *Scanner) Peek() rune
func (s *Scanner) Pos() (pos Position)
func (s *Scanner) Scan() rune
func (s *Scanner) TokenText() string
打包
scanner.go
預(yù)定義的模式位控制令牌的識(shí)別。例如,要配置掃描儀,使其僅識(shí)別 (Go) 標(biāo)識(shí)符,整數(shù)并跳過(guò)注釋,請(qǐng)將掃描儀的模式字段設(shè)置為:
ScanIdents | ScanInts | SkipComments
除注釋外,如果設(shè)置了 SkipComments ,將跳過(guò)注釋,但不會(huì)忽略無(wú)法識(shí)別的令牌。相反,掃描儀只是返回相應(yīng)的單個(gè)字符(或可能是子令牌)。例如,如果模式是 ScanIdents(而不是 ScanStrings ) ,則將字符串“ foo ”作為標(biāo)記序列'' 'Ident '''進(jìn)行掃描。
const ( ScanIdents = 1 << -Ident ScanInts = 1 << -Int ScanFloats = 1 << -Float // includes Ints ScanChars = 1 << -Char ScanStrings = 1 << -String ScanRawStrings = 1 << -RawString ScanComments = 1 << -Comment SkipComments = 1 << -skipComment // if set with ScanComments, comments become white space GoTokens = ScanIdents | ScanFloats | ScanChars | ScanStrings | ScanRawStrings | ScanComments | SkipComments)
Scan 的結(jié)果是這些標(biāo)志或 Unicode 字符之一。
const ( EOF = -(iota + 1) Ident Int Float Char String RawString Comment)
GoWhitespace 是掃描儀空白字段的默認(rèn)值。它的值選擇 Go 的空白字符。
const GoWhitespace = 1<<'\t' | 1<<'\n' | 1<<'\r' | 1<<' '
func TokenString(tok rune) string
TokenString 為標(biāo)志或 Unicode 字符返回可打印的字符串。
源位置由位置值表示。如果 Line> 0,則位置有效。
type Position struct { Filename string // filename, if any Offset int // byte offset, starting at 0 Line int // line number, starting at 1 Column int // column number, starting at 1 (character count per line)}
func (pos *Position) IsValid() bool
IsValid 報(bào)告該位置是否有效。
func (pos Position) String() string
掃描儀實(shí)現(xiàn)從 io.Reader 讀取 Unicode 字符和標(biāo)記。
type Scanner struct { // Error is called for each error encountered. If no Error // function is set, the error is reported to os.Stderr. Error func(s *Scanner, msg string) // ErrorCount is incremented by one for each error encountered. ErrorCount int // The Mode field controls which tokens are recognized. For instance, // to recognize Ints, set the ScanInts bit in Mode. The field may be // changed at any time. Mode uint // The Whitespace field controls which characters are recognized // as white space. To recognize a character ch <= ' ' as white space, // set the ch'th bit in Whitespace (the Scanner's behavior is undefined // for values ch > ' '). The field may be changed at any time. Whitespace uint64 // IsIdentRune is a predicate controlling the characters accepted // as the ith rune in an identifier. The set of valid characters // must not intersect with the set of white space characters. // If no IsIdentRune function is set, regular Go identifiers are // accepted instead. The field may be changed at any time. IsIdentRune func(ch rune, i int) bool // Start position of most recently scanned token; set by Scan. // Calling Init or Next invalidates the position (Line == 0). // The Filename field is always left untouched by the Scanner. // If an error is reported (via Error) and Position is invalid, // the scanner is not inside a token. Call Pos to obtain an error // position in that case, or to obtain the position immediately // after the most recently scanned token. Position // contains filtered or unexported fields}
func (s *Scanner) Init(src io.Reader) *Scanner
Init 用新源初始化掃描儀并返回 s 。錯(cuò)誤設(shè)置為零, ErrorCount 設(shè)置為0,模式設(shè)置為 GoTokens ,并且空白設(shè)置為 GoWhitespace 。
func (s *Scanner) Next() rune
接下來(lái)讀取并返回下一個(gè) Unicode 字符。它在源的末尾返回 EOF 。它通過(guò)調(diào)用 s.Error 來(lái)報(bào)告讀取錯(cuò)誤,如果不是零; 否則它會(huì)向 os.Stderr 輸出一條錯(cuò)誤消息。接下來(lái)不更新掃描儀的位置字段; 使用 Pos() 來(lái)獲取當(dāng)前位置。
func (s *Scanner) Peek() rune
Peek 將返回源中的下一個(gè) Unicode 字符,而不會(huì)推進(jìn)掃描程序。如果掃描儀的位置在源的最后一個(gè)字符處,它會(huì)返回 EOF 。
func (s *Scanner) Pos() (pos Position)
Pos 返回最后一次調(diào)用 Next 或 Scan 時(shí)返回的字符或標(biāo)記之后的字符位置。將掃描儀的位置字段用于最近掃描的標(biāo)記的開(kāi)始位置。
func (s *Scanner) Scan() rune
掃描從源讀取下一個(gè)標(biāo)記或Unicode字符并將其返回。它只識(shí)別設(shè)置了相應(yīng)模式位 (1<<-t) 的標(biāo)志 t 。它在源的末尾返回 EOF 。它通過(guò)調(diào)用 s.Error 來(lái)報(bào)告掃描器錯(cuò)誤(讀取和令牌錯(cuò)誤),如果不是零; 否則它會(huì)向 os.Stder r輸出一條錯(cuò)誤消息。
func (s *Scanner) TokenText() string
TokenText 返回對(duì)應(yīng)于最近掃描的標(biāo)記的字符串。調(diào)用 Scan() 后有效。