add return

This commit is contained in:
2025-07-14 05:33:57 +01:00
parent 1bdc792705
commit f1e8ad1ac2
9 changed files with 114 additions and 5 deletions

View File

@@ -0,0 +1,49 @@
/*
* SPDX-FileCopyrightText: 2025 William Bell
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
#include "return.h"
#include "../../lexer/token.h"
#include "../../memory.h"
#include "../literals/literals.h"
ParsedValueReturn parse_return(char *file, DArray *tokens, size_t *index) {
(*index)++;
ParsedValue *parsedValue = checked_malloc(sizeof(ParsedValue));
ParsedReturn *parsedReturn = checked_malloc(sizeof(ParsedReturn));
parsedValue->type = AST_RETURN;
parsedValue->data = parsedReturn;
parsedReturn->value = parse_null();
if (*index >= tokens->size)
return (ParsedValueReturn){no_err, parsedValue};
Token *token = darray_get(tokens, *index);
if (token->type == TOKEN_NEW_LINE)
return (ParsedValueReturn){no_err, parsedValue};
ParsedValueReturn value = parse_token(file, tokens, index, true);
if (value.err.exists) {
free_parsed(parsedValue);
free(parsedValue);
return value;
}
if (!value.value) {
free_parsed(parsedValue);
free(parsedValue);
return (ParsedValueReturn){create_err(token->line, token->column,
token->length, file, "Syntax Error",
"expected value"),
NULL};
}
free_parsed(parsedReturn->value);
free(parsedReturn->value);
parsedReturn->value = value.value;
return (ParsedValueReturn){no_err, parsedValue};
}
void free_parsed_return(void *ptr) {
ParsedValue *parsedValue = ptr;
DArray *parsed_return = parsedValue->data;
free_parsed(parsed_return);
free(parsed_return);
}

View File

@@ -0,0 +1,20 @@
/*
* SPDX-FileCopyrightText: 2025 William Bell
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
#ifndef RETURN_H
#define RETURN_H
#include "../parser.h"
typedef struct {
ParsedValue * value;
} ParsedReturn;
ParsedValueReturn parse_return(char *file, DArray *tokens, size_t *index);
void free_parsed_return(void *ptr);
#endif // RETURN_H