Division works
This commit is contained in:
parent
2ddb0ca4d6
commit
433cc3620a
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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'))
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue