start rewriting the parser to return with error messages so errors can be caught

This commit is contained in:
2025-07-09 04:58:49 +01:00
parent e234ea074b
commit c4731597f3
22 changed files with 282 additions and 149 deletions

View File

@@ -7,8 +7,8 @@
#include <stdio.h>
#include <stdlib.h>
ParsedValue *parse_assign(char *file, DArray *tokens, ParsedValue *assign_to,
size_t *index) {
ParsedValueReturn parse_assign(char *file, DArray *tokens,
ParsedValue *assign_to, size_t *index) {
Token *token = darray_get(tokens, *index);
switch (assign_to->type) {
case AST_IDENTIFIER:
@@ -24,6 +24,7 @@ ParsedValue *parse_assign(char *file, DArray *tokens, ParsedValue *assign_to,
"only use letters, digits, or _, and can't be keywords.\n",
file, token->line, token->column);
exit(EXIT_FAILURE);
}
}
break;
@@ -35,19 +36,25 @@ ParsedValue *parse_assign(char *file, DArray *tokens, ParsedValue *assign_to,
ParsedAssign *assign = checked_malloc(sizeof(ParsedAssign));
assign->to = assign_to;
assign->type = token->type;
ParsedValue *parsedValue = checked_malloc(sizeof(ParsedValue));
parsedValue->type = AST_ASSIGN;
parsedValue->data = assign;
(*index)++;
error_if_finished(file, tokens, index);
token = darray_get(tokens, *index);
assign->from = parse_token(file, tokens, index, true);
ParsedValueReturn from = parse_token(file, tokens, index, true);
if (from.err.exists) {
free_parsed(parsedValue);
free(parsedValue);
return from;
}
assign->from = from.value;
if (!assign->from) {
fprintf(stderr, "%s:%zu:%zu error: syntax error\n", file, token->line,
token->column);
exit(EXIT_FAILURE);
}
ParsedValue *parsedValue = checked_malloc(sizeof(ParsedValue));
parsedValue->type = AST_ASSIGN;
parsedValue->data = assign;
return parsedValue;
return (ParsedValueReturn){no_err, parsedValue};
}
void free_parse_assign(void *ptr) {

View File

@@ -9,8 +9,8 @@ typedef struct {
ParsedValue * from;
} ParsedAssign;
ParsedValue *parse_assign(char*file, DArray *tokens,
ParsedValue *assign_to, size_t *index);
ParsedValueReturn parse_assign(char *file, DArray *tokens, ParsedValue *assign_to,
size_t *index);
void free_parse_assign(void*ptr);