aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHimbeer <himbeer@disroot.org>2024-09-12 10:52:23 +0200
committerHimbeer <himbeer@disroot.org>2024-09-12 12:34:18 +0200
commitd49e14428603a5561147db576ebdafe43b9a613f (patch)
tree598a0a30a752e80e4bd372cfd6fde234165338df /src
parent603fa8461131a51d33419c7dff4f300cde6821bd (diff)
Implement operator lexing
Diffstat (limited to 'src')
-rw-r--r--src/lex.c118
1 files changed, 118 insertions, 0 deletions
diff --git a/src/lex.c b/src/lex.c
index f67a213..37c536d 100644
--- a/src/lex.c
+++ b/src/lex.c
@@ -181,6 +181,124 @@ lex(struct lexer *lexer, struct token *out)
push(lexer, c);
return lex_ident(lexer, out);
}
+
+ uint32_t ch;
+
+ switch (c) {
+ case '+':
+ out->token = T_ADD;
+ break;
+ case '&':
+ if (wgetc(lexer) == '&') {
+ out->token = T_AND;
+ } else {
+ unget(lexer);
+ out->token = T_BAND;
+ }
+ break;
+ case '!':
+ if (wgetc(lexer) == '=') {
+ out->token = T_NEQ;
+ } else {
+ out->token = T_BANG;
+ }
+ break;
+ case '~':
+ out->token = T_BNOT;
+ break;
+ case '|':
+ if (wgetc(lexer) == '|') {
+ out->token = T_OR;
+ } else {
+ unget(lexer);
+ out->token = T_BOR;
+ }
+ break;
+ case '<':
+ if ((ch = wgetc(lexer)) == '<') {
+ out->token = T_BSHL;
+ } else if (ch == '=') {
+ out->token = T_LE;
+ } else {
+ unget(lexer);
+ out->token = T_LT;
+ }
+ break;
+ case '>':
+ if ((ch = wgetc(lexer)) == '>') {
+ out->token = T_BSHL;
+ } else if (ch == '=') {
+ out->token = T_GE;
+ } else {
+ unget(lexer);
+ out->token = T_GT;
+ }
+ break;
+ case '^':
+ out->token = T_BXOR;
+ break;
+ case ':':
+ if (wgetc(lexer) == ':') {
+ out->token = T_MODDELIM;
+ } else {
+ unget(lexer);
+ out->token = T_COLON;
+ }
+ break;
+ case ',':
+ out->token = T_COMMA;
+ break;
+ case '/':
+ out->token = T_DIV;
+ break;
+ case '.':
+ out->token = T_DOT;
+ break;
+ case '=':
+ if (wgetc(lexer) == '=') {
+ out->token = T_EQ;
+ } else {
+ unget(lexer);
+ out->token = T_ASSIGN;
+ }
+ break;
+ case '{':
+ out->token = T_LBRACE;
+ break;
+ case '[':
+ out->token = T_LBRACKET;
+ break;
+ case '(':
+ out->token = T_LPAREN;
+ break;
+ case '-':
+ out->token = T_MINUS;
+ break;
+ case '%':
+ out->token = T_MODULO;
+ break;
+ case '?':
+ out->token = T_QUESTION;
+ break;
+ case '}':
+ out->token = T_RBRACE;
+ break;
+ case ']':
+ out->token = T_RBRACKET;
+ break;
+ case ')':
+ out->token = T_RPAREN;
+ break;
+ case ';':
+ out->token = T_SEMICOLON;
+ break;
+ case '*':
+ out->token = T_STAR;
+ break;
+ case '_':
+ out->token = T_UNDERSCORE;
+ break;
+ }
}
void unlex(struct lexer *lexer, const struct token *in)