diff --git a/include/sync/lexer.h b/include/sync/lexer.h index 67c6662..5680fa8 100644 --- a/include/sync/lexer.h +++ b/include/sync/lexer.h @@ -16,6 +16,8 @@ typedef enum { TOKEN_RBRACE, TOKEN_LBRACKET, TOKEN_RBRACKET, + TOKEN_CHARACTER, + TOKEN_STRING, } TokenType; typedef struct { diff --git a/src/lexer.c b/src/lexer.c index 6cac10a..3aeab3f 100644 --- a/src/lexer.c +++ b/src/lexer.c @@ -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); diff --git a/src/main.c b/src/main.c index c404435..bed92fe 100644 --- a/src/main.c +++ b/src/main.c @@ -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 );