- 添加SCC_AST_EXPR_BUILTIN枚举值用于表示内置表达式 - 定义scc_ast_builtin_expr_type_t枚举包含va_start、va_end、va_copy、va_arg等内置函数类型 - 在AST表达式结构中添加builtin字段以支持内置表达式存储 - 实现scc_ast_decl_unsafe_val_init内联函数用于不安全的声明初始化 - 修改sizeof和alignof表达式初始化函数以支持类型或表达式参数 - 修复默认语句的字段引用错误(default_stmt而非case_stmt) - 改进词法分析器对整数字面量后缀(U、L、LL等)的处理逻辑 - 重构解析器中的声明解析逻辑,统一使用scc_parse_declarator函数 - 完善结构体、联合体和枚举类型的声明解析,支持仅有名称的前向声明 - 优化初始化列表解析,支持复合字面量的成员访问语法 - 更新参数类型列表解析以正确处理参数声明 - 修复括号表达式的解析逻辑,区分类型转换和普通括号表达式
102 lines
2.9 KiB
C
102 lines
2.9 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);
|
|
scc_ast_expr_t *scc_parse_initializer(scc_parser_t *parser,
|
|
scc_ast_expr_t *base);
|
|
|
|
/**
|
|
* @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_decl_t *scc_parse_declarator(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__ */
|