t_result lex_comment(t_file_reader *reader) { t_position pos; t_position prev; char c; pos = reader->cursor; c = string_reader_next(reader); if (c == COMMENT_CHAR || c == ';') { while (string_reader_has_more(reader)) { prev = reader->cursor; c = string_reader_next(reader); if (c == '\n') { reader->cursor = prev; break; } } return (create_result_from_comment_token(reader, pos)); } reader->cursor = pos; return (get_null_result()); }
t_result lex_multiline_comment(t_file_reader *reader) { t_position pos; char c; char c2; pos = reader->cursor; c = string_reader_next(reader); if (!string_reader_has_more(reader)) { reader->cursor = pos; return (get_null_result()); } c2 = string_reader_next(reader); if (c == '/' && c2 == '*') { while (string_reader_has_more(reader)) { c = c2; c2 = string_reader_next(reader); if (c == '*' && c2 == '/') return (create_result_from_comment_token(reader, pos)); } return (create_result_from_se(reader->cursor, "Unterminated comment")); } reader->cursor = pos; return (get_null_result()); }
t_result lex_string(t_file_reader *reader) { t_position begin; char c; begin = reader->cursor; c = string_reader_next(reader); if (c != '\"' && c != '\'') { reader->cursor = begin; return (get_null_result()); } return (get_string_result(reader, begin, c)); }
void string_reader_skip(t_string_reader *reader, const char *chars_to_skip) { t_position prev; char c; while (string_reader_has_more(reader)) { prev = reader->position; c = string_reader_next(reader); if (!string_find_char(chars_to_skip, c)) { reader->position = prev; break; } } }
t_result get_string_result(t_file_reader *reader, t_position begin, char end) { char c; t_position prev; while (string_reader_has_more(reader)) { prev = reader->cursor; c = string_reader_next(reader); if (c == end) return (create_result_from_string_token(reader, begin)); else if (c == '\n') return (create_result_from_se(prev, "String didn't ended before EOL")); } return (create_result_from_se(reader->cursor, "String isn't closed")); }