#ifndef RAVA_SYMBOL_TABLE_H #define RAVA_SYMBOL_TABLE_H #include "../types/types.h" #include "../parser/parser.h" #include #include #define RAVA_SYMBOL_HASH_SIZE 32 typedef enum { RAVA_SYMBOL_CLASS, RAVA_SYMBOL_METHOD, RAVA_SYMBOL_FIELD, RAVA_SYMBOL_VARIABLE, RAVA_SYMBOL_PARAMETER } RavaSymbolKind_e; typedef struct RavaSymbol_t { RavaSymbolKind_e kind; char *name; RavaType_t *type; RavaModifier_e *modifiers; size_t modifiers_count; RavaASTNode_t *declaration; size_t local_index; struct RavaSymbol_t *next; struct RavaSymbol_t *hash_next; } RavaSymbol_t; typedef struct RavaScope_t { char *name; RavaSymbol_t *symbols; RavaSymbol_t *hash_table[RAVA_SYMBOL_HASH_SIZE]; struct RavaScope_t *parent; struct RavaScope_t **children; size_t children_count; size_t children_capacity; } RavaScope_t; typedef struct { RavaScope_t *global_scope; RavaScope_t *current_scope; } RavaSymbolTable_t; RavaSymbolTable_t* rava_symbol_table_create(); void rava_symbol_table_destroy(RavaSymbolTable_t *table); RavaScope_t* rava_scope_create(const char *name, RavaScope_t *parent); void rava_scope_destroy(RavaScope_t *scope); void rava_symbol_table_enter_scope(RavaSymbolTable_t *table, const char *scope_name); void rava_symbol_table_exit_scope(RavaSymbolTable_t *table); RavaSymbol_t* rava_symbol_create(RavaSymbolKind_e kind, const char *name, RavaType_t *type); void rava_symbol_destroy(RavaSymbol_t *symbol); bool rava_symbol_table_define(RavaSymbolTable_t *table, RavaSymbol_t *symbol); RavaSymbol_t* rava_symbol_table_resolve(RavaSymbolTable_t *table, const char *name); RavaSymbol_t* rava_symbol_table_resolve_in_scope(RavaScope_t *scope, const char *name); bool rava_symbol_has_modifier(RavaSymbol_t *symbol, RavaModifier_e modifier); #endif