about summary refs log tree commit diff stats
path: root/js/scripting-lang/baba-yaga-c/src/lexer.c
diff options
context:
space:
mode:
Diffstat (limited to 'js/scripting-lang/baba-yaga-c/src/lexer.c')
-rw-r--r--js/scripting-lang/baba-yaga-c/src/lexer.c27
1 files changed, 18 insertions, 9 deletions
diff --git a/js/scripting-lang/baba-yaga-c/src/lexer.c b/js/scripting-lang/baba-yaga-c/src/lexer.c
index a261da7..31a582f 100644
--- a/js/scripting-lang/baba-yaga-c/src/lexer.c
+++ b/js/scripting-lang/baba-yaga-c/src/lexer.c
@@ -72,7 +72,9 @@ typedef enum {
     TOKEN_FUNCTION_REF,  /* @function */
     TOKEN_IO_IN,         /* ..in */
     TOKEN_IO_OUT,        /* ..out */
-    TOKEN_IO_ASSERT      /* ..assert */
+    TOKEN_IO_ASSERT,     /* ..assert */
+    TOKEN_IO_EMIT,       /* ..emit */
+    TOKEN_IO_LISTEN      /* ..listen */
 } TokenType;
 
 /* ============================================================================
@@ -461,15 +463,10 @@ static Token lexer_read_identifier(Lexer* lexer) {
     
     /* Check if it's a keyword */
     if (strcmp(token.lexeme, "when") == 0) {
+
         token.type = TOKEN_KEYWORD_WHEN;
     } else if (strcmp(token.lexeme, "is") == 0) {
         token.type = TOKEN_KEYWORD_IS;
-    } else if (strcmp(token.lexeme, "and") == 0) {
-        token.type = TOKEN_KEYWORD_AND;
-    } else if (strcmp(token.lexeme, "or") == 0) {
-        token.type = TOKEN_KEYWORD_OR;
-    } else if (strcmp(token.lexeme, "xor") == 0) {
-        token.type = TOKEN_KEYWORD_XOR;
     } else if (strcmp(token.lexeme, "then") == 0) {
         token.type = TOKEN_KEYWORD_THEN;
     } else if (strcmp(token.lexeme, "not") == 0) {
@@ -585,6 +582,10 @@ static Token lexer_read_special(Lexer* lexer) {
             token.type = TOKEN_IO_OUT;
         } else if (strcmp(token.lexeme, "..assert") == 0) {
             token.type = TOKEN_IO_ASSERT;
+        } else if (strcmp(token.lexeme, "..emit") == 0) {
+            token.type = TOKEN_IO_EMIT;
+        } else if (strcmp(token.lexeme, "..listen") == 0) {
+            token.type = TOKEN_IO_LISTEN;
         } else {
             lexer_set_error(lexer, "Unknown IO operation");
             token.type = TOKEN_EOF;
@@ -683,8 +684,16 @@ static Token lexer_next_token(Lexer* lexer) {
         if (lexer_match(lexer, '>')) {
             return token_create(TOKEN_ARROW, "->", lexer->line, lexer->column - 2);
         }
-        /* For now, always treat minus as binary operator */
-        /* TODO: Implement proper unary vs binary minus detection */
+        
+        /* Check if this is a unary minus (followed by a digit, identifier, or parentheses) */
+        if ((lexer_peek(lexer) >= '0' && lexer_peek(lexer) <= '9') ||
+            (lexer_peek(lexer) >= 'a' && lexer_peek(lexer) <= 'z') ||
+            (lexer_peek(lexer) >= 'A' && lexer_peek(lexer) <= 'Z') ||
+            (lexer_peek(lexer) == '_') ||
+            (lexer_peek(lexer) == '(')) {
+            return token_create(TOKEN_OP_UNARY_MINUS, "-", lexer->line, lexer->column - 1);
+        }
+        /* Otherwise treat as binary minus */
         return token_create(TOKEN_OP_MINUS, "-", lexer->line, lexer->column - 1);
     case '+':
         lexer_advance(lexer);