将结构体、联合和枚举类型的字段表示从向量改为声明指针, 允许name和decl字段为null,更新相关初始化函数的断言检查, 使结构更加灵活并支持不完整类型定义。 BREAKING CHANGE: 修改了scc_ast_type结构体中record和enumeration 子类型的字段表示方法,从fields向量改为decl指针。
79 lines
1.8 KiB
C
79 lines
1.8 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);
|
|
|
|
/**
|
|
* @brief 解析语句
|
|
* @param parser 解析器实例
|
|
* @return 语句 AST 节点
|
|
*/
|
|
scc_ast_stmt_t *scc_parse_statement(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_node_t *_scc_parse_type(scc_parser_t *parser);
|
|
|
|
scc_ast_type_t *scc_parse_type_name(scc_parser_t *parser);
|
|
|
|
#endif /* __SCC_PARSER_H__ */
|