Changed double_peek to far_peek and broke out is_digit_after

This commit is contained in:
Kyler Olsen 2025-06-12 22:22:56 -06:00
parent 2e773218be
commit 4cd5115d4b
1 changed files with 20 additions and 6 deletions

View File

@ -25,18 +25,18 @@ static char peek(Lexer *lexer) {
return lexer->source[lexer->pos]; return lexer->source[lexer->pos];
} }
static char double_peek(Lexer *lexer) { static char far_peek(Lexer *lexer, size_t index) {
return lexer->source[lexer->pos+1]; return lexer->source[lexer->pos + index];
} }
static char advance(Lexer *lexer) { static void advance(Lexer *lexer) {
if (lexer->source[lexer->pos] == '\n') { if (lexer->source[lexer->pos] == '\n') {
lexer->line++; lexer->line++;
lexer->column = 1; lexer->column = 1;
} else { } else {
lexer->column++; lexer->column++;
} }
return lexer->source[lexer->pos++]; lexer->source[lexer->pos++];
} }
typedef enum { typedef enum {
@ -56,6 +56,20 @@ static char is_digit_char(char c, DigitFlags flags) {
return isdigit(c) || c == '_'; return isdigit(c) || c == '_';
} }
static char is_digit_after(char c) {
return
isspace(c) ||
c == '\0' ||
c == ',' ||
c == ')' ||
c == '(' ||
c == '}' ||
c == '{' ||
c == ']' ||
c == '[' ||
c == ';';
}
static char is_identifier_start(char c) { static char is_identifier_start(char c) {
return isalpha(c) || c == '_'; return isalpha(c) || c == '_';
} }
@ -77,7 +91,7 @@ TokenResult lexer_next(Lexer *lexer) {
while (isspace(peek(lexer)) || peek(lexer) == '/') { while (isspace(peek(lexer)) || peek(lexer) == '/') {
// Skip Comments // Skip Comments
if (peek(lexer) == '/' && double_peek(lexer) == '/') if (peek(lexer) == '/' && far_peek(lexer, 1) == '/')
while (peek(lexer) != '\n') advance(lexer); while (peek(lexer) != '\n') advance(lexer);
// Skip whitespace // Skip whitespace
while (isspace(peek(lexer))) advance(lexer); while (isspace(peek(lexer))) advance(lexer);
@ -108,7 +122,7 @@ TokenResult lexer_next(Lexer *lexer) {
} }
} }
while (is_digit_char(peek(lexer), flags)) advance(lexer); while (is_digit_char(peek(lexer), flags)) advance(lexer);
if (isspace(peek(lexer)) || peek(lexer) == ';' || peek(lexer) == '\0' || peek(lexer) == ')' || peek(lexer) == '(' || peek(lexer) == ',') { if (is_digit_after(peek(lexer))) {
return lexer_result(lexer, TOKEN_NUMBER, start, start_line); return lexer_result(lexer, TOKEN_NUMBER, start, start_line);
} else { } else {
return lexer_error(lexer, "Invalid number format", start, start_line); return lexer_error(lexer, "Invalid number format", start, start_line);