/*----------------------------------------------------------------------------- * Function: GetEnumerator * Description: Returns an enumerator over the sorted array of entries * We fill entries with recursiveFillEntries, which will store * in the array the entries of the parents and the current *---------------------------------------------------------------------------*/ public IEnumerator <SymbolEntry <T> > GetEnumerator() { SymbolEntry <T>[] values = new SymbolEntry <T> [this.entriesCount]; recursiveFillEntries(this, values); Array.Sort(values, (a, b) => b.offset.CompareTo(a.offset)); foreach (var i in values) { yield return(i); } }
/*----------------------------------------------------------------------------- * Function: NestedSymbolTable<T>::store * Description: Stores a symbol on the symbol table. Default size of the * symbol on memory is 1. If there is a name clash, discards * the old symbol. This may leave holes in the memory, could be * optimized *---------------------------------------------------------------------------*/ public int store(string name, T symbol, int size = 1) { int symbolOffset = this.NextOffset; if (!storage.ContainsKey(name)) { this.entriesCount++; } this.size += size; this.NextOffset += size; storage[name] = new SymbolEntry <T>(symbol, symbolOffset, size); return(symbolOffset); }