Generator 通过 yield 暂停执行、按需产出 Token,以内置 state 和 index 驱动 FSM 状态转移,支持流式输入、局部回溯、嵌套结构识别及灵活错误处理。

Generator 可以在文本解析器中实现词法分析的流式状态转移,核心在于用 yield 暂停执行、按需产出 Token,并通过内部状态(如正则匹配位置、当前字符、模式栈)驱动状态机演进。它天然契合词法分析“读一点、判一次、产一个 Token、再读下一段”的节奏。
用 Generator 封装状态机驱动逻辑
把词法分析器建模为有限状态机(FSM),每个状态对应一种识别模式(如 IN_IDENTIFIER、IN_NUMBER、IN_STRING),Generator 函数内部维护 state 和 index(当前扫描位置),每次 next() 触发一次状态转移:
- 从输入字符串中按
index取下一个字符或子串 - 根据当前
state和字符决定:继续推进、切换状态、或完成当前 Token 并yield - 状态切换不靠递归或深层嵌套,而是靠循环 + 条件分支更新
state变量
逐字符/逐段消费,避免预加载整段文本
Generator 不需要一次性读完全部文本,适合处理大文件或流式输入(如 ReadableStream 的 chunk):
- 可接收一个迭代器(如
for await (const chunk of stream))作为输入源 - 内部用缓冲区(如
buffer += chunk)累积未消费字符,只在yield前确保有足够上下文(例如识别字符串结尾需看到匹配的引号) - 每次
next()返回一个 Token 后,仅消耗已确认的部分,剩余留在缓冲区待下次调用
支持嵌套与回溯的 Token 构造
某些 Token 需要局部回溯(如 == vs =)或嵌套结构(如注释中的转义、字符串中的模板插值):
立即学习“Java免费学习笔记(深入)”;
- 在 Generator 内部用临时变量保存“试探性”扫描位置(如
let lookahead = index + 1),失败时重置index - 对嵌套结构(如多行注释
/* ... */),进入状态后持续循环直到匹配结束标记,期间可递归调用子 Generator 或复用同一函数的局部逻辑 - yield 的 Token 可包含类型、原始值、起始/结束位置,便于后续语法分析定位错误
与外部控制流自然协同
调用方可以灵活中断、跳过、或注入逻辑:
- 用
for...of自然遍历所有 Token - 手动调用
gen.next()并检查done,在特定 Token(如EOF或ERROR)后提前退出 - 向 Generator 传入参数(
gen.next({ skipComments: true }))动态调整行为,比如跳过注释 Token
不复杂但容易忽略的是:Generator 本身不解决错误恢复,但它的暂停能力让错误处理更可控——遇到非法字符时,可 yield 一个 ERROR Token 并由上层决定是报错终止,还是跳过并重置状态继续。


















