#ifndef _LEX_H_ #define _LEX_H_ #include #include #include #include #include #include struct ivy_lexer { struct ivy_lexer_symbol_node *lex_sym_tree; struct ivy_diag_ctx *lex_diag_ctx; struct ivy_line_source *lex_source; b_dict *lex_keywords; enum ivy_status lex_status; b_queue lex_queue; enum ivy_token_type lex_prev_token; b_string *lex_temp; b_queue lex_state; unsigned int lex_brace_depth; unsigned long lex_token_start_row, lex_token_start_col; unsigned long lex_token_end_row, lex_token_end_col; unsigned long lex_cursor_row, lex_cursor_col; char *lex_linebuf; size_t lex_linebuf_len; size_t lex_linebuf_cap; size_t lex_linebuf_ptr; }; enum lexer_state_type { STATE_NORMAL, STATE_STRING, STATE_FSTRING, STATE_INTERPOLATION, }; struct lexer_state { enum lexer_state_type s_type; unsigned int s_brace_depth; b_queue_entry s_entry; }; struct ivy_lexer_symbol_node { char s_char; enum ivy_symbol s_id; b_queue_entry s_entry; b_queue s_children; }; struct lex_token_def { int id; const char *name; uint64_t name_hash; }; #endif