diff sema/SymbolTableBuilder.d @ 1:2168f4cb73f1

First push
author johnsen@johnsen-desktop
date Fri, 18 Apr 2008 02:01:38 +0200
parents
children ae5bbe4e7fd6
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sema/SymbolTableBuilder.d	Fri Apr 18 02:01:38 2008 +0200
@@ -0,0 +1,78 @@
+module sema.SymbolTableBuilder;
+
+import tango.io.Stdout;
+
+public import sema.SymbolTable;
+
+import sema.Visitor;
+
+class SymbolTableBuilder : Visitor!(void)
+{
+    this()
+    {
+        table ~= new Scope;
+    }
+
+    override void visit(Decl[] decls)
+    {
+        foreach (decl; decls)
+            visitDecl(decl);
+    }
+
+    override void visitDecl(Decl d)
+    {
+        d.env = current();
+        super.visitDecl(d);
+    }
+
+    override void visitStmt(Stmt s)
+    {
+        s.env = current();
+        super.visitStmt(s);
+    }
+
+    override void visitExp(Exp e)
+    {
+        e.env = current();
+        super.visitExp(e);
+    }
+
+    override void visitFuncDecl(FuncDecl d)
+    {
+        auto sym = current().add(d.identifier);
+        sym.type = d.type;
+        push();
+        d.env = current();
+        super.visitFuncDecl(d);
+        pop();
+    }
+
+    override void visitVarDecl(VarDecl d)
+    {
+        auto sc = current();
+        auto sym = sc.add(d.identifier);
+        sym.type = d.type;
+        super.visitVarDecl(d);
+    }
+
+private:
+    Scope[] table;
+
+    void push()
+    {
+        table ~= new Scope(current());
+    }
+
+    Scope pop()
+    {
+        auto res = table[$ - 1];
+        table.length = table.length - 1;
+        return res;
+    }
+
+    Scope current()
+    {
+        return table[$ - 1];
+    }
+}
+