/** * @file parser.h */ #ifndef __SCC_PARSER_H__ #define __SCC_PARSER_H__ #include "scc_ast.h" #include /** * @brief 解析器状态 */ typedef struct scc_parser { scc_lexer_stream_t *lex_stream; // 词法分析器 scc_sema_callbacks_t sema_callbacks; // 语义分析回调 scc_ast_translation_unit_t *translation_unit; // 翻译单元(根节点) cbool has_error; // 是否有错误 } scc_parser_t; /** * @brief 检查当前 token 类型 */ static inline cbool scc_parse_is(scc_lexer_stream_t *stream, scc_tok_type_t type) { const scc_lexer_tok_t *tok = scc_lexer_stream_current(stream); return tok->type == type; } /** * @brief 检查前瞻 token 类型 */ static inline cbool scc_parse_peek_is(scc_lexer_stream_t *stream, usize n, scc_tok_type_t type) { const scc_lexer_tok_t *tok = scc_lexer_stream_peek(stream, n); return tok->type == type; } /** * @brief 如果当前 token 匹配则消费 */ static inline cbool scc_parse_consume_if(scc_lexer_stream_t *stream, scc_tok_type_t type) { if (scc_parse_is(stream, type)) { scc_lexer_stream_consume(stream); return true; } return false; } /** * @brief 消费当前 token 并返回它 */ static inline const scc_lexer_tok_t * scc_parse_consume(scc_lexer_stream_t *stream) { const scc_lexer_tok_t *tok = scc_lexer_stream_current(stream); scc_lexer_stream_consume(stream); return tok; } /** * @brief 初始化解析器 * @param parser 解析器实例 * @param lexer 词法分析器实例 * @param callbacks 语义分析回调(可为 null) */ void scc_parser_init(scc_parser_t *parser, scc_lexer_stream_t *lexer, 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_type_t *scc_parse_type(scc_parser_t *parser); cbool scc_parse_is_declaration_start(scc_parser_t *parser, usize offset); #endif /* __SCC_PARSER_H__ */