From 6336bd5578e3d92f1ec34d10a96542ed429fdd21 Mon Sep 17 00:00:00 2001 From: Raghuram Subramani Date: Thu, 12 Jun 2025 21:35:23 +0530 Subject: lexer: parse strings --- src/lexer.cc | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) (limited to 'src/lexer.cc') diff --git a/src/lexer.cc b/src/lexer.cc index 50c815e..c77e11d 100644 --- a/src/lexer.cc +++ b/src/lexer.cc @@ -82,6 +82,35 @@ Lexer::match(char c) return true; } +void +Lexer::string(void) +{ + while (peek() != '"' && !at_end()) { + if (peek() == '\n') + m_line++; + + advance(); + } + + if (at_end()) { + printf("[-] Error: Unterminated string in line %lu\n", m_line); + return; + } + + int token_length = m_current - m_start - 1; + if (token_length == 0) + token_length++; + + char *lexeme; + asprintf(&lexeme, "%.*s", token_length, m_script + m_start + 1); + Token token; + token.init(STRING, lexeme, m_line); + m_tokens->add(&token); + token.clean(); + + advance(); +} + void Lexer::add_token(token_type_e type) { @@ -147,6 +176,10 @@ Lexer::scan_token(void) add_token(match('=') ? GREATER_EQUAL : GREATER); break; + case '"': + string(); + break; + case '/': if (match('/')) while (peek() != '\n' && !at_end()) @@ -159,6 +192,11 @@ Lexer::scan_token(void) m_line++; break; + case ' ': + case '\r': + case '\t': + break; + default: printf("[-] Error: Unexpected character %c in line %lu\n", c, m_line); m_errored = true; -- cgit v1.2.3