-
Notifications
You must be signed in to change notification settings - Fork 0
/
symboltable.cpp
41 lines (32 loc) · 908 Bytes
/
symboltable.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// REVIEW: this all can probably go in the semantic checker file but I need
// a cpp file for every header atm cause of my makefile - I should fix that
#include "symboltable.hpp"
#include "error.hpp"
std::vector<STab> scopestack;
void
openscope()
{
scopestack.emplace_back();
}
void
closescope()
{
scopestack.pop_back();
}
STabRecord * define
( const std::string &name, const int linenum )
{
STab &scope = scopestack.back();
// check for redefinition
if ( scope.find( name ) != scope.end() )
error( linenum, "'%s' redefined", name.data() );
return ( scope[ name ] = new STabRecord() );
}
STabRecord * lookup
( const std::string &name, const int linenum )
{
for ( auto it = scopestack.rbegin(); it != scopestack.rend(); it++ )
if ( it->find(name) != it->end() )
return ( *it )[ name ];
error( linenum, "unknown name '%s'", name.data() );
}