#ifndef __SCC_PP_MACRO_H__ #define __SCC_PP_MACRO_H__ #include #include #include // 宏定义类型 typedef enum { SCC_PP_MACRO_NONE, // 不是宏 SCC_PP_MACRO_OBJECT, // 对象宏 SCC_PP_MACRO_FUNCTION, // 函数宏 } scc_pproc_macro_type_t; typedef SCC_VEC(scc_lexer_tok_vec_t) scc_pproc_macro_extened_params_t; // 宏定义结构 typedef struct scc_macro { scc_cstring_t name; // 宏名称 scc_pproc_macro_type_t type; // 宏类型 scc_lexer_tok_vec_t replaces; // 替换列表 scc_lexer_tok_vec_t params; // 参数列表(仅函数宏) } scc_pproc_macro_t; typedef struct scc_macro_table { scc_hashtable_t table; // 宏定义表 } scc_pproc_macro_table_t; /** * @brief 创建宏对象 * @param name 宏名称 * @param type 宏类型 * @return 创建的宏对象指针,失败返回NULL */ scc_pproc_macro_t *scc_pproc_macro_new(const scc_cstring_t *name, scc_pproc_macro_type_t type); /** * @brief 销毁宏对象 * @param macro 要销毁的宏对象 */ void scc_pproc_macro_drop(scc_pproc_macro_t *macro); /** * @brief 添加对象宏 * @param pp 预处理器实例 * @param name 宏名称 * @param replacement 替换文本列表 * @return 成功返回true,失败返回false */ cbool scc_pproc_add_object_macro(scc_pproc_macro_table_t *pp, const scc_cstring_t *name, const scc_lexer_tok_vec_t *replacement); /** * @brief 添加函数宏 * @param pp 预处理器实例 * @param name 宏名称 * @param params 参数列表 * @param replacement 替换文本列表 * @return 成功返回true,失败返回false */ cbool scc_pproc_add_function_macro(scc_pproc_macro_table_t *pp, const scc_cstring_t *name, const scc_lexer_tok_vec_t *params, const scc_lexer_tok_vec_t *replacement); /** * @brief * * @param pp * @param macro * @return scc_pproc_macro_t* */ scc_pproc_macro_t *scc_pproc_macro_table_set(scc_pproc_macro_table_t *pp, scc_pproc_macro_t *macro); /** * @brief 查找宏定义 * @param pp 预处理器实例 * @param name 宏名称 * @return 找到的宏对象指针,未找到返回NULL */ scc_pproc_macro_t *scc_pproc_macro_table_get(scc_pproc_macro_table_t *pp, const scc_cstring_t *name); /** * @brief 从预处理器中删除宏 * @param pp 预处理器实例 * @param name 宏名称 * @return 成功删除返回true,未找到返回false */ cbool scc_pproc_macro_table_remove(scc_pproc_macro_table_t *pp, const scc_cstring_t *name); void scc_pproc_marco_table_init(scc_pproc_macro_table_t *macros); void scc_pproc_macro_table_drop(scc_pproc_macro_table_t *macros); #endif /* __SCC_PP_MACRO_H__ */