diff options
Diffstat (limited to 'js/scripting-lang/baba-yaga-c/src/lexer.c')
-rw-r--r-- | js/scripting-lang/baba-yaga-c/src/lexer.c | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/js/scripting-lang/baba-yaga-c/src/lexer.c b/js/scripting-lang/baba-yaga-c/src/lexer.c index ab00233..31a582f 100644 --- a/js/scripting-lang/baba-yaga-c/src/lexer.c +++ b/js/scripting-lang/baba-yaga-c/src/lexer.c @@ -73,9 +73,8 @@ typedef enum { TOKEN_IO_IN, /* ..in */ TOKEN_IO_OUT, /* ..out */ TOKEN_IO_ASSERT, /* ..assert */ - - /* Comments */ - TOKEN_COMMENT + TOKEN_IO_EMIT, /* ..emit */ + TOKEN_IO_LISTEN /* ..listen */ } TokenType; /* ============================================================================ @@ -464,6 +463,7 @@ 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; @@ -582,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; @@ -680,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); |