Mercurial > projects > dang
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]; + } +} +