?
本文檔使用 php中文網(wǎng)手冊(cè) 發(fā)布
import "go/scanner"
Overview
Index
Examples
Package scanner為Go源文本實(shí)現(xiàn)掃描器。它需要一個(gè)[]字節(jié)作為源,然后可以通過(guò)重復(fù)調(diào)用Scan方法來(lái)進(jìn)行標(biāo)記。
func PrintError(w io.Writer, err error)
type Error
func (e Error) Error() string
type ErrorHandler
type ErrorList
func (p *ErrorList) Add(pos token.Position, msg string)
func (p ErrorList) Err() error
func (p ErrorList) Error() string
func (p ErrorList) Len() int
func (p ErrorList) Less(i, j int) bool
func (p *ErrorList) RemoveMultiples()
func (p *ErrorList) Reset()
func (p ErrorList) Sort()
func (p ErrorList) Swap(i, j int)
type Mode
type Scanner
func (s *Scanner) Init(file *token.File, src []byte, err ErrorHandler, mode Mode)
func (s *Scanner) Scan() (pos token.Pos, tok token.Token, lit string)
Scanner.Scan
errors.go scanner.go
func PrintError(w io.Writer, err error)
PrintError是一個(gè)實(shí)用程序函數(shù),如果err參數(shù)是ErrorList,則會(huì)向w打印一個(gè)錯(cuò)誤列表,每行一個(gè)錯(cuò)誤。否則,它會(huì)打印錯(cuò)誤字符串。
在ErrorList中,錯(cuò)誤由* Error表示。Pos位置(如果有效)指向有問(wèn)題的令牌的開(kāi)始,錯(cuò)誤情況由Msg描述。
type Error struct { Pos token.Position Msg string}
func (e Error) Error() string
Error實(shí)現(xiàn)了錯(cuò)誤接口。
一個(gè)ErrorHandler可以提供給Scanner.Init。如果遇到語(yǔ)法錯(cuò)誤并且安裝了處理程序,則會(huì)使用位置和錯(cuò)誤消息調(diào)用處理程序。位置指向違規(guī)令牌的開(kāi)始。
type ErrorHandler func(pos token.Position, msg string)
ErrorList是*錯(cuò)誤的列表。ErrorList的零值是一個(gè)空的ErrorList,可以使用。
type ErrorList []*Error
func (p *ErrorList) Add(pos token.Position, msg string)
Add添加一個(gè)給定位置和錯(cuò)誤消息的錯(cuò)誤到一個(gè)ErrorList。
func (p ErrorList) Err() error
Err返回等同于此錯(cuò)誤列表的錯(cuò)誤。如果列表為空,則Err返回nil。
func (p ErrorList) Error() string
ErrorList實(shí)現(xiàn)錯(cuò)誤接口。
func (p ErrorList) Len() int
ErrorList實(shí)現(xiàn)排序接口。
func (p ErrorList) Less(i, j int) bool
func (p *ErrorList) RemoveMultiples()
RemoveMultiples對(duì)一個(gè)ErrorList進(jìn)行排序并刪除每行的第一個(gè)錯(cuò)誤。
func (p *ErrorList) Reset()
重置將錯(cuò)誤列表重置為無(wú)錯(cuò)誤。
func (p ErrorList) Sort()
Sort排序錯(cuò)誤列表。*錯(cuò)誤條目按位置排序,其他錯(cuò)誤按錯(cuò)誤消息排序,并且在任何*錯(cuò)誤條目之前。
func (p ErrorList) Swap(i, j int)
mode值是一組標(biāo)志(或0)。他們控制掃描儀行為。
type Mode uint
const ( ScanComments Mode = 1 << iota // return comments as COMMENT tokens)
Scanner在處理給定文本時(shí)保存掃描儀的內(nèi)部狀態(tài)。它可以作為另一個(gè)數(shù)據(jù)結(jié)構(gòu)的一部分進(jìn)行分配,但必須在使用前通過(guò)Init進(jìn)行初始化。
type Scanner struct { // public state - ok to modify ErrorCount int // number of errors encountered // contains filtered or unexported fields}
func (s *Scanner) Init(file *token.File, src []byte, err ErrorHandler, mode Mode)
Init通過(guò)將掃描器設(shè)置為src的開(kāi)頭來(lái)準(zhǔn)備掃描器來(lái)標(biāo)記文本src。掃描儀使用文件集文件獲取位置信息,并為每行添加行信息。當(dāng)重新掃描相同的文件時(shí),重新使用同一文件是可以的,因?yàn)橐呀?jīng)存在的行信息將被忽略。如果文件大小與src大小不匹配,則Init會(huì)導(dǎo)致混亂。
如果遇到語(yǔ)法錯(cuò)誤并且err不為零,則調(diào)用掃描將調(diào)用錯(cuò)誤處理程序err。此外,對(duì)于遇到的每個(gè)錯(cuò)誤,掃描器字段ErrorCount都會(huì)加1。模式參數(shù)決定如何處理注釋。
請(qǐng)注意,如果文件的第一個(gè)字符有錯(cuò)誤,Init可能會(huì)調(diào)用err。
func (s *Scanner) Scan() (pos token.Pos, tok token.Token, lit string)
Scan掃描下一個(gè)標(biāo)記并返回標(biāo)記位置,標(biāo)記及其文字字符串(如果適用)。源端由token.EOF指示。
如果返回的標(biāo)記是文字(token.IDENT,token.INT,token.FLOAT,token.IMAG,token.CHAR,token.STRING)或token.COMMENT,則文字字符串具有相應(yīng)的值。
如果返回的標(biāo)記是關(guān)鍵字,則字符串是關(guān)鍵字。
如果返回的令牌是token.SEMICOLON,則相應(yīng)的文字字符串是“;” 如果分號(hào)存在于源中,則“\ n”如果由于換行符或EOF而插入了分號(hào)。
如果返回的標(biāo)記是token.ILLEGAL,則文字字符串是違規(guī)字符。
在其他所有情況下,Scan會(huì)返回一個(gè)空的文字字符串。
對(duì)于更寬容的解析,如果可能,即使遇到語(yǔ)法錯(cuò)誤,Scan也會(huì)返回有效的令牌。因此,即使生成的令牌序列不包含非法令牌,客戶端也不能認(rèn)為沒(méi)有發(fā)生錯(cuò)誤。相反,它必須檢查掃描器的ErrorCount或錯(cuò)誤處理程序的調(diào)用次數(shù),如果安裝了一個(gè)。
Scan 行信息添加到添加到Init文件集的文件中。令牌位置與該文件相關(guān),因此與文件集有關(guān)。
package mainimport ("fmt""go/scanner""go/token")func main() {// src is the input that we want to tokenize. src := []byte("cos(x) + 1i*sin(x) // Euler")// Initialize the scanner.var s scanner.Scanner fset := token.NewFileSet() // positions are relative to fset file := fset.AddFile("", fset.Base(), len(src)) // register input "file" s.Init(file, src, nil /* no error handler */, scanner.ScanComments)// Repeated calls to Scan yield the token sequence found in the input.for { pos, tok, lit := s.Scan()if tok == token.EOF {break} fmt.Printf("%s\t%s\t%q\n", fset.Position(pos), tok, lit)}}