feat(parser): 实现赋值表达式和常量表达式解析功能
- 添加 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 添加转储支持 - 优化转储函数的分支处理结构
This commit is contained in:
@@ -90,6 +90,10 @@ static inline void fill_replacements(scc_pproc_t *pp,
|
||||
scc_ring_next_consume(*pp->cur_ring, tok, ok);
|
||||
if (!ok)
|
||||
break;
|
||||
if (scc_get_tok_subtype(tok.type) == SCC_TOK_SUBTYPE_COMMENT) {
|
||||
scc_lexer_tok_drop(&tok);
|
||||
continue;
|
||||
}
|
||||
if (tok.type == SCC_TOK_EOF || tok.type == SCC_TOK_ENDLINE) {
|
||||
scc_lexer_tok_drop(&tok);
|
||||
break;
|
||||
|
||||
@@ -96,10 +96,10 @@ cbool scc_pproc_add_function_macro(scc_pproc_macro_table_t *macros,
|
||||
|
||||
scc_pproc_macro_t *scc_pproc_macro_table_set(scc_pproc_macro_table_t *pp,
|
||||
scc_pproc_macro_t *macro) {
|
||||
Assert(pp != null && macro != null);
|
||||
Assert(pp != null && macro != null && scc_cstring_len(¯o->name) != 0);
|
||||
scc_pproc_macro_t *old = scc_hashtable_set(&pp->table, ¯o->name, macro);
|
||||
if (old && old != macro) {
|
||||
LOG_WARN("same macro name");
|
||||
LOG_WARN("same macro name `%s`", scc_cstring_as_cstr(¯o->name));
|
||||
scc_pproc_macro_drop(old);
|
||||
}
|
||||
return macro;
|
||||
|
||||
@@ -194,6 +194,11 @@ static void test_define_nested_macros(void) {
|
||||
CHECK_PP_OUTPUT_EXACT("#define default a\n"
|
||||
"default\n",
|
||||
"a\n");
|
||||
|
||||
TEST_CASE("test_macro_end_by_comment");
|
||||
CHECK_PP_OUTPUT_EXACT("#define MAX_SIZE 128///! COMMENT\n"
|
||||
"MAX_SIZE\n",
|
||||
"128\n");
|
||||
}
|
||||
|
||||
static void test_undef_macros(void) {
|
||||
|
||||
Reference in New Issue
Block a user