]> www.git.momoyon.org Git - lang.git/commitdiff
Can parse <<, <=, < and >>, >=, >
authorahmedsamyh <ahmedsamyh10@gmail.com>
Mon, 3 Mar 2025 13:03:54 +0000 (18:03 +0500)
committerahmedsamyh <ahmedsamyh10@gmail.com>
Mon, 3 Mar 2025 13:03:54 +0000 (18:03 +0500)
main.c
test.py
tests/.operators.build.out.expected
tests/operators.momo

diff --git a/main.c b/main.c
index c79bd7e87d8dcec02eccee67641948a1796e14d5..274b76d7f4c7a3b60ba754955365403cb26be156 100644 (file)
--- 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 39cc977d4a25c9c14dcb5e2ae1ec6757dfb1d4e6..e7f4250bd4e13724de8b6e6703ef2fd24143241a 100755 (executable)
--- 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
index 37c4a50c4e3db4b22e18afc27dcddb0c1aa9d800..7a0e1597d0de224ce6f5efe3e18a645fac820051 100644 (file)
@@ -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
index 1d999f9835459e49e2046e182933cac4bccbf456..80016f6ac4548d68620b54ab7b766cde018c9252 100644 (file)
@@ -16,6 +16,8 @@
 &=
 ^
 ^=
+<<
+>>
 ~
 |
 |=
@@ -27,3 +29,8 @@
 
 =
 ==
+
+<
+>
+<=
+>=