当前位置: 首页 > news >正文

Tiny Lexer 一个极简的C语言词法分析器

推荐:Tiny Lexer - 一个极简的C语言词法分析器

我推荐一个非常小巧但完整的C语言词法分析器实现 - Tiny Lexer。它具有以下优点:

特点

  • 代码量极小(约100行核心代码)
  • 纯C实现,无外部依赖
  • 易于理解和学习
  • 包含完整的功能:标识符、数字、运算符识别等

核心代码实现

#include <stdio.h>
#include <ctype.h>
#include <string.h>

typedef enum {
    TOKEN_EOF,
    TOKEN_NUMBER,
    TOKEN_IDENTIFIER,
    TOKEN_OPERATOR,
    TOKEN_UNKNOWN
} TokenType;

typedef struct {
    TokenType type;
    char value[32];
} Token;

Token get_next_token(const char** input) {
    Token token = {TOKEN_UNKNOWN, {0}};
    
    // 跳过空白字符
    while (isspace(**input)) {
        (*input)++;
    }
    
    // 检查文件结束
    if (**input == '\0') {
        token.type = TOKEN_EOF;
        return token;
    }
    
    // 处理数字
    if (isdigit(**input)) {
        token.type = TOKEN_NUMBER;
        int i = 0;
        while (isdigit(**input) && i < sizeof(token.value)-1) {
            token.value[i++] = *(*input)++;
        }
        token.value[i] = '\0';
        return token;
    }
    
    // 处理标识符(字母开头)
    if (isalpha(**input)) {
        token.type = TOKEN_IDENTIFIER;
        int i = 0;
        while ((isalnum(**input) || **input == '_') && i < sizeof(token.value)-1) {
            token.value[i++] = *(*input)++;
        }
        token.value[i] = '\0';
        return token;
    }
    
    // 处理运算符
    if (strchr("+-*/=(){};", **input)) {
        token.type = TOKEN_OPERATOR;
        token.value[0] = *(*input)++;
        token.value[1] = '\0';
        return token;
    }
    
    // 未知字符
    token.value[0] = *(*input)++;
    return token;
}

int main() {
    const char* input = "int x = 42 + y;";
    const char* p = input;
    
    while (1) {
        Token token = get_next_token(&p);
        if (token.type == TOKEN_EOF) break;
        
        const char* type_str;
        switch (token.type) {
            case TOKEN_NUMBER: type_str = "NUMBER"; break;
            case TOKEN_IDENTIFIER: type_str = "IDENTIFIER"; break;
            case TOKEN_OPERATOR: type_str = "OPERATOR"; break;
            default: type_str = "UNKNOWN"; break;
        }
        
        printf("Token: %-12s Value: %s\n", type_str, token.value);
    }
    
    return 0;
}

学习价值

  1. 词法分析基本原理:展示了如何将输入流分解为token
  2. 状态机概念:通过条件判断实现了简单的状态转移
  3. 可扩展性:可以轻松添加更多token类型和规则
  4. 实用性:虽然简单,但包含了词法分析的核心功能

扩展建议

学习这个基本实现后,你可以尝试:

  1. 添加更多运算符和关键字识别
  2. 实现更复杂的数字格式(如浮点数)
  3. 添加错误处理机制
  4. 将其扩展为递归下降语法分析器

这个实现去除了所有不必要的复杂性,是学习编译原理前端技术的理想起点。

相关文章:

  • 回溯(子集型):分割回文串
  • 如何在 Windows 上安装与配置 Tomcat
  • 基于PX4和Ardupilot固件下自定义MAVLink消息测试(QGroundControl和Mission Planner)
  • 76. pinctrl和gpio子系统试验
  • 【Easylive】HikariCP 介绍
  • 14:00开始面试,14:08就出来了,问的问题有点变态。。。
  • YOLO霸主地位不保?开源 SOTA 目标检测rf-detr 测评
  • UR机械臂sim2real推荐包
  • CUDA专题8—CUDA L2缓存完全指南:从持久化策略到性能优化实战
  • 代码随想录Day29
  • 学以致用,基于OpenCV的公摊面积估算程序
  • 探秘DeepSeek:开源AI领域的创新先锋
  • 从零构建大语言模型全栈开发指南:第三部分:训练与优化技术-3.1.3分布式数据加载与并行处理(PyTorch DataLoader优化)
  • 让古籍“活”起来!PDF Craft如何用AI还原电子书灵魂?
  • Qt5.14.2+Cmake使用mingw64位编译opencv4.5成功图文教程
  • 基于python开发的邮箱合并群发工具
  • 5分钟快速手搓mcp发送邮件的server接入到cherrystudio
  • MapReduce工作原理详解
  • Mapbox-GL 事件体系和使用方法的详细讲解
  • [动规19] 最大子数组和
  • 网站后台账户密码/微博指数查询
  • 资金盘网站开发多少钱/互联网哪个行业前景好
  • 网站一直维护意味着什么/弹窗广告最多的网站
  • 路由器上做网站/宁波seo怎么做推广渠道
  • 河南做网站企起/什么是互联网销售
  • 90后做网站月入万元/推广关键词优化公司