3 #include <iostream.h>
\r
4 #include "SymTable.h"
\r
6 int init_offset(type kind) {
\r
16 case HANDLERS_S : break;
\r
23 int update_offset(type kind) {
\r
34 case CONSTANT_S : break;
\r
41 void list::add_elem(entry* e) {
\r
43 list_elem* ThisElement;
\r
45 ThisElement = new list_elem(e);
\r
46 ThisElement->next = end_ptr;
\r
47 end_ptr = ThisElement;
\r
52 entry* list::find_virt(String id)
\r
54 list_elem* ThisElement;
\r
56 for( ThisElement = end_ptr;
\r
57 (ThisElement != NULL) && ( ThisElement->info_ptr->id != id);
\r
58 ThisElement = ThisElement->next
\r
62 return ThisElement->info_ptr;
\r
68 void spec_list::add(String id)
\r
71 end_ptr=new spec_elem(id,end_ptr);
\r
75 bool spec_list::present(String id) {
\r
80 while ( temp != NULL && temp->info != id )
\r
90 void pref_list::add_pref(entry* e,sharing sh)
\r
94 end_ptr = new pref_list_elem(e,sh,end_ptr);
\r
96 if ((temp=((c_class*)(e->rest))->my_symtab->formal_param_list) != NULL) {
\r
97 if (symtab->last->formal_param_list == NULL)
\r
98 symtab->last->formal_param_list=new list;
\r
99 symtab->last->formal_param_list->end_ptr=temp->end_ptr;
\r
105 entry::entry(String ii,type kk,int oo,spec ss,packet* pp)
\r
117 current_offset=OFFSET;
\r
118 if (symtab == NULL)
\r
119 end_ptr = begin_ptr
\r
120 = new entry(NO_IDENT,FATHER,NO_OFFSET,NORMAL,
\r
121 new f_father(NULL,level)
\r
124 end_ptr = begin_ptr
\r
125 = new entry(NO_IDENT,FATHER,NO_OFFSET,NORMAL,
\r
126 new f_father(symtab->last,level)
\r
129 virtual_list = NULL;
\r
130 begin_ptr->prev = NULL;
\r
131 close=taken=hidden = NULL;
\r
135 void node::close_unit()
\r
137 symtab->last=((f_father*)(begin_ptr->rest))->father_ptr;
\r
141 node* node::open_unit()
\r
145 temp = new node(level+1);
\r
147 ((c_class*)(symtab->last->end_ptr->rest))->my_symtab=temp;
\r
149 temp->current_offset=init_offset(end_ptr->kind);
\r
156 void node::add_spec(spec kind,String id)
\r
162 if (close==NULL) close=new spec_list;
\r
167 if (hidden==NULL) hidden=new spec_list;
\r
172 if (taken==NULL) taken=new spec_list;
\r
180 void node::add_virt(entry* v) {
\r
182 if (virtual_list == NULL) virtual_list=new list;
\r
183 virtual_list->add_elem(v);
\r
187 void node::add_form_param(entry* fp) {
\r
189 if (formal_param_list == NULL) formal_param_list=new list;
\r
190 formal_param_list->add_elem(fp);
\r
195 struct find_result* node::local_find(String id,visible vis) {
\r
203 while ( !stop && temp->kind != FATHER) {
\r
204 if (temp->id != id)
\r
207 switch (temp->visible)
\r
210 if (vis == NOT_HIDDEN)
\r
225 return new find_result(level,NULL);
\r
227 return new find_result(level,temp);
\r
230 struct find_result* symboltable::find_in_module(node* start,String id,bool dot=DOT,visible vis=ALL) {
\r
232 struct find_result* temp1;
\r
234 pref_list_elem* temp3;
\r
237 temp1=start->local_find(id,vis);
\r
238 if (temp1->found != NULL && !dot)
\r
240 else if (start->prefix != NULL) {
\r
242 temp3=start->prefix->end_ptr;
\r
243 while ((temp3 != NULL) && !stop) {
\r
244 temp1=((c_class*)(temp3->where->rest))->my_symtab->local_find(id,NOT_HIDDEN);
\r
245 if (temp1->found != NULL) stop = TRUE;
\r
248 if (temp3 != NULL && !dot) return temp1;
\r
251 return new find_result(temp1->level,NULL);
\r
256 struct find_result* symboltable::find(String id) {
\r
258 struct find_result* temp1;
\r
262 temp1=symtab->find_in_module(symtab->last,id,FALSE,ALL);
\r
263 if (temp1->found != NULL && temp1->found->id == id) return temp1;
\r
264 temp3=((f_father*)(symtab->last->begin_ptr->rest))->father_ptr;
\r
265 while (temp3 != NULL && temp1->level != MAIN_LEVEL ) {
\r
266 temp1=symtab->find_in_module(temp3,id,FALSE,NOT_HIDDEN);
\r
267 temp3=((f_father*)(temp3->begin_ptr->rest))->father_ptr;
\r
270 if (temp1->found != NULL && temp1->found->id == id)
\r
276 return new find_result(MAIN_LEVEL,NULL);
\r
280 entry* symboltable::inherit(String id,sharing sh=NOT_SHARED) {
\r
284 pref_list_elem* temp1;
\r
287 temp=symtab->find(id)->found;
\r
289 if (temp != NULL && ( temp->kind ==CLASS_S || temp->kind == PROCESS_S || temp->kind == COROUTINE_S) ) {
\r
291 if (last->prefix == NULL) last->prefix = new pref_list;
\r
293 if (((c_class*)(temp->rest))->prefix != NULL) {
\r
295 temp1=((c_class*)(temp->rest))->prefix->end_ptr;
\r
296 while (temp1 != NULL) {
\r
297 last->prefix->add_pref(temp1->where,temp1->shared);
\r
301 last->prefix->add_pref(temp,sh);
\r
311 entry* symboltable::insert(String id,type kind,packet* p) {
\r
317 if ( ((symtab->last->local_find(id,ALL))->found == NULL) )
\r
321 if (symtab->last->close != NULL)
\r
322 if (symtab->last->close->present(id) ) temp1=CLOSE;
\r
323 if (symtab->last->hidden != NULL)
\r
324 if (symtab->last->hidden->present(id) ) temp1=HIDDEN;
\r
325 temp=new entry(id,kind,symtab->last->current_offset,temp1,p);
\r
326 symtab->last->current_offset += update_offset(kind);
\r
327 temp->prev=symtab->last->end_ptr;
\r
328 symtab->last->end_ptr=temp;
\r
329 if (kind == VARIABLE_S && (((v_variable*)p)->type == POINTER)) {
\r
330 if (symtab->last->ref_var_list == NULL)
\r
331 symtab->last->ref_var_list=new list;
\r
332 symtab->last->ref_var_list->add_elem(temp);
\r