diff -r semantic-1/ast.hpp semantic-3/ast.hpp
10c10
< extern std::map<char, int> global_vars;
---
> extern std::vector<int> rt_stack;
98,99c98,100
<     for (Stmt *s : stmt_list)
<       s->execute();
---
>     for (Decl *d : decl_list) rt_stack.push_back(0);
>     for (Stmt *s : stmt_list) s->execute();
>     for (Decl *d : decl_list) rt_stack.pop_back();
182,183c183,185
<    STEntry *e  = st.lookup(var);
<    type = e->type;
---
>     STEntry *e = st.lookup(var);
>     type = e->type;
>     offset = e->offset;
186c188
<     return global_vars[var];   
---
>     return rt_stack[offset];   
190a193
>   int offset;
200,201c203,205
<     STEntry *e = st.lookup(var->getVar());
<     expr->check_type(e->type);
---
>     STEntry *lhs = st.lookup(var->getVar());
>     expr->check_type(lhs->type);
>     offset = lhs->offset;
204c208
<     global_vars[var->getVar()] = expr->evaluate();
---
>     rt_stack[offset] = expr->evaluate();
208a213
>   int offset;
diff -r semantic-1/parser.y semantic-3/parser.y
8c8
< std::map<char, int> global_vars;
---
> std::vector<int> rt_stack;
54c54
< program : block { std::cout << "AST: " << *$1 << std::endl; $1->sem_analyze(); } // $1->execute(); }
---
> program : block { std::cout << "AST: " << *$1 << std::endl; $1->sem_analyze(); $1->execute(); }
diff -r semantic-1/symbol.hpp semantic-3/symbol.hpp
7a8
>   int  offset;
9c10
<   STEntry(Type t) : type(t) {}
---
>   STEntry(Type t, int o) : type(t), offset(o) {}
14a16
>   Scope(int o) : offset(o) {}
18c20
<     locals[v] = STEntry(t);
---
>     locals[v] = STEntry(t, offset++);
23a26
>   int get_offset() { return offset; }
25a29
>   int offset;
42c46,47
<     scopes.push_back(Scope());
---
>     int o = scopes.empty() ? 0 : scopes.back().get_offset();
>     scopes.push_back(Scope(o));
