diff options
author | Himbeer <himbeer@disroot.org> | 2024-09-12 10:52:23 +0200 |
---|---|---|
committer | Himbeer <himbeer@disroot.org> | 2024-09-12 12:34:18 +0200 |
commit | d49e14428603a5561147db576ebdafe43b9a613f (patch) | |
tree | 598a0a30a752e80e4bd372cfd6fde234165338df /src | |
parent | 603fa8461131a51d33419c7dff4f300cde6821bd (diff) |
Implement operator lexing
Diffstat (limited to 'src')
-rw-r--r-- | src/lex.c | 118 |
1 files changed, 118 insertions, 0 deletions
@@ -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) |