aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaghuram Subramani <raghus2247@gmail.com>2025-06-12 21:35:23 +0530
committerRaghuram Subramani <raghus2247@gmail.com>2025-06-12 21:35:23 +0530
commit6336bd5578e3d92f1ec34d10a96542ed429fdd21 (patch)
tree64514ac13097884f44ed4f8548ba8500e3182f25
parent93d9be786d0ca5b3cfe38cb1868ab7aa6f397281 (diff)
lexer: parse strings
-rw-r--r--include/lexer.h5
-rw-r--r--src/lexer.cc38
2 files changed, 43 insertions, 0 deletions
diff --git a/include/lexer.h b/include/lexer.h
index 6d182c3..d6936f3 100644
--- a/include/lexer.h
+++ b/include/lexer.h
@@ -22,6 +22,11 @@ private:
char advance(void);
char peek(void);
bool match(char c);
+
+private:
+ void string(void);
+
+private:
void add_token(token_type_e type);
void scan_token(void);
diff --git a/src/lexer.cc b/src/lexer.cc
index 50c815e..c77e11d 100644
--- a/src/lexer.cc
+++ b/src/lexer.cc
@@ -83,6 +83,35 @@ Lexer::match(char c)
}
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)
{
int token_length = m_current - m_start;
@@ -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;