From 433cc3620a265b37dd172e822bc815525de82ed2 Mon Sep 17 00:00:00 2001 From: Kyler Date: Fri, 28 Nov 2025 23:50:37 -0700 Subject: [PATCH] Division works --- SLS_C/src/builtin.c | 103 +++++++++++++++++++++++++++++++++++++- SLS_C/src/lexer.c | 2 +- SLS_C/tests/extra_tests.c | 26 +++++++++- 3 files changed, 126 insertions(+), 5 deletions(-) diff --git a/SLS_C/src/builtin.c b/SLS_C/src/builtin.c index 0cd682c..f990884 100644 --- a/SLS_C/src/builtin.c +++ b/SLS_C/src/builtin.c @@ -661,8 +661,107 @@ Boolean builtin_multiplication(InterpreterState *interpreter_state) { } Boolean builtin_division(InterpreterState *interpreter_state) { - (void)interpreter_state; - return FALSE; + double a, b; + if (interpreter_state->stack == NULL) return FALSE; + if (interpreter_state->stack->next == NULL) return FALSE; + + switch (interpreter_state->stack->type) { + case STACK_IDENTIFIER: + return FALSE; + case STACK_I64: + a = interpreter_state->stack->i64; + break; + case STACK_I32: + a = interpreter_state->stack->i32; + break; + case STACK_I16: + a = interpreter_state->stack->i16; + break; + case STACK_I8: + a = interpreter_state->stack->i8; + break; + case STACK_U64: + a = interpreter_state->stack->u64; + break; + case STACK_U32: + a = interpreter_state->stack->u32; + break; + case STACK_U16: + a = interpreter_state->stack->u16; + break; + case STACK_U8: + a = interpreter_state->stack->u8; + break; + case STACK_FLOAT: + a = interpreter_state->stack->f32; + break; + case STACK_DOUBLE: + a = interpreter_state->stack->f64; + break; + case STACK_CHARACTER: + a = interpreter_state->stack->character; + break; + case STACK_BOOLEAN: + a = interpreter_state->stack->boolean; + break; + case STACK_TOKEN_STRING: + return FALSE; + } + + switch (interpreter_state->stack->next->type) { + case STACK_IDENTIFIER: + return FALSE; + case STACK_I64: + b = interpreter_state->stack->next->i64; + break; + case STACK_I32: + b = interpreter_state->stack->next->i32; + break; + case STACK_I16: + b = interpreter_state->stack->next->i16; + break; + case STACK_I8: + b = interpreter_state->stack->next->i8; + break; + case STACK_U64: + b = interpreter_state->stack->next->u64; + break; + case STACK_U32: + b = interpreter_state->stack->next->u32; + break; + case STACK_U16: + b = interpreter_state->stack->next->u16; + break; + case STACK_U8: + b = interpreter_state->stack->next->u8; + break; + case STACK_FLOAT: + b = interpreter_state->stack->next->f32; + break; + case STACK_DOUBLE: + b = interpreter_state->stack->next->f64; + break; + case STACK_CHARACTER: + b = interpreter_state->stack->next->character; + break; + case STACK_BOOLEAN: + b = interpreter_state->stack->next->boolean; + break; + case STACK_TOKEN_STRING: + return FALSE; + } + + if (a == 0) return FALSE; + + StackItem *node = interpreter_state->stack; + interpreter_state->stack = interpreter_state->stack->next->next; + node->next->next = NULL; + clean_stack(node); + + return push_token(interpreter_state, (Token){ + .type = TOKEN_DOUBLE, + .double_literal = (b/a), + }); } Boolean builtin_modulus(InterpreterState *interpreter_state) { diff --git a/SLS_C/src/lexer.c b/SLS_C/src/lexer.c index a2f95d5..fdf5999 100644 --- a/SLS_C/src/lexer.c +++ b/SLS_C/src/lexer.c @@ -653,7 +653,7 @@ static LexerResult parse_string_literal(LexerInfo *lexer_info, char c, size_t st } static void skip_comments_and_whitespace(LexerInfo *lexer_info) { - while (isspace(peek(lexer_info)) || peek(lexer_info) == '/' || peek(lexer_info) == '#') { + while (isspace(peek(lexer_info)) || (peek(lexer_info) == '/' && far_peek(lexer_info, 1) == '/') || peek(lexer_info) == '#') { // Skip Comments if ((peek(lexer_info) == '/' && far_peek(lexer_info, 1) == '/') || peek(lexer_info) == '#') while (!(peek(lexer_info) == '\n' || peek(lexer_info) == '\0')) diff --git a/SLS_C/tests/extra_tests.c b/SLS_C/tests/extra_tests.c index 8172ec7..d14eca5 100644 --- a/SLS_C/tests/extra_tests.c +++ b/SLS_C/tests/extra_tests.c @@ -11,9 +11,30 @@ #include "sls/string.h" #include "sls/lexer.h" #include "sls/errors.h" +#include "tests/lexer_test_helpers.h" #include "tests/tests.h" -static const size_t NUM_EXTRA_TESTS = 0; +static const size_t NUM_EXTRA_TESTS = 2; + +static TestResult test_Identifier_Addition() { + LexerTest test = start_up_test(SLS_STR("Identifier Addition"), SLS_STR("+")); + LexerResult result = lexical_analysis(&test.lexer_info); + if (result.type == SLS_ERROR) return error_fail_test(&test, result, result.error); + size_t i = 0; + if (test_identifier_value(&test, result, i++, &(TestIdentifierValue){FALSE, SLS_STR("+")})) return test.result; + if (test_eof_value(&test, result, i++, 0)) return test.result; + return pass_test(&test, result); +} + +static TestResult test_Identifier_Division() { + LexerTest test = start_up_test(SLS_STR("Identifier Division"), SLS_STR("/")); + LexerResult result = lexical_analysis(&test.lexer_info); + if (result.type == SLS_ERROR) return error_fail_test(&test, result, result.error); + size_t i = 0; + if (test_identifier_value(&test, result, i++, &(TestIdentifierValue){FALSE, SLS_STR("/")})) return test.result; + if (test_eof_value(&test, result, i++, 0)) return test.result; + return pass_test(&test, result); +} // Run all extra tests TestsReport run_extra_tests() @@ -25,6 +46,7 @@ TestsReport run_extra_tests() size_t i = 0; (void)i; - // report.tests[i++] = test_malloc_and_copy(); + report.tests[i++] = test_Identifier_Addition(); + report.tests[i++] = test_Identifier_Division(); return report; }