重建分词器:从字符到语言的词
复现 NaN 的渐进解释结构,用可拖动扫描器展示单字符、标识符、关键字与字符串如何成为 token。
问题
编译器收到的源代码只是一串字符。解析器若直接处理每个字母、引号与括号,就必须同时理解“字符怎样组成词”和“词怎样组成程序”。我们需要一个更小的边界:把字符流切成带类型的 token 流。
本文只处理一小段 JavaScript,并刻意限制语法范围。目标不是制作完整的 Babel,而是让分词器的职责可见:它读取当前位置、判断接下来属于哪类词,再把结构化结果交给下一阶段。
function greet() {
console.log('hi');
}
已识别 token
- 当前字符
- ∅
- 正在组成
- ∅
- 规则
- 等待扫描
- 尚未读取字符
尚未开始:输入仍是一串字符。
直觉
token 可以看作编程语言里的“词”。function 是关键字,greet 是标识符,括号与花括号是单字符标点,而引号之间的内容是字符串。分词之后,解析器面对的是稳定对象,不再反复处理微观字符规则。
扫描顺序适合渐进解释:先识别已知的单字符;遇到字母便持续读取,直到不再是标识符字符;得到完整单词后再查关键字表;遇到引号则一直读取到配对引号或报出未闭合错误。
形式化
令输入为字符序列 ,游标为 。每次扫描返回一个 token 与新游标:
这份样稿只接受四类规则:空白被跳过;(){} 等直接形成标点;字母开头的最长连续片段形成标识符并查询关键字集合;单引号开启字符串读取。每一步至少推进一个字符,因此在这个受限模型里总扫描成本与输入长度同阶。
结果
交互模型把“正在看的字符”和“已经确定的 token”放在同一视野。拖动时,单个字母先只是前缀;直到边界出现,完整标识符才稳定下来。这个并置关系正是原文最值得迁入研究室的部分:正文提出局部规则,模型立即显示规则对当前输入造成的变化。
限制
演示不支持模板字符串、转义、数字、注释、Unicode 标识符、正则字面量或自动分号插入。它是教学 tokenizer,不是 JavaScript 词法规范的实现;播放动画也只帮助观察,不构成算法测试。
来源
- 结构参考:Rebuilding Babel: The Tokenizer,NaN。
- 本页为中文适配与交互重写,未复制原文正文或原站视觉皮肤。
- 分词规则与运行代码均保存在本站组件中,可在构建产物里检查。