#ifndef RAVA_PARSER_H #define RAVA_PARSER_H #include "../lexer/lexer.h" #include #include typedef enum { RAVA_AST_COMPILATION_UNIT, RAVA_AST_PACKAGE_DECL, RAVA_AST_IMPORT_DECL, RAVA_AST_CLASS_DECL, RAVA_AST_INTERFACE_DECL, RAVA_AST_ENUM_DECL, RAVA_AST_FIELD_DECL, RAVA_AST_METHOD_DECL, RAVA_AST_CONSTRUCTOR_DECL, RAVA_AST_INITIALIZER_BLOCK, RAVA_AST_PARAM_DECL, RAVA_AST_VAR_DECL, RAVA_AST_BLOCK_STMT, RAVA_AST_IF_STMT, RAVA_AST_WHILE_STMT, RAVA_AST_DO_WHILE_STMT, RAVA_AST_FOR_STMT, RAVA_AST_ENHANCED_FOR_STMT, RAVA_AST_SWITCH_STMT, RAVA_AST_CASE_STMT, RAVA_AST_TRY_STMT, RAVA_AST_CATCH_CLAUSE, RAVA_AST_THROW_STMT, RAVA_AST_RETURN_STMT, RAVA_AST_BREAK_STMT, RAVA_AST_CONTINUE_STMT, RAVA_AST_EXPR_STMT, RAVA_AST_EMPTY_STMT, RAVA_AST_SYNCHRONIZED_STMT, RAVA_AST_ASSERT_STMT, RAVA_AST_LITERAL_EXPR, RAVA_AST_IDENTIFIER_EXPR, RAVA_AST_BINARY_EXPR, RAVA_AST_UNARY_EXPR, RAVA_AST_TERNARY_EXPR, RAVA_AST_ASSIGN_EXPR, RAVA_AST_CALL_EXPR, RAVA_AST_MEMBER_ACCESS_EXPR, RAVA_AST_ARRAY_ACCESS_EXPR, RAVA_AST_NEW_EXPR, RAVA_AST_CAST_EXPR, RAVA_AST_INSTANCEOF_EXPR, RAVA_AST_THIS_EXPR, RAVA_AST_SUPER_EXPR, RAVA_AST_CLASS_LITERAL_EXPR, RAVA_AST_ARRAY_INIT_EXPR, RAVA_AST_TYPE, RAVA_AST_TYPE_PARAM, RAVA_AST_MODIFIER } RavaASTNodeType_e; typedef enum { RAVA_MODIFIER_PUBLIC, RAVA_MODIFIER_PRIVATE, RAVA_MODIFIER_PROTECTED, RAVA_MODIFIER_STATIC, RAVA_MODIFIER_FINAL, RAVA_MODIFIER_ABSTRACT, RAVA_MODIFIER_NATIVE, RAVA_MODIFIER_SYNCHRONIZED, RAVA_MODIFIER_TRANSIENT, RAVA_MODIFIER_VOLATILE, RAVA_MODIFIER_STRICTFP } RavaModifier_e; typedef enum { RAVA_BINOP_ADD, RAVA_BINOP_SUB, RAVA_BINOP_MUL, RAVA_BINOP_DIV, RAVA_BINOP_MOD, RAVA_BINOP_EQ, RAVA_BINOP_NE, RAVA_BINOP_LT, RAVA_BINOP_LE, RAVA_BINOP_GT, RAVA_BINOP_GE, RAVA_BINOP_AND, RAVA_BINOP_OR, RAVA_BINOP_BITAND, RAVA_BINOP_BITOR, RAVA_BINOP_BITXOR, RAVA_BINOP_LSHIFT, RAVA_BINOP_RSHIFT, RAVA_BINOP_URSHIFT } RavaBinaryOp_e; typedef enum { RAVA_UNOP_PLUS, RAVA_UNOP_MINUS, RAVA_UNOP_NOT, RAVA_UNOP_BITNOT, RAVA_UNOP_PREINC, RAVA_UNOP_PREDEC, RAVA_UNOP_POSTINC, RAVA_UNOP_POSTDEC } RavaUnaryOp_e; typedef struct RavaASTNode_t RavaASTNode_t; struct RavaASTNode_t { RavaASTNodeType_e type; int line; int column; RavaASTNode_t *parent; RavaASTNode_t **children; size_t children_count; size_t children_capacity; union { struct { char *name; } identifier; struct { RavaTokenType_e literal_type; RavaLiteralValue_u value; } literal; struct { RavaBinaryOp_e op; RavaASTNode_t *left; RavaASTNode_t *right; } binary; struct { RavaUnaryOp_e op; RavaASTNode_t *operand; } unary; struct { RavaASTNode_t *condition; RavaASTNode_t *true_expr; RavaASTNode_t *false_expr; } ternary; struct { RavaASTNode_t *target; RavaASTNode_t *value; } assign; struct { char *name; char *superclass; RavaASTNode_t *type; RavaModifier_e *modifiers; size_t modifiers_count; } class_decl; struct { char *name; RavaASTNode_t *return_type; RavaModifier_e *modifiers; size_t modifiers_count; } method_decl; struct { char *name; RavaASTNode_t *type; RavaASTNode_t *initializer; } var_decl; struct { RavaASTNode_t *condition; RavaASTNode_t *then_stmt; RavaASTNode_t *else_stmt; } if_stmt; struct { RavaASTNode_t *condition; RavaASTNode_t *body; } while_stmt; struct { RavaASTNode_t *init; RavaASTNode_t *condition; RavaASTNode_t *update; RavaASTNode_t *body; } for_stmt; struct { RavaASTNode_t *value; } return_stmt; struct { char *type_name; bool is_array; int array_dimensions; } type; struct { RavaASTNode_t *callee; RavaASTNode_t **arguments; size_t arguments_count; } call; struct { RavaASTNode_t *object; char *member; } member_access; struct { RavaASTNode_t *array; RavaASTNode_t *index; } array_access; struct { RavaASTNode_t *type; RavaASTNode_t **arguments; size_t arguments_count; } new_expr; struct { RavaASTNode_t *type; RavaASTNode_t *expression; } cast; } data; }; typedef struct { RavaLexer_t *lexer; RavaToken_t *current_token; RavaToken_t *peek_token; char *error_message; bool had_error; } RavaParser_t; RavaParser_t* rava_parser_create(RavaLexer_t *lexer); void rava_parser_destroy(RavaParser_t *parser); RavaASTNode_t* rava_parser_parse(RavaParser_t *parser); RavaASTNode_t* rava_ast_node_create(RavaASTNodeType_e type, int line, int column); void rava_ast_node_destroy(RavaASTNode_t *node); void rava_ast_node_add_child(RavaASTNode_t *parent, RavaASTNode_t *child); #endif