feat(parser): 启用parser和ast模块并重构解析器结构

- 在cbuild.toml中启用parser和ast依赖项
- 将AST内置类型枚举重命名为SCC_AST_BUILTIN_TYPE_*前缀格式
- 修复ast_def.h中的类型字段命名,将builtin改为type
- 添加逗号操作符支持到表达式操作符枚举中
- 更新字面量表达式的lexeme字段为const char*指针和owned标志
- 重构解析器头文件结构,分离为parser.h、parser_utils.h、scc_sema.h等
- 实现新的解析器工具函数,包括预览、消费、回溯等功能
- 更新声明解析逻辑,使用新的解析器接口进行token处理
- 添加符号表语义分析功能框架
- 修复词法分析器中token移动时的空指针检查
- 统一使用scc_tree_dump_printf替代直接的scc_printf调用
This commit is contained in:
zzy
2026-03-09 15:25:12 +08:00
parent a805814d3f
commit 1fceeca011
28 changed files with 2759 additions and 1987 deletions

View File

@@ -95,19 +95,19 @@ typedef struct {
* @brief 内置类型枚举
*/
typedef enum {
TYPE_VOID,
TYPE_CHAR,
TYPE_SHORT,
TYPE_INT,
TYPE_LONG,
TYPE_LONG_LONG,
TYPE_FLOAT,
TYPE_DOUBLE,
TYPE_LONG_DOUBLE,
TYPE_BOOL,
TYPE_COMPLEX_FLOAT,
TYPE_COMPLEX_DOUBLE,
TYPE_COMPLEX_LONG_DOUBLE,
SCC_AST_BUILTIN_TYPE_VOID,
SCC_AST_BUILTIN_TYPE_CHAR,
SCC_AST_BUILTIN_TYPE_SHORT,
SCC_AST_BUILTIN_TYPE_INT,
SCC_AST_BUILTIN_TYPE_LONG,
SCC_AST_BUILTIN_TYPE_LONG_LONG,
SCC_AST_BUILTIN_TYPE_FLOAT,
SCC_AST_BUILTIN_TYPE_DOUBLE,
SCC_AST_BUILTIN_TYPE_LONG_DOUBLE,
SCC_AST_BUILTIN_TYPE_BOOL,
SCC_AST_BUILTIN_TYPE_COMPLEX_FLOAT,
SCC_AST_BUILTIN_TYPE_COMPLEX_DOUBLE,
SCC_AST_BUILTIN_TYPE_COMPLEX_LONG_DOUBLE,
} scc_ast_builtin_type_t;
/**
@@ -150,7 +150,7 @@ struct scc_ast_type {
scc_ast_node_t base;
union {
struct {
scc_ast_builtin_type_t builtin;
scc_ast_builtin_type_t type;
scc_ast_decl_specifier_t quals;
} builtin;
struct {
@@ -188,7 +188,6 @@ struct scc_ast_type {
typedef enum scc_ast_expr_op {
/* 无操作符 */
SCC_AST_OP_NONE = 0,
/* 赋值操作符 */
SCC_AST_OP_ASSIGN, // =
SCC_AST_OP_ASSIGN_ADD, // +=
@@ -201,40 +200,34 @@ typedef enum scc_ast_expr_op {
SCC_AST_OP_ASSIGN_OR, // |=
SCC_AST_OP_ASSIGN_LSHIFT, // <<=
SCC_AST_OP_ASSIGN_RSHIFT, // >>=
/* 条件操作符 */
SCC_AST_OP_CONDITIONAL, // ?:
/* 逗号操作符 */
SCC_AST_OP_COMMA, // ,
/* 逻辑操作符 */
SCC_AST_OP_LOGICAL_OR, // ||
SCC_AST_OP_LOGICAL_AND, // &&
/* 位操作符 */
SCC_AST_OP_BITWISE_OR, // |
SCC_AST_OP_BITWISE_XOR, // ^
SCC_AST_OP_BITWISE_AND, // &
/* 相等性操作符 */
SCC_AST_OP_EQUAL, // ==
SCC_AST_OP_NOT_EQUAL, // !=
/* 关系操作符 */
SCC_AST_OP_LESS, // <
SCC_AST_OP_GREATER, // >
SCC_AST_OP_LESS_EQUAL, // <=
SCC_AST_OP_GREATER_EQUAL, // >=
/* 移位操作符 */
SCC_AST_OP_LEFT_SHIFT, // <<
SCC_AST_OP_RIGHT_SHIFT, // >>
/* 算术操作符 */
SCC_AST_OP_ADD, // +
SCC_AST_OP_SUB, // -
SCC_AST_OP_MUL, // *
SCC_AST_OP_DIV, // /
SCC_AST_OP_MOD, // %
/* 一元操作符 */
SCC_AST_OP_UNARY_PLUS, // + (一元)
SCC_AST_OP_UNARY_MINUS, // - (一元)
@@ -246,7 +239,6 @@ typedef enum scc_ast_expr_op {
SCC_AST_OP_PREFIX_DECREMENT, // -- (前缀)
SCC_AST_OP_POSTFIX_INCREMENT, // ++ (后缀)
SCC_AST_OP_POSTFIX_DECREMENT, // -- (后缀)
/* 成员访问 */
SCC_AST_OP_MEMBER_ACCESS, // .
SCC_AST_OP_PTR_MEMBER_ACCESS, // ->
@@ -312,7 +304,8 @@ struct scc_ast_expr {
} compound_literal;
// 字面量
struct {
scc_cstring_t lexme;
const char *lexme;
cbool owned;
} literal;
// 标识符
struct {
@@ -408,7 +401,7 @@ struct scc_ast_decl {
struct {
const char *name;
scc_ast_type_t *type; // 函数类型
scc_ast_stmt_t *body; // 可为 NULL只有声明 or
scc_ast_stmt_t *body; // 可为 null 表示只有声明
} func;
// 参数声明
struct {

View File

@@ -2,5 +2,6 @@
#define __SCC_AST_H__
#include "ast_def.h"
#include "ast_dump.h"
#endif /* __SCC_AST_H__ */

View File

@@ -127,31 +127,31 @@ static const char *get_node_type_str(scc_ast_node_type_t type) {
// 获取内置类型名称
static const char *get_builtin_type_str(scc_ast_builtin_type_t type) {
switch (type) {
case TYPE_VOID:
case SCC_AST_BUILTIN_TYPE_VOID:
return "void";
case TYPE_CHAR:
case SCC_AST_BUILTIN_TYPE_CHAR:
return "char";
case TYPE_SHORT:
case SCC_AST_BUILTIN_TYPE_SHORT:
return "short";
case TYPE_INT:
case SCC_AST_BUILTIN_TYPE_INT:
return "int";
case TYPE_LONG:
case SCC_AST_BUILTIN_TYPE_LONG:
return "long";
case TYPE_LONG_LONG:
case SCC_AST_BUILTIN_TYPE_LONG_LONG:
return "long long";
case TYPE_FLOAT:
case SCC_AST_BUILTIN_TYPE_FLOAT:
return "float";
case TYPE_DOUBLE:
case SCC_AST_BUILTIN_TYPE_DOUBLE:
return "double";
case TYPE_LONG_DOUBLE:
case SCC_AST_BUILTIN_TYPE_LONG_DOUBLE:
return "long double";
case TYPE_BOOL:
case SCC_AST_BUILTIN_TYPE_BOOL:
return "_Bool";
case TYPE_COMPLEX_FLOAT:
case SCC_AST_BUILTIN_TYPE_COMPLEX_FLOAT:
return "float _Complex";
case TYPE_COMPLEX_DOUBLE:
case SCC_AST_BUILTIN_TYPE_COMPLEX_DOUBLE:
return "double _Complex";
case TYPE_COMPLEX_LONG_DOUBLE:
case SCC_AST_BUILTIN_TYPE_COMPLEX_LONG_DOUBLE:
return "long double _Complex";
default:
return "<unknown>";
@@ -259,7 +259,9 @@ static inline void start_node_dump(scc_ast_node_t *node,
}
// 通用的结束节点打印函数
static inline void end_node_dump(scc_tree_dump_ctx_t *ctx) { scc_printf("\n"); }
static inline void end_node_dump(scc_tree_dump_ctx_t *ctx) {
scc_tree_dump_printf(ctx, "\n");
}
// 通用的递归转储辅助函数
static inline void dump_child_node(scc_ast_node_t *child,
@@ -276,10 +278,11 @@ static inline void dump_child_node(scc_ast_node_t *child,
#define BUILD_TYPE_NAME(ctx, prefix, name) \
do { \
if (ctx->use_color) { \
scc_printf("%s'%s%s%s'%s", ctx->value_color, prefix, name, \
ctx->reset_color, ctx->reset_color); \
scc_tree_dump_printf(ctx, "%s'%s%s%s'%s", ctx->value_color, \
prefix, name, ctx->reset_color, \
ctx->reset_color); \
} else { \
scc_printf("'%s%s'", prefix, name); \
scc_tree_dump_printf(ctx, "'%s%s'", prefix, name); \
} \
} while (0)
@@ -293,18 +296,18 @@ static void dump_type_impl(scc_ast_type_t *type, scc_tree_dump_ctx_t *ctx) {
// 根据类型输出特定信息
switch (type->base.type) {
case SCC_AST_TYPE_BUILTIN:
PRINT_QUOTED_VALUE(ctx, get_builtin_type_str(type->builtin.builtin));
PRINT_QUOTED_VALUE(ctx, get_builtin_type_str(type->builtin.type));
break;
case SCC_AST_TYPE_POINTER:
if (type->pointer.pointee &&
type->pointer.pointee->base.type == SCC_AST_TYPE_BUILTIN) {
const char *base_type =
get_builtin_type_str(type->pointer.pointee->builtin.builtin);
get_builtin_type_str(type->pointer.pointee->builtin.type);
if (ctx->use_color) {
scc_printf("%s'%s *'%s", ctx->value_color, base_type,
ctx->reset_color);
scc_tree_dump_printf(ctx, "%s'%s *'%s", ctx->value_color,
base_type, ctx->reset_color);
} else {
scc_printf("'%s *'", base_type);
scc_tree_dump_printf(ctx, "'%s *'", base_type);
}
} else {
PRINT_QUOTED_VALUE(ctx, "pointer");
@@ -315,7 +318,7 @@ static void dump_type_impl(scc_ast_type_t *type, scc_tree_dump_ctx_t *ctx) {
break;
case SCC_AST_TYPE_FUNCTION:
PRINT_QUOTED_VALUE(ctx, "function");
scc_printf("\n");
scc_tree_dump_printf(ctx, "\n");
if (type->function.return_type) {
dump_type_impl(type->function.return_type, ctx);
}
@@ -451,7 +454,7 @@ static void dump_expr_impl(scc_ast_expr_t *expr, scc_tree_dump_ctx_t *ctx) {
// 打印成员访问信息
scc_tree_print_indent(ctx);
PRINT_NODE(ctx, "Member [\"%s\"]", expr->member.member_name);
scc_printf("\n");
scc_tree_dump_printf(ctx, "\n");
break;
case SCC_AST_EXPR_CAST:

0
libs/ast/src/scc_ast.c Normal file
View File