From 8ea69cce679e6d5996f7697242bb3cf55af96979 Mon Sep 17 00:00:00 2001 From: William Bell Date: Mon, 14 Jul 2025 22:22:26 +0100 Subject: [PATCH] return err in translator --- app.py | 1 + src/err.c | 9 +++++++-- src/main.c | 11 ++++++++--- src/parser/return/return.c | 6 +++++- src/parser/return/return.h | 3 +++ src/translator/declaration/declaration.c | 6 ++++-- src/translator/declaration/declaration.h | 3 ++- src/translator/dowrap/dowrap.c | 8 +++----- src/translator/dowrap/dowrap.h | 2 +- src/translator/function/function.c | 4 ++-- src/translator/function/function.h | 2 +- src/translator/if/if.c | 10 +++++----- src/translator/if/if.h | 2 +- src/translator/return/return.c | 9 ++++++--- src/translator/return/return.h | 3 ++- src/translator/translator.c | 24 +++++++++++++++--------- src/translator/translator.h | 7 ++++--- testing.ar | 3 ++- 18 files changed, 72 insertions(+), 41 deletions(-) create mode 100644 app.py diff --git a/app.py b/app.py new file mode 100644 index 0000000..838d20b --- /dev/null +++ b/app.py @@ -0,0 +1 @@ +return "hello world" \ No newline at end of file diff --git a/src/err.c b/src/err.c index 94f5dca..c6ae73e 100644 --- a/src/err.c +++ b/src/err.c @@ -140,7 +140,12 @@ void output_err(ArErr err) { fprintf(stderr, " "); } fprintf(stderr, "|\n"); - + for (size_t i = 0;iconstants, constantsSize); @@ -284,7 +284,7 @@ Execution execute(char *path, Stack *stack) { Translated translated; if (load_cache(&translated, cache_file_path, hash) != 0) { - translated = init_translator(); + translated = init_translator(path); DArray tokens; darray_init(&tokens, sizeof(Token)); @@ -322,7 +322,12 @@ Execution execute(char *path, Stack *stack) { darray_free(&tokens, free_token); start = clock(); - translate(&translated, &ast); + err = translate(&translated, &ast); + if (err.exists) { + free_translator(&translated); + darray_free(&ast, free_parsed); + return (Execution){err, (Stack){NULL, NULL}}; + } end = clock(); time_spent = (double)(end - start) / CLOCKS_PER_SEC; total_time_spent += time_spent; diff --git a/src/parser/return/return.c b/src/parser/return/return.c index 3603116..97b801d 100644 --- a/src/parser/return/return.c +++ b/src/parser/return/return.c @@ -10,15 +10,19 @@ #include "../literals/literals.h" ParsedValueReturn parse_return(char *file, DArray *tokens, size_t *index) { + Token *token = darray_get(tokens, *index); (*index)++; ParsedValue *parsedValue = checked_malloc(sizeof(ParsedValue)); ParsedReturn *parsedReturn = checked_malloc(sizeof(ParsedReturn)); parsedValue->type = AST_RETURN; parsedValue->data = parsedReturn; + parsedReturn->line = token->line; + parsedReturn->column = token->column; + parsedReturn->length = token->length; parsedReturn->value = parse_null(); if (*index >= tokens->size) return (ParsedValueReturn){no_err, parsedValue}; - Token *token = darray_get(tokens, *index); + token = darray_get(tokens, *index); if (token->type == TOKEN_NEW_LINE) return (ParsedValueReturn){no_err, parsedValue}; ParsedValueReturn value = parse_token(file, tokens, index, true); diff --git a/src/parser/return/return.h b/src/parser/return/return.h index 05fb5ee..05aad65 100644 --- a/src/parser/return/return.h +++ b/src/parser/return/return.h @@ -11,6 +11,9 @@ typedef struct { ParsedValue * value; + int64_t line; + int64_t column; + int64_t length; } ParsedReturn; ParsedValueReturn parse_return(char *file, DArray *tokens, size_t *index); diff --git a/src/translator/declaration/declaration.c b/src/translator/declaration/declaration.c index e1e8f6d..daf5fd1 100644 --- a/src/translator/declaration/declaration.c +++ b/src/translator/declaration/declaration.c @@ -11,15 +11,17 @@ #include #include #include + size_t translate_parsed_declaration(Translated *translated, - DArray delcarations) { + DArray delcarations, ArErr *err) { set_registers(translated, 1); size_t first = 0; for (size_t i = 0; i < delcarations.size; i++) { DArray* old_return_jumps = translated->return_jumps; translated->return_jumps = NULL; ParsedSingleDeclaration *singleDeclaration = darray_get(&delcarations, i); - size_t temp = translate_parsed(translated, singleDeclaration->from); + size_t temp = translate_parsed(translated, singleDeclaration->from, err); + if (err->exists) return first; if (i == 0) first = temp; size_t length = strlen(singleDeclaration->name); diff --git a/src/translator/declaration/declaration.h b/src/translator/declaration/declaration.h index 4d1aa76..3cff0e3 100644 --- a/src/translator/declaration/declaration.h +++ b/src/translator/declaration/declaration.h @@ -8,6 +8,7 @@ #define BYTECODE_DECLARATION_H #include "../translator.h" -size_t translate_parsed_declaration(Translated *translated, DArray delcarations); +size_t translate_parsed_declaration(Translated *translated, + DArray delcarations, ArErr *err); #endif \ No newline at end of file diff --git a/src/translator/dowrap/dowrap.c b/src/translator/dowrap/dowrap.c index 0a5f8f4..f2105d2 100644 --- a/src/translator/dowrap/dowrap.c +++ b/src/translator/dowrap/dowrap.c @@ -8,7 +8,7 @@ #include "dowrap.h" #include -size_t translate_parsed_dowrap(Translated *translated, DArray *parsedDowrap) { +size_t translate_parsed_dowrap(Translated *translated, DArray *parsedDowrap, ArErr *err) { set_registers(translated, 1); size_t first = translated->bytecode.size; @@ -19,10 +19,8 @@ size_t translate_parsed_dowrap(Translated *translated, DArray *parsedDowrap) { darray_init(&return_jumps, sizeof(size_t)); DArray *old_return_jumps = translated->return_jumps; translated->return_jumps = &return_jumps; - for (size_t i = 0; i < parsedDowrap->size; i++) { - ParsedValue *parsedValue = darray_get(parsedDowrap, i); - translate_parsed(translated, parsedValue); - } + *err = translate(translated, parsedDowrap); + if (err->exists) return first; push_instruction_byte(translated, OP_LOAD_NULL); push_instruction_byte(translated, 0); if (!old_return_jumps) { diff --git a/src/translator/dowrap/dowrap.h b/src/translator/dowrap/dowrap.h index 2e80ff1..168677c 100644 --- a/src/translator/dowrap/dowrap.h +++ b/src/translator/dowrap/dowrap.h @@ -9,6 +9,6 @@ #include "../translator.h" -size_t translate_parsed_dowrap(Translated *translated, DArray *parsedDowrap); +size_t translate_parsed_dowrap(Translated *translated, DArray *parsedDowrap, ArErr *err); #endif // TRANSLATE_DO_WRAP_H \ No newline at end of file diff --git a/src/translator/function/function.c b/src/translator/function/function.c index ba59a47..4b3e5c3 100644 --- a/src/translator/function/function.c +++ b/src/translator/function/function.c @@ -12,13 +12,13 @@ #include #include size_t translate_parsed_function(Translated *translated, - ParsedFunction *parsedFunction) { + ParsedFunction *parsedFunction, ArErr *err) { DArray main_bytecode = translated->bytecode; DArray _temp_bytecode; darray_init(&_temp_bytecode, sizeof(uint8_t)); set_registers(translated, 1); translated->bytecode = _temp_bytecode; - translate_parsed(translated, parsedFunction->body); + translate_parsed(translated, parsedFunction->body, err); size_t function_bytecode_offset = arena_push(&translated->constants, translated->bytecode.data, translated->bytecode.size*translated->bytecode.element_size); diff --git a/src/translator/function/function.h b/src/translator/function/function.h index 34bef52..0a9bfc7 100644 --- a/src/translator/function/function.h +++ b/src/translator/function/function.h @@ -10,6 +10,6 @@ #include "../translator.h" size_t translate_parsed_function(Translated *translated, - ParsedFunction *parsedFunction); + ParsedFunction *parsedFunction, ArErr *err); #endif \ No newline at end of file diff --git a/src/translator/if/if.c b/src/translator/if/if.c index 31c8295..cd3559b 100644 --- a/src/translator/if/if.c +++ b/src/translator/if/if.c @@ -5,12 +5,12 @@ */ #include "../../parser/if/if.h" -#include "../translator.h" +#include "if.h" #include #include #include -size_t translate_parsed_if(Translated *translated, DArray *parsedIf) { +size_t translate_parsed_if(Translated *translated, DArray *parsedIf, ArErr * err) { size_t *jump_after_body_positions = checked_malloc(parsedIf->size * sizeof(size_t)); @@ -22,13 +22,13 @@ size_t translate_parsed_if(Translated *translated, DArray *parsedIf) { ParsedConditional *condition = darray_get(parsedIf, i); push_instruction_byte(translated, OP_NEW_SCOPE); if (condition->condition) { - translate_parsed(translated, condition->condition); + translate_parsed(translated, condition->condition, err); push_instruction_byte(translated, OP_BOOL); push_instruction_byte(translated, 0); push_instruction_byte(translated, OP_JUMP_IF_FALSE); push_instruction_byte(translated, 0); uint64_t last_jump_index = push_instruction_code(translated, 0); - translate_parsed(translated, condition->content); + translate_parsed(translated, condition->content, err); push_instruction_byte(translated, OP_POP_SCOPE); push_instruction_byte(translated, OP_JUMP); jump_after_body_positions[i] = push_instruction_code(translated, 0); @@ -36,7 +36,7 @@ size_t translate_parsed_if(Translated *translated, DArray *parsedIf) { translated->bytecode.size); push_instruction_byte(translated, OP_POP_SCOPE); } else { - translate_parsed(translated, condition->content); + translate_parsed(translated, condition->content, err); push_instruction_byte(translated, OP_POP_SCOPE); push_instruction_byte(translated, OP_JUMP); jump_after_body_positions[i] = push_instruction_code(translated, 0); diff --git a/src/translator/if/if.h b/src/translator/if/if.h index 7fc2cb3..bf8aab9 100644 --- a/src/translator/if/if.h +++ b/src/translator/if/if.h @@ -8,6 +8,6 @@ #define TRANSLATE_iF_H #include "../translator.h" -size_t translate_parsed_if(Translated *translated, DArray *parsedIf); +size_t translate_parsed_if(Translated *translated, DArray *parsedIf, ArErr * err); #endif // TRANSLATE_iF_H \ No newline at end of file diff --git a/src/translator/return/return.c b/src/translator/return/return.c index 2ae2f76..92c9deb 100644 --- a/src/translator/return/return.c +++ b/src/translator/return/return.c @@ -7,9 +7,12 @@ #include "return.h" size_t translate_parsed_return(Translated *translated, - ParsedReturn *parsedReturn) { - - size_t first = translate_parsed(translated, parsedReturn->value); + ParsedReturn *parsedReturn, ArErr * err) { + if (!translated->return_jumps) { + *err = create_err(parsedReturn->line, parsedReturn->column, parsedReturn->length, translated->path, "Syntax Error", "nowhere to return to"); + return 0; + } + size_t first = translate_parsed(translated, parsedReturn->value, err); push_instruction_byte(translated, OP_JUMP); size_t return_up = push_instruction_code(translated, 0); darray_push(translated->return_jumps, &return_up); diff --git a/src/translator/return/return.h b/src/translator/return/return.h index 4861717..71abe7e 100644 --- a/src/translator/return/return.h +++ b/src/translator/return/return.h @@ -10,6 +10,7 @@ #include "../../parser/return/return.h" -size_t translate_parsed_return(Translated *translated, ParsedReturn *parsedReturn); +size_t translate_parsed_return(Translated *translated, + ParsedReturn *parsedReturn, ArErr * err); #endif // TRANSLATE_RETURN_H \ No newline at end of file diff --git a/src/translator/translator.c b/src/translator/translator.c index 1ec346f..d1a08a0 100644 --- a/src/translator/translator.c +++ b/src/translator/translator.c @@ -85,8 +85,9 @@ size_t arena_push(ConstantArena *arena, const void *data, size_t length) { return offset; } -Translated init_translator() { +Translated init_translator(char* path) { Translated translated; + translated.path = path; translated.registerCount = 1; translated.return_jumps=NULL; darray_init(&translated.bytecode, sizeof(uint8_t)); @@ -124,14 +125,14 @@ void set_registers(Translated *translator, uint8_t count) { translator->registerCount = count; } -size_t translate_parsed(Translated *translated, ParsedValue *parsedValue) { +size_t translate_parsed(Translated *translated, ParsedValue *parsedValue, ArErr*err) { switch (parsedValue->type) { case AST_STRING: return translate_parsed_string(translated, *((ParsedString *)parsedValue->data)); case AST_DECLARATION: return translate_parsed_declaration(translated, - *((DArray *)parsedValue->data)); + *((DArray *)parsedValue->data), err); case AST_NUMBER: return translate_parsed_number(translated, (char *)parsedValue->data, 0); case AST_NULL: @@ -141,25 +142,30 @@ size_t translate_parsed(Translated *translated, ParsedValue *parsedValue) { return output; case AST_FUNCTION: return translate_parsed_function(translated, - (ParsedFunction *)parsedValue->data); + (ParsedFunction *)parsedValue->data, err); case AST_IDENTIFIER: return translate_parsed_identifier(translated, (ParsedIdentifier *)parsedValue->data); case AST_IF: - return translate_parsed_if(translated, (DArray *)parsedValue->data); + return translate_parsed_if(translated, (DArray *)parsedValue->data, err); case AST_DOWRAP: - return translate_parsed_dowrap(translated, (DArray *)parsedValue->data); + return translate_parsed_dowrap(translated, (DArray *)parsedValue->data, err); case AST_RETURN: - return translate_parsed_return(translated, (ParsedReturn *)parsedValue->data); + return translate_parsed_return(translated, (ParsedReturn *)parsedValue->data, err); } return 0; } -void translate(Translated *translated, DArray *ast) { +ArErr translate(Translated *translated, DArray *ast) { + ArErr err = no_err; for (size_t i = 0; i < ast->size; i++) { ParsedValue *parsedValue = darray_get(ast, i); - translate_parsed(translated, parsedValue); + translate_parsed(translated, parsedValue, &err); + if (err.exists) { + break; + } } + return err; } void free_translator(Translated *translated) { diff --git a/src/translator/translator.h b/src/translator/translator.h index 7ea2aee..b664fa8 100644 --- a/src/translator/translator.h +++ b/src/translator/translator.h @@ -30,6 +30,7 @@ typedef struct { DArray bytecode; DArray source_locations; ConstantArena constants; + char* path; } Translated; typedef struct { @@ -54,11 +55,11 @@ void set_instruction_code(Translated *translator, size_t index, uint64_t code); void set_registers(Translated *translator, uint8_t count); -Translated init_translator(); +Translated init_translator(char* path); -size_t translate_parsed(Translated *translated, ParsedValue *parsedValue); +size_t translate_parsed(Translated *translated, ParsedValue *parsedValue, ArErr*err); -void translate(Translated *translated, DArray *ast); +ArErr translate(Translated *translated, DArray *ast); void free_translator(Translated *translated); diff --git a/testing.ar b/testing.ar index 45011fa..387e769 100644 --- a/testing.ar +++ b/testing.ar @@ -1,10 +1,11 @@ # SPDX-FileCopyrightText: 2025 William Bell # SPDX-License-Identifier: GPL-3.0-or-later + let y = 1 let x = do do return y x -return y \ No newline at end of file +let z = x \ No newline at end of file