aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHimbeer <himbeer@disroot.org>2025-05-08 14:45:47 +0200
committerHimbeer <himbeer@disroot.org>2025-05-08 14:45:47 +0200
commit973812e4720912e9e326eb494c9e506e642d7afe (patch)
tree4d14301bdcda57ecf4be2dbd966b25822b16fac2
parent3242354f67a38ab680379ab702ddcc7d9d1c307f (diff)
Add tokens for op-assignments and in/decrement
-rw-r--r--include/lex.h10
-rw-r--r--src/lex.c51
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,
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;