diff options
author | Himbeer <himbeer@disroot.org> | 2025-05-08 14:45:47 +0200 |
---|---|---|
committer | Himbeer <himbeer@disroot.org> | 2025-05-08 14:45:47 +0200 |
commit | 973812e4720912e9e326eb494c9e506e642d7afe (patch) | |
tree | 4d14301bdcda57ecf4be2dbd966b25822b16fac2 | |
parent | 3242354f67a38ab680379ab702ddcc7d9d1c307f (diff) |
Add tokens for op-assignments and in/decrement
-rw-r--r-- | include/lex.h | 10 | ||||
-rw-r--r-- | src/lex.c | 51 |
2 files changed, 53 insertions, 8 deletions
diff --git a/include/lex.h b/include/lex.h index f556bf6..199ad74 100644 --- a/include/lex.h +++ b/include/lex.h @@ -50,30 +50,39 @@ enum lexical_token { // Operators T_ADD, + T_ADDASSIGN, T_AND, T_ASSIGN, T_BAND, + T_BANDASSIGN, T_BANG, T_BNOT, T_BOR, + T_BORASSIGN, T_BSHL, T_BSHR, T_BXOR, + T_BXORASSIGN, T_COLON, T_COMMA, + T_DECR, T_DIV, + T_DIVASSIGN, T_DOT, T_EQ, T_GE, T_GT, + T_INCR, T_LBRACE, T_LBRACKET, T_LE, T_LPAREN, T_LT, T_MINUS, + T_MODASSIGN, T_MODDELIM, T_MODULO, + T_MULASSIGN, T_NEQ, T_OR, T_QUESTION, @@ -82,6 +91,7 @@ enum lexical_token { T_RPAREN, T_SEMICOLON, T_STAR, + T_SUBASSIGN, T_UNDERSCORE, T_LAST_OPERATOR, @@ -289,11 +289,20 @@ lex_any(struct lexer *lexer, struct token *out) switch (c) { case '+': - out->token = T_ADD; + if ((ch = wgetc(lexer)) == '+') { + out->token = T_INCR; + } else if (ch == '=') { + out->token = T_ADDASSIGN; + } else { + unget(lexer); + out->token = T_ADD; + } break; case '&': - if (wgetc(lexer) == '&') { + if ((ch = wgetc(lexer)) == '&') { out->token = T_AND; + } else if (ch == '=') { + out->token = T_BANDASSIGN; } else { unget(lexer); out->token = T_BAND; @@ -310,8 +319,10 @@ lex_any(struct lexer *lexer, struct token *out) out->token = T_BNOT; break; case '|': - if (wgetc(lexer) == '|') { + if ((ch = wgetc(lexer)) == '|') { out->token = T_OR; + } else if (ch == '=') { + out->token = T_BORASSIGN; } else { unget(lexer); out->token = T_BOR; @@ -338,7 +349,12 @@ lex_any(struct lexer *lexer, struct token *out) } break; case '^': - out->token = T_BXOR; + if (wgetc(lexer) == '=') { + out->token = T_BXORASSIGN; + } else { + unget(lexer); + out->token = T_BXOR; + } break; case ':': if (wgetc(lexer) == ':') { @@ -352,8 +368,10 @@ lex_any(struct lexer *lexer, struct token *out) out->token = T_COMMA; break; case '/': - if (wgetc(lexer) == '/') { + if ((ch = wgetc(lexer)) == '/') { return lex_comment(lexer, out); + } else if (ch == '=') { + out->token = T_DIVASSIGN; } else { unget(lexer); out->token = T_DIV; @@ -380,10 +398,22 @@ lex_any(struct lexer *lexer, struct token *out) out->token = T_LPAREN; break; case '-': - out->token = T_MINUS; + if ((ch = wgetc(lexer)) == '-') { + out->token = T_DECR; + } else if (ch == '=') { + out->token = T_SUBASSIGN; + } else { + unget(lexer); + out->token = T_MINUS; + } break; case '%': - out->token = T_MODULO; + if (wgetc(lexer) == '=') { + out->token = T_MODASSIGN; + } else { + unget(lexer); + out->token = T_MODULO; + } break; case '?': out->token = T_QUESTION; @@ -401,7 +431,12 @@ lex_any(struct lexer *lexer, struct token *out) out->token = T_SEMICOLON; break; case '*': - out->token = T_STAR; + if (wgetc(lexer) == '=') { + out->token = T_MULASSIGN; + } else { + unget(lexer); + out->token = T_STAR; + } break; case '_': out->token = T_UNDERSCORE; |