如何利用Golang textscanner库实现长尾词的词法扫描,构建Go语言基础解释器?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1153个文字,预计阅读时间需要5分钟。
许多人使用text/scanner时发现Scan返回了非零值,但打印出来的却是空字符串。基本原因:
常见错误现象:scanner.Scan() 返回 token.IDENT,但直接 fmt.Println(scanner.TokenText()) 却输出空——其实是没把输入源设对,或忘了在 Scan 后立刻调用它。
- 必须在每次
Scan成功后立即调用TokenText(),不能缓存多次扫描结果再统一取 - 输入必须是
io.Reader(比如strings.NewReader("x := 1")),传nil或未初始化的 reader 会导致静默失败 -
Scanner默认跳过空白和注释,如果想保留换行/制表符,得手动设置Mode:s.Mode = scanner.ScanComments | scanner.SkipComments(注意:二者互斥)
为什么 text/scanner 不支持自定义关键字?它压根不是 parser
text/scanner 是词法扫描器(lexer),只做字符到 token 的映射,不理解语义。
本文共计1153个文字,预计阅读时间需要5分钟。
许多人使用text/scanner时发现Scan返回了非零值,但打印出来的却是空字符串。基本原因:
常见错误现象:scanner.Scan() 返回 token.IDENT,但直接 fmt.Println(scanner.TokenText()) 却输出空——其实是没把输入源设对,或忘了在 Scan 后立刻调用它。
- 必须在每次
Scan成功后立即调用TokenText(),不能缓存多次扫描结果再统一取 - 输入必须是
io.Reader(比如strings.NewReader("x := 1")),传nil或未初始化的 reader 会导致静默失败 -
Scanner默认跳过空白和注释,如果想保留换行/制表符,得手动设置Mode:s.Mode = scanner.ScanComments | scanner.SkipComments(注意:二者互斥)
为什么 text/scanner 不支持自定义关键字?它压根不是 parser
text/scanner 是词法扫描器(lexer),只做字符到 token 的映射,不理解语义。

