struct Lex_Stream { String stream; S64 iter; U8 *line_begin; Intern_String file; S32 line; S32 inside_brace_paren; Array indent_stack; // @scratch_allocated }; struct Core_Ctx { Allocator *heap; Arena perm_push_only; Arena *perm; // Stores: AST, tokens, interns Arena *scratch; Arena scratch_; Arena stage_arena_; Arena *stage_arena; Arena token_arena; String_Builder helper_builder; int errors_occured; int warnings_occured; Core_Message *first_message; Core_Message *last_message; // Lexer stuff Lex_Stream stream; Array tokens; Intern_Table interns; S64 token_iter; U32 token_debug_ids; // Types List all_types; S32 type_ids; int global_decl_ids; U64 unique_ids; // @Debug Map type_map; Ast_Module *custom_module; Ast_Module *language_base_module; List files; List modules; List ordered_decls; S32 base_language_ordered_decl_len; Ast_Scope *currently_parsed_scope; Ast_File *currently_parsed_file; U32 scope_ids; U32 scope_visit_id; List module_folders; String module_folder; String exe_folder; String working_folder; List files_to_link; struct { F64 typechecking; F64 code_generation; F64 total; F64 init_context; F64 parsing; F64 start; } time; int lines_lexed; bool debugger_break_on_compiler_error; // Codegen stage mostly S64 indent; String_Builder gen; // Codegen stage configurables bool emit_line_directives; bool emit_type_info; bool single_header_library_mode; String single_header_library_name; Token same_scope_token; Token null_token; /*#import meta for i in meta.keywords: print(f'Intern_String keyword_{i.lower()};') for i in meta.interns: print(f'Intern_String intern_{i.lower()};') */ Intern_String keyword_struct; Intern_String keyword_union; Intern_String keyword_true; Intern_String keyword_default; Intern_String keyword_continue; Intern_String keyword_break; Intern_String keyword_false; Intern_String keyword_return; Intern_String keyword_switch; Intern_String keyword_assert; Intern_String keyword_if; Intern_String keyword_elif; Intern_String keyword_pass; Intern_String keyword_else; Intern_String keyword_for; Intern_String keyword_enum; Intern_String intern_typeof; Intern_String intern_sizeof; Intern_String intern_len; Intern_String intern_alignof; Intern_String intern_foreign; Intern_String intern_strict; Intern_String intern_void; Intern_String intern_flag; Intern_String intern_it; Intern_String intern_load; Intern_String intern_import; Intern_String intern_link; Intern_String intern_compiler_breakpoint; /*END*/ /*#import meta size = 0 for i in meta.token_simple_expr: if i[1] != "SPECIAL": size += 1 print(f"Ast_Operator_Info op_info_table[{size}];") */ Ast_Operator_Info op_info_table[20]; /*END*/ Ast_Type type__void; Ast_Type type__string; Ast_Type type__bool; Ast_Type type__type; Ast_Type type__f32; Ast_Type type__f64; Ast_Type type__s8; Ast_Type type__s16; Ast_Type type__s32; Ast_Type type__s64; Ast_Type type__u8; Ast_Type type__u16; Ast_Type type__u32; Ast_Type type__u64; Ast_Type type__untyped_bool; Ast_Type type__untyped_int; Ast_Type type__untyped_string; Ast_Type type__untyped_float; Ast_Type type__char; Ast_Type type__uchar; Ast_Type type__int; Ast_Type type__uint; Ast_Type type__long; Ast_Type type__ulong; Ast_Type type__llong; Ast_Type type__ullong; Ast_Type type__short; Ast_Type type__ushort; Ast_Type *type_char; Ast_Type *type_uchar; Ast_Type *type_int; Ast_Type *type_uint; Ast_Type *type_long; Ast_Type *type_ulong; Ast_Type *type_llong; Ast_Type *type_ullong; Ast_Type *type_short; Ast_Type *type_ushort; Ast_Type *type_void; Ast_Type *type_pointer_to_char; Ast_Type *type_pointer_to_void; Ast_Type *type_any; // Needs to be inited at runtime Ast_Type *type_type; Ast_Type *type_string; Ast_Type *type_bool; Ast_Type *type_f32; Ast_Type *type_f64; Ast_Type *type_s8; Ast_Type *type_s16; Ast_Type *type_s32; Ast_Type *type_s64; Ast_Type *type_u8; Ast_Type *type_u16; Ast_Type *type_u32; Ast_Type *type_u64; Ast_Type *untyped_string; Ast_Type *untyped_bool; Ast_Type *untyped_int; Ast_Type *untyped_float; Ast_Type type__vargs; Ast_Type *type_vargs; Intern_String intern(String string) { assert(string.len > 0); return intern_string(&interns, string); } Intern_String internf(char *str, ...) { STRING_FMT(this->stage_arena, str, result); return intern_string(&interns, result); } String fmt(char *str, ...) { STRING_FMT(this->stage_arena, str, result); return result; } }; CORE_Static String compile_to_c_code(); CORE_Static Ast_Module *ast_module(Token *pos, Intern_String filename); CORE_Static void insert_builtin_types_into_scope(Ast_Scope *p); CORE_Static void insert_into_scope(Ast_Scope *scope, Ast_Decl *decl); CORE_Static Ast_Type *type_incomplete(Ast *ast); CORE_Static Ast_Expr *parse_expr(S64 minbp = 0);