Added string and character lexing

This commit is contained in:
Kyler Olsen 2025-06-12 22:24:02 -06:00
parent be648a6485
commit ab690f4bb5
3 changed files with 30 additions and 1 deletions

View File

@ -16,6 +16,8 @@ typedef enum {
TOKEN_RBRACE,
TOKEN_LBRACKET,
TOKEN_RBRACKET,
TOKEN_CHARACTER,
TOKEN_STRING,
} TokenType;
typedef struct {

View File

@ -129,6 +129,32 @@ TokenResult lexer_next(Lexer *lexer) {
}
}
// Characters
if (c == '\'') {
advance(lexer); // Opening `'`
if (peek(lexer) == '\\') advance(lexer); // Slash
advance(lexer); // Char
if (peek(lexer) == '\'') {
advance(lexer); // Closing `'`
return lexer_result(lexer, TOKEN_CHARACTER, start, start_line);
} else return lexer_error(lexer, "Invalid character format", start, start_line);
}
// Strings
if (c == '"') {
advance(lexer);
while (peek(lexer) != '"') {
if (peek(lexer) == '\\') {
advance(lexer);
} else if (peek(lexer) == '\n') {
return lexer_error(lexer, "Invalid string format", start, start_line);
}
advance(lexer);
}
advance(lexer);
return lexer_result(lexer, TOKEN_STRING, start, start_line);
}
// Identifiers
if (is_identifier_start(c)) {
while (is_identifier_char(peek(lexer))) advance(lexer);

View File

@ -8,7 +8,8 @@ static void print_token(Token token) {
(const char *[]){
"EOF", "IDENTIFIER", "NUMBER", "OPERATOR",
"LPAREN", "RPAREN", "SEMICOLON", "LBRACE",
"RBRACE", "LBRACKET", "RBRACKET"
"RBRACE", "LBRACKET", "RBRACKET", "CHARACTER",
"STRING"
}[token.type],
(int)token.length, token.start
);