Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 23 additions & 19 deletions src/lexer.c
Original file line number Diff line number Diff line change
Expand Up @@ -102,9 +102,9 @@ static void lexer_advance_by(lexer_T* lexer, const size_t count) {
}
}

static token_T* lexer_advance_with(lexer_T* lexer, const char* value, const token_type_T type) {
lexer_advance_by(lexer, strlen(value));
return token_init(hb_string(value), type, lexer);
static token_T* lexer_advance_with(lexer_T* lexer, hb_string_T value, const token_type_T type) {
lexer_advance_by(lexer, value.length);
return token_init(value, type, lexer);
}

static token_T* lexer_advance_with_next(lexer_T* lexer, size_t count, token_type_T type) {
Expand All @@ -120,7 +120,11 @@ static token_T* lexer_advance_with_next(lexer_T* lexer, size_t count, token_type
}

static token_T* lexer_advance_current(lexer_T* lexer, const token_type_T type) {
return lexer_advance_with(lexer, (char[]) { lexer->current_character, '\0' }, type);
char buffer[2];
buffer[0] = lexer->current_character;
buffer[1] = '\0';
Comment thread
marcoroth marked this conversation as resolved.

return lexer_advance_with(lexer, hb_string(buffer), type);
}

static token_T* lexer_advance_utf8_character(lexer_T* lexer, const token_type_T type) {
Expand All @@ -139,10 +143,9 @@ static token_T* lexer_advance_utf8_character(lexer_T* lexer, const token_type_T
return token;
}

static token_T* lexer_match_and_advance(lexer_T* lexer, const char* value, const token_type_T type) {
if (strncmp(lexer->source.data + lexer->current_position, value, strlen(value)) == 0) {
return lexer_advance_with(lexer, value, type);
}
static token_T* lexer_match_and_advance(lexer_T* lexer, hb_string_T value, const token_type_T type) {
hb_string_T remaining_source = hb_string_slice(lexer->source, lexer->current_position);
if (hb_string_starts_with(remaining_source, value)) { return lexer_advance_with(lexer, value, type); }

return NULL;
}
Expand Down Expand Up @@ -182,7 +185,8 @@ static token_T* lexer_parse_identifier(lexer_T* lexer) {
// ===== ERB Parsing

static token_T* lexer_parse_erb_open(lexer_T* lexer) {
const char* erb_patterns[] = { "<%==", "<%%=", "<%=", "<%#", "<%-", "<%%", "<%" };
hb_string_T erb_patterns[] = { hb_string("<%=="), hb_string("<%%="), hb_string("<%="), hb_string("<%#"),
hb_string("<%-"), hb_string("<%%"), hb_string("<%") };

lexer->state = STATE_ERB_CONTENT;

Expand Down Expand Up @@ -230,11 +234,11 @@ static token_T* lexer_parse_erb_content(lexer_T* lexer) {
static token_T* lexer_parse_erb_close(lexer_T* lexer) {
lexer->state = STATE_DATA;

if (lexer_peek_erb_percent_close_tag(lexer, 0)) { return lexer_advance_with(lexer, "%%>", TOKEN_ERB_END); }
if (lexer_peek_erb_equals_close_tag(lexer, 0)) { return lexer_advance_with(lexer, "=%>", TOKEN_ERB_END); }
if (lexer_peek_erb_dash_close_tag(lexer, 0)) { return lexer_advance_with(lexer, "-%>", TOKEN_ERB_END); }
if (lexer_peek_erb_percent_close_tag(lexer, 0)) { return lexer_advance_with(lexer, hb_string("%%>"), TOKEN_ERB_END); }
if (lexer_peek_erb_equals_close_tag(lexer, 0)) { return lexer_advance_with(lexer, hb_string("=%>"), TOKEN_ERB_END); }
if (lexer_peek_erb_dash_close_tag(lexer, 0)) { return lexer_advance_with(lexer, hb_string("-%>"), TOKEN_ERB_END); }

return lexer_advance_with(lexer, "%>", TOKEN_ERB_END);
return lexer_advance_with(lexer, hb_string("%>"), TOKEN_ERB_END);
}

// ===== Tokenizing Function
Expand Down Expand Up @@ -277,33 +281,33 @@ token_T* lexer_next_token(lexer_T* lexer) {
if (isalnum(lexer_peek(lexer, 1))) { return lexer_advance_current(lexer, TOKEN_HTML_TAG_START); }

if (lexer_peek_for_html_comment_start(lexer, 0)) {
return lexer_advance_with(lexer, "<!--", TOKEN_HTML_COMMENT_START);
return lexer_advance_with(lexer, hb_string("<!--"), TOKEN_HTML_COMMENT_START);
}

if (lexer_peek_for_close_tag_start(lexer, 0)) {
return lexer_advance_with(lexer, "</", TOKEN_HTML_TAG_START_CLOSE);
return lexer_advance_with(lexer, hb_string("</"), TOKEN_HTML_TAG_START_CLOSE);
}

return lexer_advance_current(lexer, TOKEN_LT);
}

case '/': {
token_T* token = lexer_match_and_advance(lexer, "/>", TOKEN_HTML_TAG_SELF_CLOSE);
token_T* token = lexer_match_and_advance(lexer, hb_string("/>"), TOKEN_HTML_TAG_SELF_CLOSE);
return token ? token : lexer_advance_current(lexer, TOKEN_SLASH);
}

case '?': {
token_T* token = lexer_match_and_advance(lexer, "?>", TOKEN_XML_DECLARATION_END);
token_T* token = lexer_match_and_advance(lexer, hb_string("?>"), TOKEN_XML_DECLARATION_END);
return token ? token : lexer_advance_current(lexer, TOKEN_CHARACTER);
}

case '-': {
token_T* token = lexer_match_and_advance(lexer, "-->", TOKEN_HTML_COMMENT_END);
token_T* token = lexer_match_and_advance(lexer, hb_string("-->"), TOKEN_HTML_COMMENT_END);
return token ? token : lexer_advance_current(lexer, TOKEN_DASH);
}

case ']': {
token_T* token = lexer_match_and_advance(lexer, "]]>", TOKEN_CDATA_END);
token_T* token = lexer_match_and_advance(lexer, hb_string("]]>"), TOKEN_CDATA_END);
return token ? token : lexer_advance_current(lexer, TOKEN_CHARACTER);
}

Expand Down
Loading