1 /// Author: Aziz Köksal
2 /// License: GPL3
3 /// $(Maturity high)
4 module dil.semantic.SymbolTable;
5 
6 import dil.semantic.Symbol,
7        dil.lexer.Identifier;
8 import dil.String;
9 import common;
10 
11 /// Maps an identifier string to a Symbol.
12 struct SymbolTable
13 {
14   Symbol[hash_t] table; /// The table data structure.
15 
16   /// Looks up ident in the table.
17   /// Returns: the symbol if there, otherwise null.
18   Symbol lookup(Identifier* ident)
19   {
20     assert(ident !is null);
21     auto psym = hashOf(ident.str) in table;
22     return psym ? *psym : null;
23   }
24 
25   /// Looks up a string hash in the table.
26   Symbol lookup(hash_t hash)
27   {
28     auto psym = hash in table;
29     return psym ? *psym : null;
30   }
31 
32   /// Inserts a symbol into the table.
33   void insert(Symbol symbol, Identifier* ident)
34   {
35     table[hashOf(ident.str)] = symbol;
36   }
37 }