source: translator/SymTab/StackTable.cc@ 643a2e1

ADT aaron-thesis arm-eh ast-experimental cleanup-dtors ctor deferred_resn demangler enum forall-pointer-decay gc_noraii jacob/cs343-translation jenkins-sandbox memory new-ast new-ast-unique-expr new-env no_list persistent-indexer pthread-emulation qualifiedEnum resolv-new string with_gc
Last change on this file since 643a2e1 was ea3eb06, checked in by Peter A. Buhr <pabuhr@…>, 11 years ago

formatting changes

  • Property mode set to 100644
File size: 2.0 KB
Line 
1#include <cassert>
2
3#include "StackTable.h"
4
5namespace SymTab {
6 template< typename Element, typename ConflictFunction >
7 StackTable< Element, ConflictFunction >::StackTable() : scopeLevel( 0 )
8 {}
9
10 template< typename Element, typename ConflictFunction >
11 void StackTable< Element, ConflictFunction >::enterScope() {
12 scopeLevel++;
13 }
14
15 template< typename Element, typename ConflictFunction >
16 void StackTable< Element, ConflictFunction >::leaveScope() {
17 for ( typename TableType::iterator it = table.begin(); it != table.end(); ++it ) {
18 std::stack< Entry >& entry = it->second;
19 if ( !entry.empty() && entry.top().second == scopeLevel ) {
20 entry.pop();
21 }
22 }
23 scopeLevel--;
24 assert( scopeLevel >= 0 );
25 }
26
27 template< typename Element, typename ConflictFunction >
28 void StackTable< Element, ConflictFunction >::add( Element *type ) {
29 std::stack< Entry >& entry = table[ type->get_name() ];
30 if ( !entry.empty() && entry.top().second == scopeLevel ) {
31 entry.top().first = conflictFunction( entry.top().first, type );
32 } else {
33 entry.push( Entry( type, scopeLevel ) );
34 }
35 }
36
37 template< typename Element, typename ConflictFunction >
38 void StackTable< Element, ConflictFunction >::add( std::string fwdDeclName ) {
39 add( new Element( fwdDeclName ) );
40 }
41
42 template< typename Element, typename ConflictFunction >
43 Element *StackTable< Element, ConflictFunction >::lookup( std::string id ) const {
44 typename TableType::const_iterator it = table.find( id );
45 if ( it == table.end() ) {
46 return 0;
47 } else if ( !it->second.empty() ) {
48 return it->second.top().first;
49 } else {
50 return 0;
51 }
52 }
53
54 template< typename Element, typename ConflictFunction >
55 void StackTable< Element, ConflictFunction >::dump( std::ostream &os ) const {
56 for ( typename TableType::const_iterator it = table.begin(); it != table.end(); ++it ) {
57 const std::stack< Entry >& entry = it->second;
58 if ( !entry.empty() && entry.top().second == scopeLevel ) {
59 os << it->first << std::endl;
60 }
61 }
62 }
63} // SymTab
Note: See TracBrowser for help on using the repository browser.