aboutsummaryrefslogtreecommitdiff
path: root/src/lexer.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/lexer.cc')
-rw-r--r--src/lexer.cc21
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);