diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lex.c | 51 |
1 files changed, 43 insertions, 8 deletions
@@ -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; |