diff options
Diffstat (limited to 'src/lexer.cc')
-rw-r--r-- | src/lexer.cc | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/src/lexer.cc b/src/lexer.cc index e09e187..129531d 100644 --- a/src/lexer.cc +++ b/src/lexer.cc @@ -145,13 +145,7 @@ Lexer::identifier(void) while (isalnum(peek())) advance(); - int token_length = m_current - m_start; - if (token_length == 0) - token_length++; - - char *lexeme; - asprintf(&lexeme, "%.*s", token_length, m_script + m_start); - + char *lexeme = extract_lexeme(); token_type_e type = IDENTIFIER; for (size_t i = 0; i < N_KEYWORDS; i++) { @@ -160,10 +154,11 @@ Lexer::identifier(void) } add_token(type); + free(lexeme); } -void -Lexer::add_token(token_type_e type) +char * +Lexer::extract_lexeme(void) { int token_length = m_current - m_start; if (token_length == 0) @@ -172,6 +167,14 @@ Lexer::add_token(token_type_e type) char *lexeme; asprintf(&lexeme, "%.*s", token_length, m_script + m_start); + return lexeme; +} + +void +Lexer::add_token(token_type_e type) +{ + char *lexeme = extract_lexeme(); + Token token; token.init(type, lexeme, m_line); m_tokens->add(&token); |