diff options
| author | Mustafa Quraish <[email protected]> | 2022-01-30 02:20:58 -0500 |
|---|---|---|
| committer | Mustafa Quraish <[email protected]> | 2022-01-30 18:04:13 -0500 |
| commit | b08bb0a17ed05e7febaee5c71f5cf1ff3447dea1 (patch) | |
| tree | d10d6f869509b7c9d4650f4aa18850fdaec97904 /src/lexer.c | |
| parent | Update build system to use Makefile (diff) | |
| download | cup-b08bb0a17ed05e7febaee5c71f5cf1ff3447dea1.tar.xz cup-b08bb0a17ed05e7febaee5c71f5cf1ff3447dea1.zip | |
Put tokens in their own macro to allow looping over them
Diffstat (limited to 'src/lexer.c')
| -rw-r--r-- | src/lexer.c | 19 |
1 files changed, 5 insertions, 14 deletions
diff --git a/src/lexer.c b/src/lexer.c index ea095ba..699e960 100644 --- a/src/lexer.c +++ b/src/lexer.c @@ -79,9 +79,6 @@ static Token Lexer_make_token(Lexer *lexer, TokenType type, int inc_amount) return token; } -#define LEX_KEYWORD(str, token_type) \ - if (Lexer_starts_with(lexer, str)) return Lexer_make_token(lexer, token_type, strlen(str)); - Token Lexer_next(Lexer *lexer) { while (lexer->pos < lexer->len) { @@ -98,6 +95,8 @@ Token Lexer_next(Lexer *lexer) case '~': return Lexer_make_token(lexer, TOKEN_TILDE, 1); case '?': return Lexer_make_token(lexer, TOKEN_QUESTION, 1); case ',': return Lexer_make_token(lexer, TOKEN_COMMA, 1); + case '*': return Lexer_make_token(lexer, TOKEN_STAR, 1); + case '%': return Lexer_make_token(lexer, TOKEN_PERCENT, 1); case '&': { if (peek(lexer, 1) == '&') @@ -162,20 +161,12 @@ Token Lexer_next(Lexer *lexer) return Lexer_make_token(lexer, TOKEN_SLASH, 1); } - case '*': return Lexer_make_token(lexer, TOKEN_STAR, 1); - case '%': return Lexer_make_token(lexer, TOKEN_PERCENT, 1); - default: { // Handle keywords explicitly - LEX_KEYWORD("fn", TOKEN_FN); - LEX_KEYWORD("if", TOKEN_IF); - LEX_KEYWORD("int", TOKEN_INT); - LEX_KEYWORD("let", TOKEN_LET); - LEX_KEYWORD("for", TOKEN_FOR); - LEX_KEYWORD("else", TOKEN_ELSE); - LEX_KEYWORD("while", TOKEN_WHILE); - LEX_KEYWORD("return", TOKEN_RETURN); + #define LEX_KEYWORD(token_type, str) if (Lexer_starts_with(lexer, str)) return Lexer_make_token(lexer, token_type, strlen(str)); + ENUM_KEYWORDS(LEX_KEYWORD) + #undef LEX_KEYWORD if (isdigit(lexer->src[lexer->pos])) { // TODO: Parse hex and octal numbers |