Changed double_peek to far_peek and broke out is_digit_after
This commit is contained in:
parent
2e773218be
commit
4cd5115d4b
26
src/lexer.c
26
src/lexer.c
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue