Mercurial > projects > dang
diff sema/SymbolTableBuilder.d @ 14:a51bdf15a33d
Better scopes.
---
int x = 1 + y; // <- should not see y in scope yet
int y;
---
This is done py pushing the scope when a DeclStmt is encountered, and
making sure things that containts statements pop the correct number of
times.
author | Anders Halager <halager@gmail.com> |
---|---|
date | Fri, 18 Apr 2008 15:25:10 +0200 |
parents | 642c6a998fd9 |
children | e331e4e816e4 |
line wrap: on
line diff
--- a/sema/SymbolTableBuilder.d Fri Apr 18 14:47:23 2008 +0200 +++ b/sema/SymbolTableBuilder.d Fri Apr 18 15:25:10 2008 +0200 @@ -1,6 +1,7 @@ module sema.SymbolTableBuilder; -import tango.io.Stdout; +import tango.io.Stdout, + tango.core.Array : find; public import sema.SymbolTable; @@ -44,13 +45,13 @@ visitExp(d.type); visitExp(d.identifier); d.env = current(); - push(); - current().parentFunction = sym; + auto sc = push(); + sc.parentFunction = sym; foreach (arg; d.funcArgs) visitDecl(arg); foreach (stmt; d.statements) visitStmt(stmt); - pop(); + pop(sc); } override void visitVarDecl(VarDecl d) @@ -61,39 +62,53 @@ super.visitVarDecl(d); } + override void visitDeclStmt(DeclStmt d) + { + super.visitDeclStmt(d); + push(); + } + override void visitIfStmt(IfStmt s) { s.env = current(); visitExp(s.cond); - push(); + auto sc = push(); foreach (stmt; s.then_body) visitStmt(stmt); - pop(); + pop(sc); - push(); + sc = push(); foreach (stmt; s.else_body) visitStmt(stmt); - pop(); + pop(sc); } override void visitWhileStmt(WhileStmt s) { s.env = current(); - push(); + auto sc = push(); super.visitWhileStmt(s); - pop(); + pop(sc); } private: Scope[] table; - void push() + Scope push() { - table ~= new Scope(current()); + auto sc = new Scope(current()); + table ~= sc; + return sc; } - Scope pop() + Scope pop(Scope sc = null) { + if (sc !is null) + { + table.length = table.find(sc); + return sc; + } + auto res = table[$ - 1]; table.length = table.length - 1; return res;