- 添加 scc_parse_assignment_expression 函数用于解析赋值表达式 - 添加 scc_parser_constant_expression 函数用于解析常量表达式 - 修改 cast 表达式解析逻辑,修复类型转换解析问题 - 改进错误处理机制,使用 SCC_ERROR 替代 LOG_ERROR 并提供准确位置信息 - 移除未使用的变量声明,优化代码结构 refactor(ast): 调整类型定义中的 typedef 类型存储结构 - 将 scc_ast_type 中的 underlying 字段改为 decl 字段 - 更新相关初始化函数以适配新的字段名称 - 修复枚举类型初始化时缺失的 decl 字段设置 feat(ast): 添加类型转换、sizeof 和 alignof 表达式的初始化函数 - 实现 scc_ast_expr_cast_init 用于初始化类型转换表达式 - 实现 scc_ast_expr_sizeof_init 用于初始化 sizeof 表达式 - 实现 scc_ast_expr_alignof_init 用于初始化 alignof 表达式 - 完善表达式类型的支持 chore(parser): 增加语义分析回调接口和位置获取工具函数 - 添加 scc_parse_decl_sema、scc_parse_type_sema 等语义分析辅助函数 - 提供 scc_parser_got_current_pos 函数获取当前解析位置 - 增强错误报告的准确性 refactor(dump): 完善 AST 转储功能,支持 break 和 continue 语句 - 为 SCC_AST_STMT_BREAK 和 SCC_AST_STMT_CONTINUE 添加转储支持 - 优化转储函数的分支处理结构
101 lines
2.8 KiB
C
101 lines
2.8 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);
|
|
|
|
/**
|
|
* @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_node_t *_scc_parse_type(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__ */
|