chore: remove trailing whitespace from README.md line 42

This commit is contained in:
2025-12-04 15:49:20 +00:00
parent ed69521892
commit ce7624e693
13 changed files with 1046 additions and 18 deletions
+8
View File
@@ -35,6 +35,14 @@ void rava_ast_node_destroy(RavaASTNode_t *node) {
free(node->data.class_decl.modifiers);
rava_ast_node_destroy(node->data.class_decl.type);
break;
case RAVA_AST_ENUM_DECL:
free(node->data.enum_decl.name);
free(node->data.enum_decl.modifiers);
for (size_t i = 0; i < node->data.enum_decl.constants_count; i++) {
free(node->data.enum_decl.constants[i]);
}
free(node->data.enum_decl.constants);
break;
case RAVA_AST_METHOD_DECL:
free(node->data.method_decl.name);
free(node->data.method_decl.modifiers);
+8
View File
@@ -170,6 +170,14 @@ struct RavaASTNode_t {
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;
+111
View File
@@ -269,6 +269,112 @@ static RavaASTNode_t* _rava_parser_parse_interface_declaration(RavaParser_t *par
return interface_decl;
}
static RavaASTNode_t* _rava_parser_parse_enum_declaration(RavaParser_t *parser) {
RavaModifier_e *modifiers = NULL;
size_t modifiers_count = 0;
_rava_parser_parse_modifiers(parser, &modifiers, &modifiers_count);
_rava_parser_expect(parser, RAVA_TOKEN_KEYWORD_ENUM, "Expected 'enum' keyword");
RavaASTNode_t *enum_decl = rava_ast_node_create(RAVA_AST_ENUM_DECL,
parser->current_token->line,
parser->current_token->column);
enum_decl->data.enum_decl.modifiers = modifiers;
enum_decl->data.enum_decl.modifiers_count = modifiers_count;
enum_decl->data.enum_decl.constants = NULL;
enum_decl->data.enum_decl.constants_count = 0;
if (_rava_parser_check(parser, RAVA_TOKEN_IDENTIFIER)) {
enum_decl->data.enum_decl.name = strdup(parser->current_token->lexeme);
_rava_parser_advance(parser);
}
_rava_parser_expect(parser, RAVA_TOKEN_LBRACE, "Expected '{' after enum name");
size_t capacity = 8;
enum_decl->data.enum_decl.constants = malloc(capacity * sizeof(char*));
if (!enum_decl->data.enum_decl.constants) {
parser->had_error = true;
return NULL;
}
while (!_rava_parser_check(parser, RAVA_TOKEN_RBRACE) &&
!_rava_parser_check(parser, RAVA_TOKEN_SEMICOLON) &&
!_rava_parser_check(parser, RAVA_TOKEN_EOF)) {
if (_rava_parser_check(parser, RAVA_TOKEN_IDENTIFIER)) {
if (enum_decl->data.enum_decl.constants_count >= capacity) {
capacity *= 2;
char **new_constants = rava_safe_realloc(
enum_decl->data.enum_decl.constants,
capacity * sizeof(char*));
if (!new_constants) {
parser->had_error = true;
return NULL;
}
enum_decl->data.enum_decl.constants = new_constants;
}
enum_decl->data.enum_decl.constants[enum_decl->data.enum_decl.constants_count++] =
strdup(parser->current_token->lexeme);
_rava_parser_advance(parser);
}
if (!_rava_parser_match(parser, RAVA_TOKEN_COMMA)) {
break;
}
}
if (_rava_parser_match(parser, RAVA_TOKEN_SEMICOLON)) {
while (!_rava_parser_check(parser, RAVA_TOKEN_RBRACE) &&
!_rava_parser_check(parser, RAVA_TOKEN_EOF)) {
RavaModifier_e *member_modifiers = NULL;
size_t member_modifiers_count = 0;
_rava_parser_parse_modifiers(parser, &member_modifiers, &member_modifiers_count);
RavaASTNode_t *member_type = _rava_parser_parse_type(parser);
if (_rava_parser_check(parser, RAVA_TOKEN_IDENTIFIER)) {
char *name = strdup(parser->current_token->lexeme);
_rava_parser_advance(parser);
if (_rava_parser_check(parser, RAVA_TOKEN_LPAREN)) {
RavaASTNode_t *method = _rava_parser_parse_method_declaration(parser,
member_modifiers,
member_modifiers_count,
member_type);
method->data.method_decl.name = name;
rava_ast_node_add_child(enum_decl, method);
} else {
RavaASTNode_t *field = rava_ast_node_create(RAVA_AST_FIELD_DECL,
parser->current_token->line,
parser->current_token->column);
field->data.field_decl.type = member_type;
field->data.field_decl.name = name;
field->data.field_decl.modifiers = member_modifiers;
field->data.field_decl.modifiers_count = member_modifiers_count;
if (_rava_parser_match(parser, RAVA_TOKEN_ASSIGN)) {
field->data.field_decl.initializer = _rava_parser_parse_expression(parser);
} else {
field->data.field_decl.initializer = NULL;
}
_rava_parser_expect(parser, RAVA_TOKEN_SEMICOLON, "Expected ';' after field");
rava_ast_node_add_child(enum_decl, field);
}
} else {
free(member_modifiers);
}
}
}
_rava_parser_expect(parser, RAVA_TOKEN_RBRACE, "Expected '}' after enum body");
return enum_decl;
}
RavaASTNode_t* rava_parser_parse(RavaParser_t *parser) {
RavaASTNode_t *root = rava_ast_node_create(RAVA_AST_COMPILATION_UNIT, 1, 1);
@@ -293,6 +399,11 @@ RavaASTNode_t* rava_parser_parse(RavaParser_t *parser) {
parser->current_token = saved;
free(modifiers);
decl = _rava_parser_parse_class_declaration(parser);
} else if (_rava_parser_check(parser, RAVA_TOKEN_KEYWORD_ENUM)) {
RavaToken_t *saved = parser->current_token;
parser->current_token = saved;
free(modifiers);
decl = _rava_parser_parse_enum_declaration(parser);
} else {
free(modifiers);
break;
+4
View File
@@ -12,6 +12,7 @@ static const char* _rava_ast_node_type_name(RavaASTNodeType_e type) {
switch (type) {
case RAVA_AST_COMPILATION_UNIT: return "CompilationUnit";
case RAVA_AST_CLASS_DECL: return "ClassDecl";
case RAVA_AST_ENUM_DECL: return "EnumDecl";
case RAVA_AST_METHOD_DECL: return "MethodDecl";
case RAVA_AST_FIELD_DECL: return "FieldDecl";
case RAVA_AST_CONSTRUCTOR_DECL: return "ConstructorDecl";
@@ -53,6 +54,9 @@ void rava_ast_print(RavaASTNode_t *node, int depth) {
case RAVA_AST_CLASS_DECL:
printf(": %s\n", node->data.class_decl.name);
break;
case RAVA_AST_ENUM_DECL:
printf(": %s\n", node->data.enum_decl.name);
break;
case RAVA_AST_METHOD_DECL:
printf(": %s\n", node->data.method_decl.name);
break;