chore: remove trailing whitespace from README.md line 42
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user