mirror of
https://github.com/twiglet/cs2j.git
synced 2025-01-18 13:15:17 +01:00
81 lines
1.7 KiB
C#
81 lines
1.7 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Text;
|
|
|
|
|
|
namespace RusticiSoftware.Translator
|
|
{
|
|
// Holds our symbol table, a multi-level map from identifiers (string) to their type (string)
|
|
|
|
public class SymbolTable
|
|
{
|
|
// A stack of hashtables
|
|
private Stack _outer = null;
|
|
|
|
|
|
public SymbolTable()
|
|
{
|
|
_outer = new Stack();
|
|
PushLevel();
|
|
}
|
|
|
|
public void PushLevel()
|
|
{
|
|
_outer.Push(new Hashtable());
|
|
}
|
|
|
|
public void PopLevel()
|
|
{
|
|
_outer.Pop();
|
|
}
|
|
|
|
// keving: Can we try to add the same var twice??
|
|
public void Add(string v, TypeRep t)
|
|
{
|
|
((Hashtable)_outer.Peek())[v] = t;
|
|
}
|
|
|
|
public TypeRep Get(string v)
|
|
{
|
|
//TypeRep unknownType;
|
|
|
|
foreach (Hashtable d in _outer)
|
|
{
|
|
if (d.Contains(v))
|
|
return (TypeRep) d[v];
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public TypeRep this[string v]
|
|
{
|
|
get
|
|
{
|
|
return Get(v);
|
|
}
|
|
set
|
|
{
|
|
Add(v, value);
|
|
}
|
|
}
|
|
|
|
public void Dump()
|
|
{
|
|
string INDENT = "";
|
|
Console.WriteLine("symbol Table Dump");
|
|
|
|
foreach (Hashtable d in _outer)
|
|
{
|
|
foreach (string v in d.Keys)
|
|
{
|
|
Console.WriteLine(INDENT + v + ": " + ((TypeRep)d[v]).TypeName);
|
|
}
|
|
INDENT += " ";
|
|
}
|
|
Console.WriteLine("");
|
|
}
|
|
|
|
}
|
|
|
|
}
|