aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/lex.c51
1 files changed, 43 insertions, 8 deletions
diff --git a/src/lex.c b/src/lex.c
index d6ab2f0..97746e2 100644
--- a/src/lex.c
+++ b/src/lex.c
@@ -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;