feat(lexer): add more options

This commit is contained in:
Jef Roosens 2024-03-05 10:07:57 +01:00
parent dc3cfc5fbe
commit dcc52e2850
Signed by: Jef Roosens
GPG key ID: B75D4F293C7052DB
3 changed files with 44 additions and 13 deletions

View file

@ -150,6 +150,36 @@ mrk_lexer_err mrk_lexer_next(mrk_token *out, mrk_lexer *lexer) {
mrk_lexer_advance_eq(lexer, c);
mrk_lexer_emit(out, lexer, mrk_token_type_equals);
break;
case '\t':
mrk_lexer_advance_eq(lexer, c);
mrk_lexer_emit(out, lexer, mrk_token_type_tabs);
break;
case '>':
mrk_lexer_advance_eq(lexer, c);
mrk_lexer_emit(out, lexer, mrk_token_type_right_angle_brackets);
break;
case '!':
mrk_lexer_emit(out, lexer, mrk_token_type_bang);
break;
case '[':
mrk_lexer_emit(out, lexer, mrk_token_type_left_bracket);
break;
case ']':
mrk_lexer_emit(out, lexer, mrk_token_type_right_bracket);
break;
case '(':
mrk_lexer_emit(out, lexer, mrk_token_type_left_paren);
break;
case ')':
mrk_lexer_emit(out, lexer, mrk_token_type_right_paren);
break;
case '\\':
if (mrk_lexer_peek(lexer) == '\n') {
mrk_lexer_emit(out, lexer, mrk_token_type_line_break);
} else {
mrk_lexer_emit(out, lexer, mrk_token_type_backslash);
}
break;
// Two consecutive newlines constitute a blank line, otherwise they're
// ignored as whitespace
case '\n':
@ -157,26 +187,20 @@ mrk_lexer_err mrk_lexer_next(mrk_token *out, mrk_lexer *lexer) {
mrk_lexer_advance(lexer);
mrk_lexer_emit(out, lexer, mrk_token_type_blank_line);
} else {
mrk_lexer_reset(lexer);
mrk_lexer_emit(out, lexer, mrk_token_type_newline);
}
break;
case ' ': {
/* if (mrk_lexer_peek(lexer) == ' ' && mrk_lexer_peek_n(lexer,)) */
// Either a double space or a line break
if (mrk_lexer_peek(lexer) == ' ' && mrk_lexer_peek_n(lexer, 1) == '\n') {
mrk_lexer_advance_n(lexer, 2);
mrk_lexer_emit(out, lexer, mrk_token_type_line_break);
} else {
mrk_lexer_emit(out, lexer, mrk_token_type_space);
mrk_lexer_advance_eq(lexer, ' ');
mrk_lexer_emit(out, lexer, mrk_token_type_spaces);
}
} break;
case '\t':
mrk_lexer_emit(out, lexer, mrk_token_type_tab);
break;
case '>':
mrk_lexer_emit(out, lexer, mrk_token_type_right_angle_bracket);
break;
}
}