// // Created by Natuie on 2025/3/22. // #ifndef VETY_PARSER_H #define VETY_PARSER_H #include "lexer.h" #include "ast.h" // 运算符优先级枚举 typedef enum { PREC_NONE, // 无优先级 PREC_ASSIGNMENT, // =, +=, etc PREC_TERNARY, // ?: PREC_OR, // || PREC_AND, // && PREC_EQUALITY, // ==, != PREC_COMPARISON, // <, >, <=, >= PREC_BITWISE, // |, &, ^ PREC_SHIFT, // <<, >> PREC_TERM, // +, - PREC_FACTOR, // *, /, % PREC_UNARY, // !, -, ~ PREC_CALL, // (), [], . PREC_CAST, // as PREC_PRIMARY // 基本表达式 } OperatorPrecedence; typedef struct { Lexer *lexer; Token current_token; Token previous_token; char *filename; int had_error; // 标记是否发生错误 int error_count; // 错误计数 struct { char* message; int line; int column; } *errors; // 错误信息数组 } Parser; void parser_init(Parser* parser, Lexer* lexer, char* filename); void parser_free(Parser* parser); Token consume_token(Parser* parser); int match_token(Parser* parser, TokenType type); Token expect_token(Parser* parser, TokenType type); ASTNode* parse_statement(Parser* parser); int get_precedence(TokenType type); ASTNode* parse_unary(Parser* parser); ASTNode* parse_expression(Parser* parser); ASTNode* parse_expression_with_precedence(Parser* parser, int precedence); ASTNode* parse_primary(Parser* parser); ASTNode* parse_block(Parser* parser); ASTNode* parse_program(Parser* parser); ASTNode* parse_var_declaration(Parser* parser); ASTNode* parse_function_declaration(Parser* parser); ASTNode* parse_import_statement(Parser* parser); ASTNode* parse_break_statement(Parser* parser); ASTNode* parse_continue_statement(Parser* parser); ASTNode* parse_expression_statement(Parser* parser); ASTNode* parse_while_statement(Parser* parser); ASTNode* parse_for_statement(Parser* parser); ASTNode* parse_if_statement(Parser* parser); ASTNode* parse_return_statement(Parser* parser); ASTNode* parse_throw_statement(Parser* parser); ASTNode* parse_annotation(Parser* parser); #endif //VETY_PARSER_H