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"
相关用法
- GO Scanner.Bytes用法及代码示例
- GO Scanner用法及代码示例
- GO Scope用法及代码示例
- GO StreamWriter用法及代码示例
- GO Split用法及代码示例
- GO Server.Shutdown用法及代码示例
- GO Slice用法及代码示例
- GO StructTag.Lookup用法及代码示例
- GO SplitAfter用法及代码示例
- GO Sum256用法及代码示例
- GO SectionReader用法及代码示例
- GO Sin用法及代码示例
- GO Sprintf用法及代码示例
- GO Strings用法及代码示例
- GO SendMail用法及代码示例
- GO StructTag用法及代码示例
- GO Stmt用法及代码示例
- GO Sprint用法及代码示例
- GO SpecialCase用法及代码示例
- GO SectionReader.ReadAt用法及代码示例
注:本文由纯净天空筛选整理自golang.google.cn大神的英文原创作品 Scanner.Scan。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。