ZZY 8d97fe896c chore: 更新 .gitignore 文件
- 添加 docs 文件夹到忽略列表,以忽略 Doxygen 生成的文件
- 保持原有的忽略规则不变
2025-04-05 23:11:39 +08:00

76 lines
2.3 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @file lexer.h
* @brief C语言词法分析器核心数据结构与接口
*/
#ifndef __SMCC_CC_LEXER_H__
#define __SMCC_CC_LEXER_H__
#include <lib/core.h>
#include "token.h"
#ifndef LEXER_MAX_TOKEN_SIZE
#define LEXER_MAX_TOKEN_SIZE 63 ///< 单个token的最大长度限制
#endif
#ifndef LEXER_BUFFER_SIZE
#define LEXER_BUFFER_SIZE 4095 ///< 词法分析缓冲区大小
#endif
/**
* @brief 流读取函数原型
* @param dst_buf 目标缓冲区
* @param elem_size 元素大小
* @param count 元素数量
* @param stream 输入流指针
* @return 实际读取的元素数量
*/
typedef int (*lexer_sread_fn)(void *dst_buf, int elem_size, int count, void *stream);
/**
* @brief 词法分析器核心结构体
*
* 封装词法分析所需的状态信息和缓冲区管理
*/
typedef struct cc_lexer {
loc_t loc; ///< 当前解析位置信息(文件名、行列号等)
char* cur_ptr; ///< 当前扫描指针(指向尚未处理的字符)
char* end_ptr; ///< 缓冲区结束指针(指向最后一个有效字符的下一个位置)
char buffer[LEXER_BUFFER_SIZE+1]; ///< 字符缓冲区包含NUL终止符
lexer_sread_fn sread; ///< 流读取函数指针
void* stream; ///< 输入流对象指针
strpool_t* strpool; ///< 字符串池(用于存储标识符等字符串)
} cc_lexer_t;
/**
* @brief 初始化词法分析器
* @param[out] lexer 要初始化的词法分析器实例
* @param[in] file_name 当前解析的源文件名
* @param[in] stream 输入流对象指针
* @param[in] sread 自定义流读取函数
* @param[in] strpool 字符串池实例
*/
void init_lexer(cc_lexer_t* lexer, const char* file_name, void* stream,
lexer_sread_fn sread, strpool_t* strpool);
/**
* @brief 获取原始token
* @param[in] lexer 词法分析器实例
* @param[out] token 输出token存储位置
*
* 此函数会返回所有类型的token包括空白符等无效token
*/
void get_token(cc_lexer_t* lexer, tok_t* token);
/**
* @brief 获取有效token
* @param[in] lexer 词法分析器实例
* @param[out] token 输出token存储位置
*
* 此函数会自动跳过空白符等无效token返回对语法分析有意义的token
*/
void get_valid_token(cc_lexer_t* lexer, tok_t* token);
#endif