From 08654ad35504b2e6fcbb2b37d944ccd99e008867 Mon Sep 17 00:00:00 2001 From: ahmedsamyh Date: Mon, 3 Mar 2025 18:03:54 +0500 Subject: [PATCH] Can parse <<, <=, < and >>, >=, > --- main.c | 34 +++++++++++++++++++++++++++++ test.py | 13 +++++++++++ tests/.operators.build.out.expected | 24 ++++++++++++-------- tests/operators.momo | 7 ++++++ 4 files changed, 69 insertions(+), 9 deletions(-) diff --git a/main.c b/main.c index c79bd7e..274b76d 100644 --- a/main.c +++ b/main.c @@ -103,6 +103,8 @@ typedef enum { TK_BITWISE_OR_EQUAL, TK_BITWISE_XOR, TK_BITWISE_XOR_EQUAL, + TK_BITWISE_SHIFT_LEFT, + TK_BITWISE_SHIFT_RIGHT, TK_LOGICAL_AND, TK_LOGICAL_OR, @@ -158,6 +160,8 @@ const char *token_type_as_str(Token_type t) { case TK_BITWISE_OR_EQUAL: return "BITWISE_OR_EQUAL"; case TK_BITWISE_XOR: return "BITWISE_XOR"; case TK_BITWISE_XOR_EQUAL: return "BITWISE_XOR_EQUAL"; + case TK_BITWISE_SHIFT_LEFT: return "BITWISE_SHIFT_LEFT"; + case TK_BITWISE_SHIFT_RIGHT: return "BITWISE_SHIFT_RIGHT"; case TK_LOGICAL_AND: return "LOGICAL_AND"; case TK_LOGICAL_OR: return "LOGICAL_OR"; case TK_COUNT: @@ -707,6 +711,36 @@ bool next_token(Lexer *l, Token *t_out) { LEX_N_CHAR_TOKEN(TK_EQUAL, 1); } break; + case '<': { + // < could be << or <= + char next = next_char(l); + + switch (next) { + case '<': { + LEX_N_CHAR_TOKEN(TK_BITWISE_SHIFT_LEFT, 2); + } break; + case '=': { + LEX_N_CHAR_TOKEN(TK_LTE, 2); + } break; + } + + LEX_N_CHAR_TOKEN(TK_LT, 1); + } break; + case '>': { + // > could be >> or >= + char next = next_char(l); + + switch (next) { + case '>': { + LEX_N_CHAR_TOKEN(TK_BITWISE_SHIFT_RIGHT, 2); + } break; + case '=': { + LEX_N_CHAR_TOKEN(TK_GTE, 2); + } break; + } + + LEX_N_CHAR_TOKEN(TK_GT, 1); + } break; // NOTE: Sanity check case ' ': { consume_char(l); diff --git a/test.py b/test.py index 39cc977..e7f4250 100755 --- a/test.py +++ b/test.py @@ -8,6 +8,9 @@ COMPILER="/home/momoyon/Programming/python/lang/lang" TESTS_DIR="./tests/" SUFFIX=".momo" + +# TODO: Use Colored logging + class Test: expected_stdout = '' expected_stderr = '' @@ -181,6 +184,16 @@ def main(): if stop_on_error: exit(1) else: continue else: + if res.stdout != test.build_expected_stdout: + print('[FAILED]', file=sys.stderr) + print(f"build_Expected: >>>{test.build_expected_stdout}>>>") + print(f"But Got: >>>{res.stdout}>>>") + if stop_on_error: exit(1) + if res.stderr != test.build_expected_stderr: + print('[FAILED]', file=sys.stderr) + print(f"build_Expected: >>>{test.build_expected_stderr}>>>") + print(f"But Got: >>>{res.stderr}>>>") + if stop_on_error: exit(1) passing_tests_count += 1 print("[PASS] ", end='') o = False diff --git a/tests/.operators.build.out.expected b/tests/.operators.build.out.expected index 37c4a50..7a0e159 100644 --- a/tests/.operators.build.out.expected +++ b/tests/.operators.build.out.expected @@ -15,13 +15,19 @@ operators.momo:15:0 [BITWISE_AND] '&' operators.momo:16:0 [BITWISE_AND_EQUAL] '&=' operators.momo:17:0 [BITWISE_XOR] '^' operators.momo:18:0 [BITWISE_XOR_EQUAL] '^=' -operators.momo:19:0 [BITWISE_NOT] '~' -operators.momo:20:0 [BITWISE_OR] '|' -operators.momo:21:0 [BITWISE_OR_EQUAL] '|=' -operators.momo:23:0 [NOT] '!' -operators.momo:24:0 [NOT_EQUAL] '!=' -operators.momo:25:0 [LOGICAL_AND] '&&' -operators.momo:26:0 [LOGICAL_OR] '||' -operators.momo:28:0 [EQUAL] '=' -operators.momo:29:0 [EQUAL_EQUAL] '==' +operators.momo:19:0 [BITWISE_SHIFT_LEFT] '<<' +operators.momo:20:0 [BITWISE_SHIFT_RIGHT] '>>' +operators.momo:21:0 [BITWISE_NOT] '~' +operators.momo:22:0 [BITWISE_OR] '|' +operators.momo:23:0 [BITWISE_OR_EQUAL] '|=' +operators.momo:25:0 [NOT] '!' +operators.momo:26:0 [NOT_EQUAL] '!=' +operators.momo:27:0 [LOGICAL_AND] '&&' +operators.momo:28:0 [LOGICAL_OR] '||' +operators.momo:30:0 [EQUAL] '=' +operators.momo:31:0 [EQUAL_EQUAL] '==' +operators.momo:33:0 [LT] '<' +operators.momo:34:0 [GT] '>' +operators.momo:35:0 [LTE] '<=' +operators.momo:36:0 [GTE] '>=' [INFO] OK diff --git a/tests/operators.momo b/tests/operators.momo index 1d999f9..80016f6 100644 --- a/tests/operators.momo +++ b/tests/operators.momo @@ -16,6 +16,8 @@ &= ^ ^= +<< +>> ~ | |= @@ -27,3 +29,8 @@ = == + +< +> +<= +>= -- 2.39.5