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];
|
||||
}
|
||||
|
||||
static char double_peek(Lexer *lexer) {
|
||||
return lexer->source[lexer->pos+1];
|
||||
static char far_peek(Lexer *lexer, size_t index) {
|
||||
return lexer->source[lexer->pos + index];
|
||||
}
|
||||
|
||||
static char advance(Lexer *lexer) {
|
||||
static void advance(Lexer *lexer) {
|
||||
if (lexer->source[lexer->pos] == '\n') {
|
||||
lexer->line++;
|
||||
lexer->column = 1;
|
||||
} else {
|
||||
lexer->column++;
|
||||
}
|
||||
return lexer->source[lexer->pos++];
|
||||
lexer->source[lexer->pos++];
|
||||
}
|
||||
|
||||
typedef enum {
|
||||
|
@ -56,6 +56,20 @@ static char is_digit_char(char c, DigitFlags flags) {
|
|||
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) {
|
||||
return isalpha(c) || c == '_';
|
||||
}
|
||||
|
@ -77,7 +91,7 @@ TokenResult lexer_next(Lexer *lexer) {
|
|||
|
||||
while (isspace(peek(lexer)) || peek(lexer) == '/') {
|
||||
// Skip Comments
|
||||
if (peek(lexer) == '/' && double_peek(lexer) == '/')
|
||||
if (peek(lexer) == '/' && far_peek(lexer, 1) == '/')
|
||||
while (peek(lexer) != '\n') advance(lexer);
|
||||
// Skip whitespace
|
||||
while (isspace(peek(lexer))) advance(lexer);
|
||||
|
@ -108,7 +122,7 @@ TokenResult lexer_next(Lexer *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);
|
||||
} else {
|
||||
return lexer_error(lexer, "Invalid number format", start, start_line);
|
||||
|
|
Loading…
Reference in New Issue