1 : //==============================================================================
2 : // File <$/src/cpp/dev/idlc/sym_tab.cpp>
3 : // This file is part of YaOrb : Yet Another Object Request Broker,
4 : // Copyright (c) 2000-2003, Marc Alff.
5 : //
6 : // This program is free software; you can redistribute it and/or
7 : // modify it under the terms of the GNU General Public License
8 : // as published by the Free Software Foundation; either version 2
9 : // of the License, or (at your option) any later version.
10 : //
11 : // This program is distributed in the hope that it will be useful,
12 : // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : // GNU General Public License for more details.
15 : //
16 : // You should have received a copy of the GNU General Public License
17 : // along with this program; if not, write to the Free Software
18 : // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19 : //
20 : //==============================================================================
21 :
22 : #include <stdio.h>
23 : #include <iostream>
24 :
25 : #include "src/cpp/prod/tool/DEVELOPMENT.h"
26 :
27 : #include "src/cpp/prod/tool/Assert.h"
28 : #include "src/cpp/prod/tool/String.h"
29 :
30 : #include "src/cpp/dev/idlc/symbol.h"
31 : #include "src/cpp/dev/idlc/scope.h"
32 : #include "src/cpp/dev/idlc/sym_tab.h"
33 : #include "src/cpp/dev/idlc/context.h"
34 :
35 63 : SymbolTable::SymbolTable()
36 63 : : SymbolContainer(NULL), _current(NULL), _prefix()
37 : {
38 0 : }
39 :
40 63 : SymbolTable::~SymbolTable()
41 : {
42 63 : }
43 :
44 12845 : void SymbolTable::addSymbol(Symbol *s)
45 : {
46 12845 : String fullName ;
47 :
48 : ASSERT(s != NULL) ;
49 :
50 12845 : s->SetPrefix(_prefix) ;
51 :
52 12845 : if (_current == NULL)
53 : {
54 114 : this->addLocalSymbol(s) ;
55 114 : fullName = "" ;
56 : }
57 : else
58 : {
59 12731 : _current->addLocalSymbol(s) ;
60 12731 : fullName = _current->GetFullyQualifiedName() ;
61 12731 : fullName += "::" ;
62 : }
63 :
64 12845 : fullName += s->GetName() ;
65 12845 : s->SetFullyQualifiedName(fullName) ;
66 : }
67 :
68 474 : void SymbolTable::relocateTail(Symbol *s)
69 : {
70 : ASSERT(s != NULL) ;
71 :
72 474 : if (_current == NULL)
73 : {
74 1 : this->relocateLocalTail(s) ;
75 : }
76 : else
77 : {
78 473 : _current->relocateLocalTail(s) ;
79 : }
80 : }
81 :
82 0 : Symbol *SymbolTable::findGlobalSymbol(const Scope& scope)
83 : {
84 0 : return find(scope) ;
85 : }
86 :
87 864 : Symbol *SymbolTable::findLocalSymbol(const String& name)
88 : {
89 : Symbol *s = NULL ;
90 :
91 864 : if (_current != NULL)
92 : {
93 861 : s = _current->findLocalSymbol(name) ;
94 : }
95 : else
96 : {
97 3 : s = SymbolContainer::findLocalSymbol(name) ;
98 : }
99 :
100 : return s ;
101 : }
102 :
103 9356 : Symbol *SymbolTable::findLocalSymbol(const Scope& scope)
104 : {
105 9356 : const String *name = scope.GetFirstName() ;
106 :
107 : ASSERT(name != NULL) ;
108 9356 : Context *search = _current ;
109 : Symbol *s = NULL ;
110 :
111 15815 : while (search != NULL)
112 : {
113 14853 : s = search->findLocalSymbol(*name) ;
114 14853 : if (s != NULL)
115 : {
116 8394 : if (scope.GetNameCount() == 1)
117 : {
118 : // The symbol is just "identifier",
119 : // and it is defined in a locally visible context.
120 :
121 : return s ;
122 : }
123 : else
124 : {
125 7 : return search->find(scope) ;
126 : }
127 : }
128 : else
129 : {
130 6459 : search = search->GetParent() ;
131 : }
132 : }
133 :
134 962 : s = SymbolContainer::findLocalSymbol(*name) ;
135 962 : if (s != NULL)
136 : {
137 483 : return find(scope) ;
138 : }
139 :
140 : return NULL ;
141 : }
142 :
143 9356 : Symbol *SymbolTable::findSymbol(const Scope& scope)
144 : {
145 : Symbol *result = NULL ;
146 :
147 9356 : if (scope.IsGlobal())
148 : {
149 0 : result = findGlobalSymbol(scope) ;
150 : }
151 : else
152 : {
153 9356 : result = findLocalSymbol(scope) ;
154 : }
155 :
156 : return result ;
157 : }
158 :
159 3734 : void SymbolTable::openContext(const String& name)
160 : {
161 : Context *sub = NULL ;
162 :
163 3734 : if (_current == NULL)
164 : {
165 113 : sub = new Context(name, NULL) ;
166 113 : this->addLocalContext(sub) ;
167 : }
168 : else
169 : {
170 3621 : sub = new Context(name, _current) ;
171 3621 : _current->addLocalContext(sub) ;
172 : }
173 :
174 3734 : _current = sub ;
175 : }
176 :
177 3732 : void SymbolTable::closeContext(void)
178 : {
179 : ASSERT(_current != NULL) ;
180 :
181 3732 : _current = _current->GetParent() ;
182 : }
183 :
184 252 : void SymbolTable::SetPrefix(const String& prefix)
185 : {
186 252 : _prefix = prefix ;
187 : }
188 :
189 0 : const String& SymbolTable::GetPrefix(void) const
190 : {
191 : return _prefix ;
192 : }
193 :
194 15 : void SymbolTable::print(std::ostream& str) const
195 : {
196 15 : String tab(" ") ;
197 :
198 15 : str << "Symbol Table (begin)" << std::endl ;
199 :
200 15 : SymbolContainer::print(str, tab) ;
201 :
202 30 : str << "Symbol Table (end)" << std::endl ;
203 78 : }
204 63 :
|