feat(lexer): add more options

main
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

@ -14,4 +14,4 @@ INC_DIRS = $(PUB_INC_DIR) src/_include
# object file is also recompiled if only a header is changed.
# -MP: generate a dummy target for every header file (according to the docs it
# prevents some errors when removing header files)
CFLAGS ?= -MMD -MP -g
CFLAGS ?= -MMD -MP -g -Wall -Wextra

View File

@ -21,10 +21,17 @@ typedef enum mrk_token_type {
mrk_token_type_stars,
mrk_token_type_equals,
mrk_token_type_blank_line,
mrk_token_type_space,
mrk_token_type_newline,
mrk_token_type_spaces,
mrk_token_type_line_break,
mrk_token_type_right_angle_bracket,
mrk_token_type_tab,
mrk_token_type_right_angle_brackets,
mrk_token_type_tabs,
mrk_token_type_left_bracket,
mrk_token_type_right_bracket,
mrk_token_type_bang,
mrk_token_type_left_paren,
mrk_token_type_right_paren,
mrk_token_type_backslash,
} mrk_token_type;
typedef struct mrk_token {

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;
}
}