2.3 处理字符
type source struct {
in io.Reader // 输入来源
errh func(line, col uint, msg string) // 错误处理函数
buf []byte // 保存从 in 里面读取到的字节的缓存
ioerr error // 如果从 in 读取内容到 buf 时发生 io 错误,则存放在该字段内
b, r, e int // buf 中的三个标记位置,用来读取下一个字符,以及在 buf 中内容解析完了之后重新从 in 中读取新的内容到 buf 中
line, col uint // 用来标记当前字符的源代码位置
ch rune // 最近读取到的 UTF-8 编码的字符
chw int // ch 的字节长度,ASCII 中的字符长度为 1, 中文一个字符长度大于 1
}func (s *source) nextch() { /* ... */ }
func (s *source) fill() { /* ... */ }func TestSource(t *testing.T) {
var s source
var buf bytes.Buffer
buf.WriteString("abcdeABCDE 中文来了“ _")
s.init(&buf, func(line, col uint, msg string) {
fmt.Printf("Error: [msg: %s, line: %d, col: %d]\n", msg, line, col)
})
s.fill()
for s.r != s.e {
s.nextch()
fmt.Printf("%v,", s.ch)
}
fmt.Println()
}最后更新于