/** * @file lexer.h * @brief C语言词法分析器核心数据结构与接口 */ #ifndef __SMCC_CC_LEXER_H__ #define __SMCC_CC_LEXER_H__ #include #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