go词法解析之scanner

_蜡笔 · · 2923 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

golang版本: 1.13.1 


词法分析

词法分析阶段是编译过程的第一个阶段。这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号)。词法分析程序实现这个任务。词法分析程序可以使用lex等工具自动生成。

scanner

go于1.5开始实现了自举,而第一阶段的词法分析由cmd/compile/internal/syntax/scanner 实现的.

scanner 的实现比较简单,主要逻辑在next里,是先解析是否是字符串,然后通过一个大的switch来转成tokens(tokens位于cmd/compile/internal/syntax/tokens),可以通过scanner的测试TestScanner来观察这一个过程。

struct

首先,我们先看一下scanner的结构体的一些定义

scanner struct 的定义


source struct 的定义


TestScanner

由于之前的测试用用例解析的是parser文件,有点大不太直观,因此新创建了一个aaaa.go文件来解析



测试结果:

=== RUN   TestScanner
1 package
1 name => syntax
1 ;
3 import
3 literal => "fmt"
3 ;
5 func
5 name => aaaa
5 (
5 )
5 {
6 name => a
6 :=
6 literal => 123
6 ;
7 name => fmt
7 .
7 name => Println
7 (
7 name => a
7 )
7 ;
8 }
8 ;
--- PASS: TestScanner (0.00s)
PASS

Debugger finished with exit code 0
复制代码

运行过程

通过上面的测试文件可以知道,scanner的第一步是init数据,init只是一个简单的设置默认值,在这里就不多讲了...

主要过程是next的逻辑,scanner的执行通过next来驱动,一个next就是一个token,


ident字符串处理流程



总结

scanner的主要流程为:


词法解析是一个比较简单的过程,但是很繁琐,scanner+source 1000多行的代码里有一些特殊情况的解析,像文件名这些的处理

下一步: go语法分析之parser



有疑问加站长微信联系(非本文作者)

本文来自:掘金

感谢作者:_蜡笔

查看原文:go词法解析之scanner

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2923 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传