Package scanner

import "go/scanner"
Overview
Index
Examples

Overview ▾

包扫描程序实现了Go源文本的扫描程序. 它以[] byte作为源,然后可以通过重复调用Scan方法来对其进行标记.

func PrintError

func PrintError(w io.Writer, err error)

PrintError是一个实用程序函数,如果err参数是ErrorList,则将错误列表打印到w,每行一个错误. 否则,它将输出err字符串.

type Error

在ErrorList中,错误由* Error表示. 位置Pos(如果有效)指向有问题的令牌的开头,并且错误情况由Msg描述.

type Error struct {
    Pos token.Position
    Msg string
}

func (Error) Error

func (e Error) Error() string

Error实现错误接口.

type ErrorHandler

可以将ErrorHandler提供给Scanner.Init. 如果遇到语法错误并安装了处理程序,则会使用一个位置和一条错误消息来调用该处理程序. 该位置指向有问题的令牌的开头.

type ErrorHandler func(pos token.Position, msg string)

type ErrorList

ErrorList是* Error的列表. ErrorList的零值是可以使用的空ErrorList.

type ErrorList []*Error

func (*ErrorList) Add

func (p *ErrorList) Add(pos token.Position, msg string)

Add将具有给定位置的错误和错误消息添加到ErrorList.

func (ErrorList) Err

func (p ErrorList) Err() error

错误返回与该错误列表等效的错误. 如果列表为空,则Err返回nil.

func (ErrorList) Error

func (p ErrorList) Error() string

ErrorList实现错误接口.

func (ErrorList) Len

func (p ErrorList) Len() int

ErrorList实现排序接口.

func (ErrorList) Less

func (p ErrorList) Less(i, j int) bool

func (*ErrorList) RemoveMultiples

func (p *ErrorList) RemoveMultiples()

RemoveMultiples对ErrorList进行排序,并删除每行中除第一个错误以外的所有错误.

func (*ErrorList) Reset

func (p *ErrorList) Reset()

重置会将ErrorList重置为没有错误.

func (ErrorList) Sort

func (p ErrorList) Sort()

排序对ErrorList进行排序. *错误条目按位置排序,其他错误则按错误消息排序,且在任何*错误条目之前.

func (ErrorList) Swap

func (p ErrorList) Swap(i, j int)

type Mode

模式值是一组标志(或0). 它们控制扫描仪的行为.

type Mode uint
const (
    ScanComments Mode = 1 << iota // return comments as COMMENT tokens

)

type Scanner

扫描仪在处理给定文本时会保留扫描仪的内部状态. 可以将其分配为另一个数据结构的一部分,但必须在使用前通过Init进行初始化.

type Scanner struct {

    // public state - ok to modify
    ErrorCount int // number of errors encountered
    // contains filtered or unexported fields
}

func (*Scanner) Init

func (s *Scanner) Init(file *token.File, src []byte, err ErrorHandler, mode Mode)

Init通过将扫描器设置在src的开头来准备扫描器以标记文本src. 扫描仪使用文件集文件获取位置信息,并为每行添加行信息. 当重新扫描同一文件时,可以使用相同的文件,因为已经存在的行信息将被忽略. 如果文件大小与src大小不匹配,则Init会引起恐慌.

如果Scan调用遇到语法错误并且err不为nil,则会调用错误处理程序err. 此外,对于遇到的每个错误,"扫描器"字段ErrorCount都会增加1. 模式参数确定如何处理注释.

请注意,如果文件的第一个字符有错误,则Init可能会调用err.

func (*Scanner) Scan

func (s *Scanner) Scan() (pos token.Pos, tok token.Token, lit string)

扫描将扫描下一个令牌,并返回令牌位置,令牌及其文字字符串(如果适用). 源端由token.EOF指示.

如果返回的令牌是文字(token.IDENT,token.INT,token.FLOAT,token.IMAG,token.CHAR,token.STRING)或token.COMMENT,则文字字符串具有相应的值.

如果返回的令牌是关键字,则文字字符串是关键字.

如果返回的令牌为token.SEMICOLON,则相应的文字字符串为";". 如果源中存在分号,则为" \ n";如果由于换行符或在EOF处插入了分号,则为" \ n".

如果返回的令牌是token.ILLEGAL,则文字字符串是有问题的字符.

在所有其他情况下,Scan返回一个空的文字字符串.

对于更宽容的解析,即使遇到语法错误,Scan也会尽可能返回有效的令牌. 因此,即使最终的令牌序列不包含非法令牌,客户端也不会假定没有错误发生. 相反,它必须检查扫描程序的ErrorCount或错误处理程序的调用次数(如果已安装).

扫描会将行信息添加到添加到使用Init设置的文件集的文件中. 令牌位置相对于该文件,因此相对于文件集.

Example

1:1	IDENT	"cos"
1:4	(	""
1:5	IDENT	"x"
1:6	)	""
1:8	+	""
1:10	IMAG	"1i"
1:12	*	""
1:13	IDENT	"sin"
1:16	(	""
1:17	IDENT	"x"
1:18	)	""
1:20	;	"\n"
1:20	COMMENT	"// Euler"

by  ICOPY.SITE