©
本文档使用 PHP中文网手册 发布
import "go/scanner"
Overview
Index
Examples
Package scanner为Go源文本实现扫描器。它需要一个[]字节作为源,然后可以通过重复调用Scan方法来进行标记。
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是一个实用程序函数,如果err参数是ErrorList,则会向w打印一个错误列表,每行一个错误。否则,它会打印错误字符串。
在ErrorList中,错误由* Error表示。Pos位置(如果有效)指向有问题的令牌的开始,错误情况由Msg描述。
type Error struct { Pos token.Position Msg string}
func (e Error) Error() string
Error实现了错误接口。
一个ErrorHandler可以提供给Scanner.Init。如果遇到语法错误并且安装了处理程序,则会使用位置和错误消息调用处理程序。位置指向违规令牌的开始。
type ErrorHandler func(pos token.Position, msg string)
ErrorList是*错误的列表。ErrorList的零值是一个空的ErrorList,可以使用。
type ErrorList []*Error
func (p *ErrorList) Add(pos token.Position, msg string)
Add添加一个给定位置和错误消息的错误到一个ErrorList。
func (p ErrorList) Err() error
Err返回等同于此错误列表的错误。如果列表为空,则Err返回nil。
func (p ErrorList) Error() string
ErrorList实现错误接口。
func (p ErrorList) Len() int
ErrorList实现排序接口。
func (p ErrorList) Less(i, j int) bool
func (p *ErrorList) RemoveMultiples()
RemoveMultiples对一个ErrorList进行排序并删除每行的第一个错误。
func (p *ErrorList) Reset()
重置将错误列表重置为无错误。
func (p ErrorList) Sort()
Sort排序错误列表。*错误条目按位置排序,其他错误按错误消息排序,并且在任何*错误条目之前。
func (p ErrorList) Swap(i, j int)
mode值是一组标志(或0)。他们控制扫描仪行为。
type Mode uint
const ( ScanComments Mode = 1 << iota // return comments as COMMENT tokens)
Scanner在处理给定文本时保存扫描仪的内部状态。它可以作为另一个数据结构的一部分进行分配,但必须在使用前通过Init进行初始化。
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通过将扫描器设置为src的开头来准备扫描器来标记文本src。扫描仪使用文件集文件获取位置信息,并为每行添加行信息。当重新扫描相同的文件时,重新使用同一文件是可以的,因为已经存在的行信息将被忽略。如果文件大小与src大小不匹配,则Init会导致混乱。
如果遇到语法错误并且err不为零,则调用扫描将调用错误处理程序err。此外,对于遇到的每个错误,扫描器字段ErrorCount都会加1。模式参数决定如何处理注释。
请注意,如果文件的第一个字符有错误,Init可能会调用err。
func (s *Scanner) Scan() (pos token.Pos, tok token.Token, lit string)
Scan扫描下一个标记并返回标记位置,标记及其文字字符串(如果适用)。源端由token.EOF指示。
如果返回的标记是文字(token.IDENT,token.INT,token.FLOAT,token.IMAG,token.CHAR,token.STRING)或token.COMMENT,则文字字符串具有相应的值。
如果返回的标记是关键字,则字符串是关键字。
如果返回的令牌是token.SEMICOLON,则相应的文字字符串是“;” 如果分号存在于源中,则“\ n”如果由于换行符或EOF而插入了分号。
如果返回的标记是token.ILLEGAL,则文字字符串是违规字符。
在其他所有情况下,Scan会返回一个空的文字字符串。
对于更宽容的解析,如果可能,即使遇到语法错误,Scan也会返回有效的令牌。因此,即使生成的令牌序列不包含非法令牌,客户端也不能认为没有发生错误。相反,它必须检查扫描器的ErrorCount或错误处理程序的调用次数,如果安装了一个。
Scan 行信息添加到添加到Init文件集的文件中。令牌位置与该文件相关,因此与文件集有关。
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)}}