refactor(ast): 移除内置类型头文件并优化类型初始化
移除了独立的ast_builtin.h头文件,将内置类型定义整合到现有结构中, 同时修复了类型初始化函数命名不一致的问题。 BREAKING CHANGE: 原有的ast_builtin.h头文件已被移除, 相关内置类型声明已重构为新的接口形式。 fix(parser): 修复表达式解析中的位置信息处理 确保条件表达式和逗号表达式的解析正确获取并传递位置信息, 避免在语法树构建过程中丢失源码位置。 refactor(ir): 修复IR转储中的类型转换问题 添加必要的类型转换以防止整数溢出,并优化代码格式以提高可读性。 feat(parser): 添加表达式解析测试套件 引入全面的表达式解析测试框架,覆盖从基本表达式到复杂嵌套表达式 的各种场景,确保解析器功能的正确性和稳定性。
This commit is contained in:
@@ -427,8 +427,8 @@ static scc_ast_expr_t *parse_conditional_expression(scc_parser_t *parser) {
|
||||
return null;
|
||||
|
||||
const scc_lexer_tok_t *tok_ptr = scc_parser_peek(parser);
|
||||
scc_pos_t pos = tok_ptr->loc;
|
||||
if (tok_ptr && tok_ptr->type == SCC_TOK_COND) {
|
||||
scc_pos_t pos = tok_ptr->loc;
|
||||
// 消耗 '?'
|
||||
scc_lexer_tok_t q_tok;
|
||||
if (!scc_parser_next_consume(parser, &q_tok))
|
||||
@@ -867,6 +867,9 @@ scc_ast_expr_t *scc_parse_expression(scc_parser_t *parser) {
|
||||
if (tok_ptr == null || tok_ptr->type != SCC_TOK_COMMA) {
|
||||
break;
|
||||
}
|
||||
scc_pos_t pos = tok_ptr->loc;
|
||||
scc_parser_next_consume(parser, null);
|
||||
|
||||
scc_ast_expr_t *right = scc_parse_assignment_expression(parser);
|
||||
if (!right) {
|
||||
parser_sync(parser);
|
||||
@@ -874,8 +877,7 @@ scc_ast_expr_t *scc_parse_expression(scc_parser_t *parser) {
|
||||
}
|
||||
scc_ast_expr_t *expr = scc_malloc(sizeof(scc_ast_expr_t));
|
||||
Assert(expr != null);
|
||||
scc_ast_expr_binary_init(expr, SCC_AST_OP_COMMA, left, right,
|
||||
tok_ptr->loc);
|
||||
scc_ast_expr_binary_init(expr, SCC_AST_OP_COMMA, left, right, pos);
|
||||
left = expr;
|
||||
}
|
||||
return left;
|
||||
|
||||
@@ -529,7 +529,7 @@ static scc_ast_type_t *build_type_from_info(type_spec_info_t *info,
|
||||
}
|
||||
|
||||
scc_ast_type_t *type = ast_type_alloc();
|
||||
_scc_ast_type_builtin_init(type, builtin, pos);
|
||||
scc_ast_type_builtin_init(type, builtin, pos);
|
||||
// 注意:限定符(const, volatile)不应在此处处理,应由上层函数负责
|
||||
return type;
|
||||
}
|
||||
@@ -930,8 +930,12 @@ static void parse_parameter_type_list(scc_parser_t *parser,
|
||||
param = scc_malloc(sizeof(scc_ast_decl_t));
|
||||
Assert(param != null);
|
||||
// FIXME
|
||||
scc_ast_decl_param_init(param, &scc_ast_builtin_type_va_list, null,
|
||||
tok_ptr->loc);
|
||||
type = scc_malloc(sizeof(scc_ast_type_t));
|
||||
Assert(type != null);
|
||||
scc_ast_type_builtin_init(type, SCC_AST_BUILTIN_TYPE_VA_LIST,
|
||||
tok_ptr->loc);
|
||||
scc_ast_decl_param_init(param, type, null, tok_ptr->loc);
|
||||
scc_parser_next_consume(parser, null);
|
||||
scc_vec_push(*params, param);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -117,12 +117,13 @@ void scc_sema_init(scc_sema_callbacks_t *callbacks) {
|
||||
callbacks->got_type = got_type_callback;
|
||||
|
||||
scc_sema_symtab_init(sema_symtab);
|
||||
|
||||
// FIXME memory leak
|
||||
scc_ast_type_t *type = scc_malloc(sizeof(scc_ast_type_t));
|
||||
scc_ast_type_builtin_init(type, SCC_AST_BUILTIN_TYPE_VA_LIST,
|
||||
scc_pos_create());
|
||||
scc_sema_symtab_add_symbol(sema_symtab, "__scc_builtin_va_list",
|
||||
&scc_ast_builtin_type_va_list.base);
|
||||
scc_sema_symtab_add_symbol(sema_symtab, "__scc_builtin_size_t",
|
||||
&scc_ast_builtin_type_long_long.base);
|
||||
scc_sema_symtab_add_symbol(sema_symtab, "__scc_builtin_ptrdiff_t",
|
||||
&scc_ast_builtin_type_long_long.base);
|
||||
&type->base);
|
||||
}
|
||||
|
||||
void scc_sema_drop(scc_sema_callbacks_t *callbacks) {}
|
||||
|
||||
Reference in New Issue
Block a user