add hashmap to scope and identifier loading at runtime
This commit is contained in:
@@ -50,8 +50,8 @@ ParsedValueReturn parse_access(char *file, DArray *tokens, size_t *index,
|
||||
"Syntax Error", "expected value"),
|
||||
NULL};
|
||||
}
|
||||
darray_push(&parsedAccess->access, parsedValue);
|
||||
free(parsedValue);
|
||||
darray_push(&parsedAccess->access, parsedAccessValue.value);
|
||||
free(parsedAccessValue.value);
|
||||
skip_newlines_and_indents(tokens, index);
|
||||
error_if_finished(file, tokens, index);
|
||||
token = darray_get(tokens, *index);
|
||||
|
||||
@@ -4,9 +4,22 @@
|
||||
#include <string.h>
|
||||
#include "../../../memory.h"
|
||||
|
||||
|
||||
|
||||
ParsedValueReturn parse_identifier(Token *token) {
|
||||
ParsedValue *parsedValue = checked_malloc(sizeof(ParsedValue));
|
||||
ParsedIdentifier *parsedIdentifier = checked_malloc(sizeof(ParsedIdentifier));
|
||||
parsedIdentifier->name = strcpy(checked_malloc(token->length + 1), token->value);
|
||||
parsedIdentifier->line = token->line;
|
||||
parsedIdentifier->column = token->column;
|
||||
parsedValue->type = AST_IDENTIFIER;
|
||||
parsedValue->data = strcpy(checked_malloc(strlen(token->value) + 1), token->value);
|
||||
parsedValue->data = parsedIdentifier;
|
||||
return (ParsedValueReturn){no_err, parsedValue};
|
||||
}
|
||||
|
||||
void free_identifier(void *ptr) {
|
||||
ParsedValue *parsedValue = ptr;
|
||||
ParsedIdentifier *parsed = parsedValue->data;
|
||||
free(parsed->name);
|
||||
free(parsed);
|
||||
}
|
||||
@@ -3,7 +3,15 @@
|
||||
#include "../../parser.h"
|
||||
#include "../../../lexer/token.h" // for Token
|
||||
|
||||
typedef struct {
|
||||
char * name;
|
||||
size_t line;
|
||||
size_t column;
|
||||
} ParsedIdentifier;
|
||||
|
||||
// Function declaration for parsing an identifier
|
||||
ParsedValueReturn parse_identifier(Token *token);
|
||||
|
||||
void free_identifier(void *ptr);
|
||||
|
||||
#endif // IDENTIFIER_H
|
||||
@@ -35,13 +35,12 @@ ParsedValueReturn parse_dowrap(char *file, DArray *tokens, size_t *index) {
|
||||
return (ParsedValueReturn){no_err, parsedValue};
|
||||
Token *token = darray_get(tokens, *index);
|
||||
if (token->type != TOKEN_NEW_LINE) {
|
||||
free_parsed(parsedValue);
|
||||
free(parsedValue);
|
||||
return (ParsedValueReturn){create_err(token->line, token->column,
|
||||
token->length, file, "Syntax Error",
|
||||
"expected body"),
|
||||
NULL};
|
||||
fprintf(stderr, "%s:%zu:%zu error: syntax error\n", file, token->line,
|
||||
token->column);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
size_t indent_depth = 0;
|
||||
bool temp_indent_depth_toggle = false;
|
||||
|
||||
@@ -179,6 +179,7 @@ ArErr parser(char *file, DArray *parsed, DArray *tokens, bool inline_flag) {
|
||||
ParsedValueReturn parsed_code =
|
||||
parse_token(file, tokens, &index, inline_flag);
|
||||
if (parsed_code.err.exists) {
|
||||
printf("%zu\n", old_index);
|
||||
return parsed_code.err;
|
||||
} else if (parsed_code.value) {
|
||||
if (expecting_new_line) {
|
||||
@@ -194,6 +195,7 @@ ArErr parser(char *file, DArray *parsed, DArray *tokens, bool inline_flag) {
|
||||
expecting_new_line = false;
|
||||
}
|
||||
}
|
||||
return no_err;
|
||||
}
|
||||
|
||||
void free_parsed(void *ptr) {
|
||||
@@ -205,6 +207,8 @@ void free_parsed(void *ptr) {
|
||||
ParsedValue *parsed = ptr;
|
||||
switch (parsed->type) {
|
||||
case AST_IDENTIFIER:
|
||||
free_identifier(parsed);
|
||||
break;
|
||||
case AST_NUMBER:
|
||||
free(parsed->data);
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user