76 lines
2.3 KiB
C
76 lines
2.3 KiB
C
/**
|
||
* @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 |