Files
scc/libs/ast/include/ast_def.h
zzy eeb4c4fc3c feat(ast): 重构AST节点类型定义并实现数组下标访问
- 将scc_ast_node_type_t重命名为scc_ast_node_kind_t以提高语义清晰度
- 为scc_ast_node结构体添加名称定义
- 更新所有相关头文件中的类型引用
- 实现数组下标表达式的IR转换逻辑
- 添加对sizeof和alignof表达式的基本支持

fix(ast2ir): 修复表达式求值和类型处理问题

- 修复数组类型退化为指针的逻辑
- 修复变量声明初始化值检查条件
- 添加结构体和枚举类型的IR生成支持
- 移除未使用的代码段

refactor(ir): 完善IR上下文错误处理

- 为未处理的类型标签添加恐慌处理
- 修复联合类型的哈希计算

chore(build): 更新依赖项配置

- 修正lexer模块中的依赖项名称

style(parser): 清理解析器代码

- 移除未使用的类型哈希表
- 更新语义分析回调函数签名
- 添加属性语法的占位符实现
- 完善内存清理逻辑

test: 添加数组下标和枚举测试用例

- 新增15_array_subscript.c测试数组下标访问
- 新增16_enum.c测试枚举类型功能
- 更新期望结果配置文件
2026-04-09 11:18:32 +08:00

450 lines
13 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#ifndef __SCC_AST_DEF_H__
#define __SCC_AST_DEF_H__
#include <scc_core.h>
#include <scc_pos.h>
/**
* @brief AST 节点类型枚举
*/
typedef enum {
SCC_AST_UNKNOWN,
// 声明
scc_ast_decl_t_BEGIN, // 声明开始 sema 函数作用域开始
SCC_AST_DECL_LIST, // 声明列表
SCC_AST_DECL_VAR, // 变量声明
SCC_AST_DECL_FUNC, // 函数声明
SCC_AST_DECL_PARAM, // 参数声明
SCC_AST_DECL_STRUCT, // 结构体声明
SCC_AST_DECL_UNION, // 联合声明
SCC_AST_DECL_ENUM, // 枚举声明
SCC_AST_DECL_TYPEDEF, // typedef 声明
scc_ast_decl_t_END, // 声明结束 sema 函数作用域结束
// 语句
scc_ast_stmt_t_BEGIN, // 语句开始 sema 作用域开始
SCC_AST_STMT_COMPOUND, // 复合语句 { ... }
SCC_AST_STMT_EXPR, // 表达式语句
SCC_AST_STMT_IF, // if 语句
SCC_AST_STMT_WHILE, // while 语句
SCC_AST_STMT_DO_WHILE, // do-while 语句
SCC_AST_STMT_FOR, // for 语句
SCC_AST_STMT_SWITCH, // switch 语句
SCC_AST_STMT_CASE, // case 语句
SCC_AST_STMT_DEFAULT, // default 语句
SCC_AST_STMT_BREAK, // break 语句
SCC_AST_STMT_CONTINUE, // continue 语句
SCC_AST_STMT_RETURN, // return 语句
SCC_AST_STMT_GOTO, // goto 语句
SCC_AST_STMT_LABEL, // 标签语句
scc_ast_stmt_t_END, // 结束语句 sema 作用域结束
// 表达式
scc_ast_expr_t_BEGIN, // 表达式开始
SCC_AST_EXPR_BINARY, // 二元运算
SCC_AST_EXPR_UNARY, // 一元运算
SCC_AST_EXPR_COND, // 条件表达式 ?:
SCC_AST_EXPR_CALL, // 函数调用
SCC_AST_EXPR_ARRAY_SUBSCRIPT, // 数组下标
SCC_AST_EXPR_MEMBER, // 成员访问 .
SCC_AST_EXPR_PTR_MEMBER, // 指针成员访问 ->
SCC_AST_EXPR_CAST, // 类型转换
SCC_AST_EXPR_SIZE_OF, // sizeof
SCC_AST_EXPR_ALIGN_OF, // _Alignof
SCC_AST_EXPR_COMPOUND, // 复合字面量
SCC_AST_EXPR_LVALUE, // 右值
SCC_AST_EXPR_BUILTIN, // 内置表达式
// 字面量
SCC_AST_EXPR_INT_LITERAL, // 整数字面量
SCC_AST_EXPR_FLOAT_LITERAL, // 浮点字面量
SCC_AST_EXPR_CHAR_LITERAL, // 字符字面量
SCC_AST_EXPR_STRING_LITERAL, // 字符串字面量
// 标识符
SCC_AST_EXPR_IDENTIFIER, // 标识符
scc_ast_expr_t_END, // 表达式结束
// 类型
scc_ast_type_t_BEGIN, // 类型开始
SCC_AST_TYPE_BUILTIN, // 内置类型
SCC_AST_TYPE_POINTER, // 指针类型
SCC_AST_TYPE_ARRAY, // 数组类型
SCC_AST_TYPE_FUNCTION, // 函数类型
SCC_AST_TYPE_STRUCT, // 结构体类型
SCC_AST_TYPE_UNION, // 联合类型
SCC_AST_TYPE_ENUM, // 枚举类型
SCC_AST_TYPE_TYPEDEF, // typedef 类型
scc_ast_type_t_END, // 类型结束
// 其他
scc_ast_translation_unit_t_BEGIN,
SCC_AST_TRANSLATION_UNIT, // 翻译单元(根节点)
scc_ast_translation_unit_t_END,
} scc_ast_node_kind_t;
typedef struct scc_ast_node {
scc_ast_node_kind_t type;
scc_pos_t loc;
} scc_ast_node_t;
#define SCC_AST_CAST_TO(kind, expr) \
((kind *)(Assert(((scc_ast_node_t *)expr)->type > kind##_BEGIN && \
((scc_ast_node_t *)expr)->type < kind##_END), \
(expr)))
#define SCC_AST_IS_A(kind, expr) \
((expr) && (((scc_ast_node_t *)expr)->type > kind##_BEGIN && \
((scc_ast_node_t *)expr)->type < kind##_END))
/**
* @brief 内置类型枚举
*/
typedef enum {
SCC_AST_BUILTIN_TYPE_UNKNOWN,
SCC_AST_BUILTIN_TYPE_VA_LIST,
SCC_AST_BUILTIN_TYPE_VOID,
SCC_AST_BUILTIN_TYPE_BOOL,
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_UNSIGNED_CHAR,
SCC_AST_BUILTIN_TYPE_UNSIGNED_SHORT,
SCC_AST_BUILTIN_TYPE_UNSIGNED_INT,
SCC_AST_BUILTIN_TYPE_UNSIGNED_LONG,
SCC_AST_BUILTIN_TYPE_UNSIGNED_LONG_LONG,
SCC_AST_BUILTIN_TYPE_SIGNED_CHAR,
SCC_AST_BUILTIN_TYPE_SIGNED_SHORT,
SCC_AST_BUILTIN_TYPE_SIGNED_INT,
SCC_AST_BUILTIN_TYPE_SIGNED_LONG,
SCC_AST_BUILTIN_TYPE_SIGNED_LONG_LONG,
SCC_AST_BUILTIN_TYPE_FLOAT,
SCC_AST_BUILTIN_TYPE_DOUBLE,
SCC_AST_BUILTIN_TYPE_LONG_DOUBLE,
SCC_AST_BUILTIN_TYPE_COMPLEX_FLOAT,
SCC_AST_BUILTIN_TYPE_COMPLEX_DOUBLE,
SCC_AST_BUILTIN_TYPE_COMPLEX_LONG_DOUBLE,
} scc_ast_builtin_type_t;
/**
* @brief 限定符
*/
typedef struct {
// storage-class-specifier
cbool is_typedef;
cbool is_extern;
cbool is_static;
cbool is_auto;
cbool is_register;
// type-qualifier
cbool is_const;
cbool is_volatile;
cbool is_restrict;
cbool is_atomic;
// function-specifier
cbool is_inline;
} scc_ast_decl_specifier_t;
// 前向声明
typedef struct scc_ast_type scc_ast_type_t;
typedef struct scc_ast_expr scc_ast_expr_t;
typedef struct scc_ast_stmt scc_ast_stmt_t;
typedef struct scc_ast_decl scc_ast_decl_t;
typedef SCC_VEC(scc_ast_type_t *) scc_ast_type_vec_t;
typedef SCC_VEC(scc_ast_expr_t *) scc_ast_expr_vec_t;
typedef SCC_VEC(scc_ast_stmt_t *) scc_ast_stmt_vec_t;
typedef SCC_VEC(scc_ast_decl_t *) scc_ast_decl_vec_t;
// 通过指针实现泛型 only stmt or decl
typedef SCC_VEC(scc_ast_node_t *) scc_ast_block_item_vec_t;
/**
* @brief 类型表示
*/
struct scc_ast_type {
scc_ast_node_t base;
scc_ast_decl_specifier_t quals;
union {
struct {
scc_ast_builtin_type_t type;
} builtin;
struct {
scc_ast_type_t *pointee;
} pointer;
struct {
scc_ast_type_t *element;
scc_ast_expr_t *size; // 可为 nullptr <=> 不定长数组
} array;
struct {
scc_ast_type_t *return_type;
scc_ast_decl_vec_t params; // va_list <=> ...
} function;
struct {
const char *name;
scc_ast_decl_t *decl; // can be nullptr
} record;
struct {
const char *name;
scc_ast_decl_t *decl;
} typedef_type;
};
};
/**
* @brief AST 操作符枚举
* 这个枚举定义了所有在AST中使用的操作符与词法token分离
*/
typedef enum scc_ast_expr_op {
/* 无操作符 */
SCC_AST_OP_NONE = 0,
/* 赋值操作符 */
SCC_AST_OP_ASSIGN, // =
SCC_AST_OP_ASSIGN_ADD, // +=
SCC_AST_OP_ASSIGN_SUB, // -=
SCC_AST_OP_ASSIGN_MUL, // *=
SCC_AST_OP_ASSIGN_DIV, // /=
SCC_AST_OP_ASSIGN_MOD, // %=
SCC_AST_OP_ASSIGN_AND, // &=
SCC_AST_OP_ASSIGN_XOR, // ^=
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, // - (一元)
SCC_AST_OP_ADDRESS_OF, // &
SCC_AST_OP_INDIRECTION, // *
SCC_AST_OP_BITWISE_NOT, // ~
SCC_AST_OP_LOGICAL_NOT, // !
SCC_AST_OP_PREFIX_INCREMENT, // ++ (前缀)
SCC_AST_OP_PREFIX_DECREMENT, // -- (前缀)
SCC_AST_OP_POSTFIX_INCREMENT, // ++ (后缀)
SCC_AST_OP_POSTFIX_DECREMENT, // -- (后缀)
} scc_ast_expr_op_t;
typedef enum {
SCC_AST_EXPR_BUILTIN_VA_START,
SCC_AST_EXPR_BUILTIN_VA_END,
SCC_AST_EXPR_BUILTIN_VA_COPY,
SCC_AST_EXPR_BUILTIN_VA_ARG,
} scc_ast_builtin_expr_type_t;
/**
* @brief 表达式节点
*/
struct scc_ast_expr {
scc_ast_node_t base;
union {
// 二元运算
struct {
scc_ast_expr_op_t op;
scc_ast_expr_t *lhs;
scc_ast_expr_t *rhs;
} binary;
// 一元运算
struct {
scc_ast_expr_op_t op;
scc_ast_expr_t *operand;
} unary;
// 条件表达式
struct {
scc_ast_expr_t *cond;
scc_ast_expr_t *then_expr;
scc_ast_expr_t *else_expr;
} cond;
// 函数调用
struct {
scc_ast_expr_t *callee;
scc_ast_expr_vec_t args;
} call;
// 数组下标
struct {
scc_ast_expr_t *array;
scc_ast_expr_t *index;
} subscript;
// 成员访问 指针成员访问
struct {
scc_ast_expr_t *base;
const char *name;
usize _target_idx; ///< fill by sema
} member;
// cast 类型转换
struct {
scc_ast_type_t *type;
scc_ast_expr_t *expr;
} cast;
// sizeof / _Alignof / ...
union {
scc_ast_type_t *type;
scc_ast_expr_t *expr;
} attr_of;
// 复合字面量
struct {
scc_ast_expr_t *base;
scc_ast_expr_vec_t lhs_exprs;
scc_ast_expr_vec_t rhs_exprs;
} compound;
// 字面量
struct {
const char *lexme;
cbool owned;
} literal;
// 标识符
struct {
const char *name;
scc_ast_decl_t *_target; ///< fill by sema
} identifier;
struct {
scc_ast_type_t *type;
} lvalue;
// 内置表达式
struct {
scc_ast_builtin_expr_type_t type;
scc_ast_expr_vec_t args;
} builtin;
};
};
/**
* @brief 语句节点
*/
struct scc_ast_stmt {
scc_ast_node_t base;
union {
// 复合语句
struct {
scc_ast_block_item_vec_t block_items; // decl or stmt
} compound;
// 表达式语句
struct {
scc_ast_expr_t *expr;
} expr;
// if 语句
struct {
scc_ast_expr_t *cond;
scc_ast_stmt_t *then_stmt;
scc_ast_stmt_t *opt_else_stmt; // stmt or nullptr
} if_stmt;
// while do-while 语句
struct {
scc_ast_expr_t *cond;
scc_ast_stmt_t *body;
} while_stmt;
// for 语句
struct {
scc_ast_node_t *init; // expr or decl or nullptr
scc_ast_expr_t *cond; // 可为 nullptr
scc_ast_expr_t *incr; // 可为 nullptr
scc_ast_stmt_t *body;
} for_stmt;
// switch 语句
struct {
scc_ast_expr_t *cond;
scc_ast_stmt_t *body;
} switch_stmt;
// case 语句
struct {
scc_ast_expr_t *expr;
scc_ast_stmt_t *stmt;
} case_stmt;
// default 语句
struct {
scc_ast_stmt_t *stmt;
} default_stmt;
// break/continue
struct {
scc_ast_stmt_t *_target; // fill by sema
} jump;
// return 语句
struct {
scc_ast_expr_t *expr; // 可为 nullptr
} return_stmt;
// goto 语句
struct {
const char *label;
scc_ast_stmt_t *_target; // fill by sema
} goto_stmt;
// 标签语句
struct {
const char *label;
scc_ast_stmt_t *stmt;
} label_stmt;
};
};
/**
* @brief 声明节点
*/
struct scc_ast_decl {
scc_ast_node_t base;
const char *name;
union {
struct {
scc_ast_decl_vec_t vars;
} list;
// 变量声明
struct {
scc_ast_type_t *type;
scc_ast_expr_t *init; // 可为 nullptr
} var;
// 函数声明
struct {
scc_ast_type_t *type; // 函数类型
scc_ast_stmt_t *body; // 可为 nullptr 表示只有声明
} func;
// 参数声明
struct {
scc_ast_type_t *type;
} param;
// 结构体/联合/枚举声明
struct {
scc_ast_decl_vec_t fields;
} record;
// typedef 声明
struct {
scc_ast_type_t *type;
} typedef_decl;
};
};
/**
* @brief 翻译单元节点(根节点)
*/
typedef struct scc_ast_translation_unit {
scc_ast_node_t base;
scc_ast_decl_vec_t declarations;
} scc_ast_translation_unit_t;
#endif /* __SCC_AST_DEF_H__ */