当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


GO Scanner.Scan用法及代码示例


GO语言"go/scanner"包中"Scanner.Scan"类型的用法及代码示例。

用法:

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,如果分号存在于源中,则相应的文字字符串是 ";",如果分号是由于换行符或在 EOF 处插入的,则为 "\n"。

如果返回的标记是 token.ILLEGAL,则文字字符串是违规字符。

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

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

Scan 将行信息添加到使用 Init 添加到文件集中的文件中。令牌位置相对于该文件,因此相对于文件集。

例子:

package main

import (
	"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)
	}

}

输出:

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"

相关用法


注:本文由纯净天空筛选整理自golang.google.cn大神的英文原创作品 Scanner.Scan。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。