基于算法链路实现的表驱动词法分析器:
- 正则规则文件 -> Thompson 构造法(算法 2.2)生成 NFA
- NFA -> 子集法(算法 2.5)生成 DFA
- DFA -> 拓展驱动器(拓展算法 2.1)进行最长匹配扫描
逐行声明:TOKEN_NAME:regex
示例见 examples/lexer-rules.txt:
WS:[ \t\r\n]+
IDENT:[a-zA-Z_][a-zA-Z0-9_]*
NUMBER:[0-9]+(\.[0-9]+)?
OP:[=+\-*/]
说明:
- 规则优先级按文件顺序,越靠前优先级越高。
- 词法冲突决策:最长匹配优先;同长度再按规则顺序。
WS/WHITESPACE默认跳过,不输出到 token stream。
- 安装依赖:
yarn install - 类型检查:
yarn typecheck - 运行测试:
yarn test:run - 启动 watch 测试:
yarn test - 词法扫描 CLI:
yarn lex <regex-file> <expression> - 分步演示入口:
yarn lex:trace <regex-file> <expression>
示例:
yarn lex examples/lexer-rules.txt "abc=x1+y2*10.0"分步演示示例(会输出 NFA、DFA、最小化 DFA、token stream):
yarn lex:trace examples/lexer-rules.txt "time=c1+b1*20+66.98"执行 lex:trace 后会自动生成 HTML 图示报告:
reports/trace-report.html- 页面包含 NFA / DFA / 最小化 DFA 的状态转换矩阵和最终 token stream
输出为 JSON token stream,结构如下:
[
{ "type": "identifier", "lexeme": "abc", "start": 0, "end": 3 },
{ "type": "operator", "lexeme": "=", "start": 3, "end": 4 }
]- 规则格式非法:行中没有
: - 正则非法:括号/字符类不闭合、转义不完整
- 词法错误:输入包含无法匹配任一规则的字符(会报行列号)