vety-language/parser/parser.h

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