Delete previous progress

This commit is contained in:
Krzosa Karol
2022-05-02 09:49:22 +02:00
parent 6d68fd07aa
commit 3c376bbe30
13 changed files with 81 additions and 1274 deletions

170
parser.c
View File

@@ -21,27 +21,11 @@ global Intern_String keyword_union;
global Intern_String keyword_function;
global Intern_String keyword_global;
global AST_Node *type_s64;
global AST_Node *type_s32;
global AST_Node *type_s16;
global AST_Node *type_s8;
global AST_Node *type_u64;
global AST_Node *type_u32;
global AST_Node *type_u16;
global AST_Node *type_u8;
global AST_Node *type_void;
global AST_Node *type_sizeu;
function void
parser_init(Parser *p){
p->interns_count = 4096;
p->interns_count = 4096*2;
p->interns = arena_push_array(&p->intern_table_arena, Intern_String, p->interns_count);
p->symbols_count = 4096;
p->symbols = arena_push_array(&p->symbol_table_arena, AST_Node, p->symbols_count);
keyword_sizeof = intern_string(p, lit("sizeof"));
keyword_struct = intern_string(p, lit("struct"));
keyword_enum = intern_string(p, lit("enum"));
@@ -65,22 +49,6 @@ parser_init(Parser *p){
intern_void = intern_string(p, lit("void"));
intern_sizeu = intern_string(p, lit("SizeU"));
parser_push_scope(p); // Global scope
type_s64 = symbol_register_basic_type(p, intern_s64, sizeof(S64));
type_s32 = symbol_register_basic_type(p, intern_s32, sizeof(S32));
type_s16 = symbol_register_basic_type(p, intern_s16, sizeof(S16));
type_s8 = symbol_register_basic_type(p, intern_s8, sizeof(S8));
type_u64 = symbol_register_basic_type(p, intern_u64, sizeof(U64));
type_u32 = symbol_register_basic_type(p, intern_u32, sizeof(U32));
type_u16 = symbol_register_basic_type(p, intern_u16, sizeof(U16));
type_u8 = symbol_register_basic_type(p, intern_u8, sizeof(U8));
type_void = symbol_register_basic_type(p, intern_void, sizeof(void));
type_sizeu = symbol_register_basic_type(p, intern_sizeu, sizeof(SizeU));
}
function B32
@@ -189,139 +157,3 @@ intern_string(Parser *p, String string){
return result;
}
//-----------------------------------------------------------------------------
// Symbols
//-----------------------------------------------------------------------------
function AST_Node *
symbol_alloc_slot(Parser *p, Intern_String string, B32 is_global){
Table_Index index = table_index_from_string(string.s, p->symbols_count);
for(;;){
AST_Node *symbol = p->symbols + index.iter;
if(symbol->name.s.str == 0){
/* @Note(Krzosa): Push on scope */ {
if(is_global){
SLLQueuePushMod(p->scope_stack->first, p->scope_stack->last, symbol, next_scope);
}
else{
SLLQueuePushMod(p->global_scope->first, p->global_scope->last, symbol, next_scope);
}
}
symbol->name = string;
p->symbols_inserted++;
return symbol;
}
else if(intern_compare(symbol->name, string)){
return symbol;
}
if (table_index_advance(&index))
break;
}
assert_msg(0, "Ran out of slots in symbol table");
return 0;
}
function AST_Node *
symbol_lookup(Parser *p, Intern_String string){
Table_Index index = table_index_from_string(string.s, p->symbols_count);
for(;;){
AST_Node *symbol = p->symbols + index.iter;
if(symbol->name.s.str == 0){
return 0;
}
else if(intern_compare(symbol->name, string)){
return symbol;
}
if (table_index_advance(&index))
return 0;
}
}
function AST_Node *
symbol_register_basic_type(Parser *p, Intern_String string, SizeU size){
AST_Node *node = symbol_alloc_slot(p, string, true);
assert(node->kind == AK_None);
node->kind = AK_BaseType;
node->base_type_size = size;
return node;
}
function void
symbol_register(Parser *p, AST_Node *node){
AST_Node *look = symbol_alloc_slot(p, node->name, false);
if(look->kind == AK_None){
ast_copy_symbol(look, node);
}
else if(look->kind == node->kind){
if(look->kind == AK_Enum ||
look->kind == AK_Function ||
look->kind == AK_Union ||
look->kind == AK_Struct){
if(look->first_child == 0){
ast_copy_symbol(look, node);
}
else {
parser_push_error(p, token_get(p), "Symbol already has a body");
}
}
else {
parser_push_error(p, token_get(p), "Trying to register a symbol again");
}
}
else{
parser_push_error(p, token_get(p), "Trying to register a symbol of different kind with the same name");
}
}
function AST_Node *
symbol_lookup_type(Parser *p, Intern_String string){
AST_Node *node = symbol_lookup(p, string);
if(node){
if(ast_is_type(node)){
return node;
}
}
return 0;
}
function AST_Node *
symbol_require_type(Parser *p, Token *token){
AST_Node *result = symbol_lookup_type(p, token->intern_val);
if(!result){
parser_push_error(p, token, "Undefined type");
}
return result;
}
function void
parser_push_scope(Parser *p){
Scope *scope = 0;
SLLStackPop(p->scope_free_list, scope);
if(!scope){
scope = arena_push_struct(&p->main_arena, Scope);
}
SLLStackPush(p->scope_stack, scope);
if(p->global_scope == 0){
p->global_scope = scope;
}
}
function void
parser_pop_scope(Parser *p){
Scope *scope = 0;
SLLStackPop(p->scope_stack, scope);
assert(scope);
for(AST_Node *s = scope->first; s; s=s->next_scope){
memory_zero(s, sizeof(AST_Node));
p->symbols_inserted--;
}
memory_zero(scope, sizeof(Scope));
SLLStackPush(p->scope_free_list, scope);
}