- 添加 SCC_AST_DECL_LIST 节点类型用于表示声明列表 - 实现 scc_ast_decl_list_init 函数来初始化声明列表节点 - 重构 scc_parse_declaration 函数以支持逗号分隔的多个变量声明 - 分离类型说明符解析到独立的 scc_parse_declaration_specifiers 函数 - 支持 typedef 和多变量声明如 'int a, b;' 和 'int a = 1, b = 2;' - 在 ast_dump 中添加对声明列表节点的打印支持 refactor(ast): 统一使用 scc_vec_foreach 宏替换手动循环 - 将 ast_dump.c 中的多个手动索引循环改为使用 scc_vec_foreach - 提高代码可读性和安全性 - 避免索引越界错误 fix(parser): 修复语义分析中结构体符号表冲突 - 为结构体、联合体和枚举符号名添加前缀避免命名冲突 - 使用 '$S_'、'$U_'、'$E_' 前缀分别标识结构体、联合体和枚举 refactor(log): 统一终止处理方式 - 将 log_exit 替换为 log_abort 以更准确反映行为 - 更新相关依赖模块的实现 style(parser): 移除未使用的参数和清理代码 - 在 argparse.c 中添加 (void) 参数注释处理未使用的参数 - 清理 parse_expr.c 中未使用的函数声明 - 优化 parse_type.c 中的错误处理流程
104 lines
3.0 KiB
C
104 lines
3.0 KiB
C
#ifndef __SCC_PARSER_H__
|
|
#define __SCC_PARSER_H__
|
|
|
|
#include "scc_sema.h"
|
|
#include <scc_ast.h>
|
|
#include <scc_core_ring.h>
|
|
#include <scc_hashtable.h>
|
|
#include <scc_lexer_token.h>
|
|
|
|
/**
|
|
* @brief 解析器状态
|
|
*/
|
|
typedef struct scc_parser {
|
|
scc_lexer_tok_ring_t *ring;
|
|
usize checkpoint;
|
|
|
|
scc_hashtable_t type_ht;
|
|
|
|
scc_sema_callbacks_t sema_callbacks;
|
|
scc_ast_translation_unit_t *translation_unit;
|
|
int errcode;
|
|
} scc_parser_t;
|
|
|
|
// static inline scc_ast_type_t *scc_parser_
|
|
|
|
/**
|
|
* @brief 初始化解析器
|
|
* @param parser 解析器实例
|
|
* @param lexer 词法分析器实例
|
|
* @param callbacks 语义分析回调(可为 null)
|
|
*/
|
|
void scc_parser_init(scc_parser_t *parser, scc_lexer_tok_ring_t *tok_ring,
|
|
scc_sema_callbacks_t *callbacks);
|
|
|
|
/**
|
|
* @brief 销毁解析器
|
|
* @param parser 解析器实例
|
|
*/
|
|
void scc_parser_drop(scc_parser_t *parser);
|
|
|
|
/**
|
|
* @brief 解析整个翻译单元
|
|
* @param parser 解析器实例
|
|
* @return 翻译单元 AST 节点
|
|
*/
|
|
scc_ast_translation_unit_t *scc_parse_translation_unit(scc_parser_t *parser);
|
|
|
|
/**
|
|
* @brief 解析声明
|
|
* @param parser 解析器实例
|
|
* @return 声明 AST 节点
|
|
*/
|
|
scc_ast_decl_t *scc_parse_declaration(scc_parser_t *parser);
|
|
scc_ast_expr_t *scc_parse_initializer(scc_parser_t *parser,
|
|
scc_ast_expr_t *base);
|
|
|
|
/**
|
|
* @brief 解析语句
|
|
* @param parser 解析器实例
|
|
* @return 语句 AST 节点
|
|
*/
|
|
scc_ast_stmt_t *scc_parse_statement(scc_parser_t *parser);
|
|
scc_ast_expr_t *scc_parse_assignment_expression(scc_parser_t *parser);
|
|
scc_ast_expr_t *scc_parser_constant_expression(scc_parser_t *parser);
|
|
|
|
/**
|
|
* @brief 解析表达式
|
|
* @param parser 解析器实例
|
|
* @return 表达式 AST 节点
|
|
*/
|
|
scc_ast_expr_t *scc_parse_expression(scc_parser_t *parser);
|
|
|
|
/**
|
|
* @brief 解析类型
|
|
* @param parser 解析器实例
|
|
* @return 类型 AST 节点
|
|
*/
|
|
scc_ast_decl_t *scc_parse_declarator(scc_parser_t *parser,
|
|
scc_ast_type_t *type);
|
|
scc_ast_type_t *scc_parse_declaration_specifiers(scc_parser_t *parser);
|
|
scc_ast_type_t *scc_parse_type_name(scc_parser_t *parser);
|
|
|
|
static inline void scc_parse_decl_sema(scc_parser_t *parser,
|
|
scc_ast_decl_t *decl) {
|
|
parser->sema_callbacks.on_decl(parser->sema_callbacks.context,
|
|
decl ? decl->base.type : SCC_AST_UNKNOWN,
|
|
decl);
|
|
}
|
|
|
|
static inline void scc_parse_type_sema(scc_parser_t *parser,
|
|
scc_ast_type_t *type) {
|
|
parser->sema_callbacks.on_type(parser->sema_callbacks.context,
|
|
type ? type->base.type : SCC_AST_UNKNOWN,
|
|
type);
|
|
}
|
|
|
|
static inline scc_ast_type_t *scc_parse_got_type(scc_parser_t *parser,
|
|
const char *name) {
|
|
return parser->sema_callbacks.got_type(parser->sema_callbacks.context,
|
|
name);
|
|
}
|
|
|
|
#endif /* __SCC_PARSER_H__ */
|