#pragma once #include "report.h" #include typedef enum { IdentResolTy_None, IdentResolTy_Label, IdentResolTy_SubLabel, IdentResolTy_Const, IdentResolTy_Extern, } IdentResolTy; typedef struct IdentResol IdentResol; struct IdentResol { char* ident; Loc loc; const IdentResol* parent; IdentResolTy ty; union { uint16_t ip; struct { uint16_t value; char* src_filename; }; size_t extern_id; }; }; void ident_resol_destroy(IdentResol* resol); typedef struct IdentResolver IdentResolver; struct IdentResolver { IdentResol* resols; size_t resols_capacity; size_t resols_size; const IdentResol* current_parent; }; void ident_resolver_construct(IdentResolver* resolver); void ident_resolver_destroy(IdentResolver* resolver); void ident_resolver_define_label( IdentResolver* resolver, char* ident, Loc loc, uint16_t asm_ip); void ident_resolver_define_sublabel( IdentResolver* resolver, char* ident, Loc loc, uint16_t asm_ip); void ident_resolver_define_const(IdentResolver* resolver, char* ident, Loc loc, uint16_t value, char* src_filename); void ident_resolver_define_extern( IdentResolver* resolver, char* ident, Loc loc, size_t extern_id); const IdentResol* ident_resolver_resolve( const IdentResolver* resolver, const char* ident);