diff options
-rw-r--r-- | include/lexer.h | 5 | ||||
-rw-r--r-- | src/lexer.cc | 38 |
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; |