MCPcopy Index your code
hub / github.com/WGrape/lexer

github.com/WGrape/lexer @v1.10.0

Chat with this repo
repository ↗ · DeepWiki ↗ · release v1.10.0 ↗ · + Follow
258 symbols 267 edges 19 files 0 documented · 0% 1 cross-repo links
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

image

  <a href="https://www.oscs1024.com/project/oscs/WGrape/lexer?ref=badge_small" alt="OSCS Status"><img src="https://www.oscs1024.com/platform/badge/WGrape/lexer.svg?size=small"/></a>
<img src="https://img.shields.io/badge/JavaScript-ES5+-blue.svg">
<img src="https://img.shields.io/npm/dt/chain-lexer.svg">
<a href="https://app.travis-ci.com/github/WGrape/lexer"><img src="https://app.travis-ci.com/WGrape/lexer.svg?branch=main"><a>
<img src="https://img.shields.io/badge/Release-1.8.0-blue.svg">
<img src="https://img.shields.io/badge/Document-中文/English-orange.svg">
<img src="https://img.shields.io/badge/License-MIT-green.svg">

一个基于DFA的支持多语言扩展的JS版开源词法分析器,快速了解与体验请查看线上网站

文档 :中文 / English

目录

1、项目背景

不了解词法分析器以及其应用场景吗?建议用2分钟时间查看入门文章:词法分析器的介绍与应用场景

(1) 问题现状

目前常见的词法分析器与语言耦合较为紧密且代码量较为庞大,难以关注词法分析器其本质原理。

(2) 项目萌芽

为把关注重心放在词法分析器的工作原理上,不再需要考虑由不同语言造成的细枝末节差异,于是就有了此lexer 项目。

(3) 解决方案

lexer主要通过以下两个JS文件,实现词法分析器与语言的解耦

  • /src/lexer.js文件是词法分析器的核心,主要分为ISR(输入流读取器)和DFA(有限状态自动机),代码会保持在300行内
  • /src/lang/{lang}-define.js文件是词法分析器的扩展,支持不同语言的接入,如/src/lang/c-define.js文件

2、功能介绍

(1) 完整的词法分析

从输入字符序列,到分析结束后生成tokenlexer具备了完整的词法分析功能,如内置的C语言版lexer共支持11种类型的token

img

(2) 支持多语言扩展

lexer支持接入如PythonGo等不同的语言,实现对不同语言进行词法分析的需求,扩展接入方式见贡献部分,目前已支持如下语言的词法分析

  • C :一种比较底层的编程语言,点击查看 它的词法分析
  • SQL :一种数据库查询语言,点击查看 它的词法分析
  • Goal :一个来自LeetCode的Goal解析器题目,点击查看 它的词法分析

(3) 记录状态流转信息

词法分析器的核心机制是基于DFA的状态流转,为此lexer记录了详细的状态流转信息,以实现使用方的以下需求

  • lexer的功能调试模式
  • 自动生成DFA状态流转图

3、获取项目

使用git clone获取本项目后,不需要任何依赖的安装,也不需多余的安装步骤

4、使用方式

(1) 在代码中使用

如果有在代码中使用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, // 是否是最后一个字符
    },
    // ... ...
]

(2) 可视化预览与测试

为了实时查看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!");
}

img

或者请查看线上网站

5、参与贡献

(1) 项目统计

(2) 源码讲解

关于项目设计、单元测试、自动化测试、开发规范、以及如何接入不同语言的扩展等与源码开发相关的文档,请阅读源码讲解部分

(3) 贡献范围

  • 提供更多新功能
  • 提供更多语言的 /src/lang/{lang}-define.js

此外,一切帮助项目变得更好的建议都欢迎讨论,交流渠道参考问题交流部分

(4) 版本发布

项目以版本号为大更新-小更新-修复完善的规则发布,关于版本的更新记录可以查看项目的CHANGELOG,或查看Release记录

(5) 问题交流

如果有使用问题或疑问需要反馈,可以加入群聊,或提交issue ,欢迎大家的加入

6、协议说明

GitHub

Core symbols most depended-on inside this repo

runCaseList
called by 2
test/main.js
returnCaseList
called by 2
test/auto/c-lexer_test.js
consoleSuccess
called by 1
test/unit/goal-define_test.js
consoleFailed
called by 1
test/unit/goal-define_test.js
consoleSuccess
called by 1
test/unit/sql-define_test.js
consoleFailed
called by 1
test/unit/sql-define_test.js
runUnitTesting
called by 1
test/unit/c-define_test.js
consoleSuccess
called by 1
test/unit/c-define_test.js

Shape

Function 258

Languages

TypeScript100%

Modules by API surface

package/sql-lexer.min.js35 symbols
package/sql-define.min.js35 symbols
package/c-lexer.min.js35 symbols
package/c-define.min.js35 symbols
package/goal-lexer.min.js22 symbols
package/goal-define.min.js22 symbols
src/lang/sql-define.js19 symbols
src/lang/c-define.js19 symbols
src/lexer.js17 symbols
src/lang/goal-define.js6 symbols
test/unit/sql-define_test.js3 symbols
test/unit/goal-define_test.js3 symbols

Used by 1 indexed graphs manifest dependencies, hub-wide

For agents

$ claude mcp add lexer \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact