Files
corelang/core_compiler.h
2023-04-22 13:46:21 +02:00

234 lines
5.5 KiB
C

struct Lex_Stream {
String stream;
S64 iter;
U8 *line_begin;
Intern_String file;
S32 line;
S32 inside_brace_paren;
Array<Token *> 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<Token> tokens;
Intern_Table interns;
S64 token_iter;
U32 token_debug_ids;
// Types
List<Ast_Type *> 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<Ast_File *> files;
List<Ast_Module *> modules;
List<Ast_Decl *> 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<String> module_folders;
String module_folder;
String exe_folder;
String working_folder;
List<Token *> 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 keyword_goto;
Intern_String keyword_defer;
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);