71 lines
2.1 KiB
C
71 lines
2.1 KiB
C
//
|
|
// 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
|