|
#ifndef RAVA_PARSER_H
|
|
#define RAVA_PARSER_H
|
|
|
|
#include "../lexer/lexer.h"
|
|
#include <stddef.h>
|
|
#include <stdbool.h>
|
|
|
|
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_METHOD_REF_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;
|
|
char **interfaces;
|
|
size_t interfaces_count;
|
|
RavaASTNode_t *type;
|
|
RavaModifier_e *modifiers;
|
|
size_t modifiers_count;
|
|
} class_decl;
|
|
|
|
struct {
|
|
char *name;
|
|
RavaModifier_e *modifiers;
|
|
size_t modifiers_count;
|
|
} interface_decl;
|
|
|
|
struct {
|
|
char *name;
|
|
char **constants;
|
|
size_t constants_count;
|
|
RavaModifier_e *modifiers;
|
|
size_t modifiers_count;
|
|
} enum_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 {
|
|
char *name;
|
|
RavaASTNode_t *type;
|
|
RavaASTNode_t *initializer;
|
|
RavaModifier_e *modifiers;
|
|
size_t modifiers_count;
|
|
} field_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 *var_type;
|
|
char *var_name;
|
|
RavaASTNode_t *iterable;
|
|
RavaASTNode_t *body;
|
|
} enhanced_for;
|
|
|
|
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;
|
|
|
|
struct {
|
|
RavaASTNode_t *expression;
|
|
} switch_stmt;
|
|
|
|
struct {
|
|
RavaASTNode_t *value;
|
|
bool is_default;
|
|
} case_stmt;
|
|
|
|
struct {
|
|
RavaASTNode_t *try_block;
|
|
RavaASTNode_t **catch_clauses;
|
|
size_t catch_count;
|
|
RavaASTNode_t *finally_block;
|
|
} try_stmt;
|
|
|
|
struct {
|
|
char *exception_type;
|
|
char *exception_name;
|
|
RavaASTNode_t *body;
|
|
} catch_clause;
|
|
|
|
struct {
|
|
RavaASTNode_t *expression;
|
|
} throw_stmt;
|
|
|
|
struct {
|
|
RavaASTNode_t **elements;
|
|
size_t elements_count;
|
|
} array_init;
|
|
|
|
struct {
|
|
RavaASTNode_t *expression;
|
|
char *type_name;
|
|
} instanceof_expr;
|
|
|
|
struct {
|
|
RavaASTNode_t *target;
|
|
char *method_name;
|
|
bool is_constructor;
|
|
} method_ref;
|
|
} 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
|