目录
不了解词法分析器以及其应用场景吗?建议用2分钟时间查看入门文章:词法分析器的介绍与应用场景
目前常见的词法分析器与语言耦合较为紧密且代码量较为庞大,难以关注词法分析器其本质原理。
为把关注重心放在词法分析器的工作原理上,不再需要考虑由不同语言造成的细枝末节差异,于是就有了此lexer
项目。
lexer主要通过以下两个JS文件,实现词法分析器与语言的解耦。lexer.js 是执行引擎,{lang}-define.js 是语言规则,两者分工明确:
/src/lexer.js文件是词法分析器的核心,主要分为ISR(输入流读取器)和DFA(有限状态自动机),代码会保持在300行内,极其清晰易懂/src/lang/{lang}-define.js文件是词法分析器的扩展,支持不同语言的接入,如/src/lang/c-define.js文件ENUM_CONST— 所有枚举值:Token 类型、DFA 状态编号、运算符/符号字符CHARSET_CONST— 字符集分类:哪些字符是运算符、哪些是符号、关键字列表等DFA_STATE_CONST— DFA 状态常量(引用 ENUM_CONST 中的状态值)tool— 工具函数:字符分类判断、Token 类型推导、环境判断flowModel— DFA 状态流转模型:实现getNextState(ch, state)状态转移函数,并记录每步流转日志
整体的核心执行流程,请查看核心流程图部分
从输入字符序列,到分析结束后生成token,lexer具备了完整的词法分析功能,如内置的C语言版lexer共支持11种类型的token
lexer支持接入如Python、Go等不同的语言,实现对不同语言进行词法分析的需求,扩展接入方式见贡献部分,目前已支持如下语言的词法分析
词法分析器的核心机制是基于DFA的状态流转,为此lexer记录了详细的状态流转信息,以实现使用方的以下需求
lexer的功能调试模式- 自动生成
DFA状态流转图
使用git clone获取本项目后,不需要任何依赖的安装,也不需多余的安装步骤
分支说明:
main分支是主分支,以main分支为主即可,其他分支都是功能开发分支。包括main分支在内的所有分支都会进行新功能的迭代,尽管main分支已经过多次测试,但新功能仍可能引起 bug。你可以根据自己的选择,也可以下载更稳定的 Release 版本
如果有在代码中使用lexer的需求(如网页中的代码编辑器:高亮、代码提示等),只引入一个/package/{lang}-lexer.min.js文件即可
然后直接访问lexer变量即可获取到词法分析器对象,其中tokens数据可以通过访问lexer.DFA.result.tokens获取
// 1. 需要词法分析的代码
let stream = "int a = 10;";
// 2. 开始词法分析
lexer.start(strem);
// 3. 词法分析结束后, 获取生成的tokens
let parsedTokens = lexer.DFA.result.tokens;
// 4. 做你想做的
parsedTokens.forEach((token) => {
// ... ...
});功能介绍中所描述的记录状态流转信息,通过访问flowModel.result.paths即可获取到lexer内部状态机在每次状态流转时的详细信息,数据格式如下所示
[
{
state: 0, // 当前状态
ch: "a", // 当前读入的字符
nextSstate: 2, // 下一个状态
match: true, // 是否匹配
end: false, // 是否是最后一个字符
},
// ... ...
]为了实时查看lexer的工作效果,也方便对其进行开发测试,在项目根目录下有一个index.html文件,直接在浏览器中打开,输入代码后会自动输出经过lexer分析后生成的Token,如下图所演示
int a = 10;
int b =20;
int c = 20;
float f = 928.2332;
char b = 'b';
if(a == b){
printf("Hello, World!");
}else if(b!=c){
printf("Hello, World! Hello, World!");
}else{
printf("Hello!");
}或者请查看线上网站
main:主分支develop:开发分支testing:已废弃,不再使用v{x}:版本分支(如v2,表示 version 2 版本的分支),一般不使用。只有在做大版本更新时,会创建一个版本分支,然后把develop分支开发的代码先合入v{x}分支,待版本完全测试通过后,才会合入main分支
test: 测试相关的英文描述perf: 优化相关的英文描述feat: 新功能相关的英文描述fix: bug修复相关的英文描述doc: 文档更新相关的英文描述style: 代码格式调整相关的英文描述refactor: 设计架构重构相关的英文描述
如lexer的架构如果进行调整,commit信息应该为refactor: refactor lexer
- 提供更多新功能
- 提供更多语言的
/src/lang/{lang}-define.js
此外,一切帮助项目变得更好的建议都欢迎讨论,交流渠道参考问题交流部分
项目以版本号为大更新-小更新-修复完善的规则发布,关于版本的更新记录可以查看项目的CHANGELOG,或查看Release记录
当新版本开发完成后,使用如下命令发布至Npm。
git checkout main
git pull origin main
npm login
npm publish关于项目设计、单元测试、自动化测试、开发规范、以及如何接入不同语言的扩展等与源码开发相关的文档,请阅读源码讲解部分
如果有使用问题或疑问需要反馈,请提交issue ,欢迎大家的加入



