www.pudn.com > Micro.rar > SymbolTable.cpp


#include "StdAfx.h" 
#include ".\symboltable.h" 
 
CSymbolTable::CSymbolTable(void) 
{ 
} 
 
CSymbolTable::~CSymbolTable(void) 
{ 
} 
 
//////  Semantic 
extern Level curLevel; 
 
//////////////////////////////////////////////////////// 
SymbolTable  g_table; // 全局作用域符号表 
SymbolTable  l_table; // 局部作用域符号表 
 
 
void  init_global_symboltable() { 
	g_table.freepointer = 0; 
	for(int i = 0; i < MAX_SYMBOL; i++) { 
		memset(g_table.smb[i].text, 0, WORD_LEN); 
	} 
} 
void  init_local_symboltable() { 
	l_table.freepointer = 0; 
	for(int i = 0; i < MAX_SYMBOL; i++) { 
		memset(l_table.smb[i].text, 0, WORD_LEN); 
	} 
} 
Symbol * lookup(cstr s) { 
	// [0] stores "fill first unit" 
	if( curLevel == LOCAL ) { 
		for(int i = 0; i < l_table.freepointer; i++) { 
			if( ID == l_table.smb[i].type ) { 
				if( strcmp(s, l_table.smb[i].text)==0 ) { 
					return & l_table.smb[i]; 
				} 
			} 
		} 
	} 
	for(int i = 0; i < g_table.freepointer; i++) { 
		if( ID == g_table.smb[i].type ) { 
			if( strcmp(s, g_table.smb[i].text)==0 ) { 
				return & g_table.smb[i]; 
			} 
		} 
	} 
	return  0; 
} 
Symbol * lookup(int  v) { 
	if( curLevel == LOCAL ) { 
		for(int i = 0; i < l_table.freepointer; i++) { 
			if( INTLITERAL == l_table.smb[i].type ) { 
				if( v == l_table.smb[i].int_val ) { 
					return & l_table.smb[i]; 
				} 
			} 
		} 
	} 
	for(int i = 0; i < g_table.freepointer; i++) { 
		if( INTLITERAL == g_table.smb[i].type ) { 
			if( v == g_table.smb[i].int_val ) { 
				return & g_table.smb[i]; 
			} 
		} 
	} 
	return  0; 
} 
// add cstr into the symbol table 
void enter(cstr s, token type) { 
	if( LOCAL == curLevel ) { 
		if( l_table.freepointer < MAX_SYMBOL ) { 
			l_table.smb[l_table.freepointer].type = type; 
			strcpy(l_table.smb[l_table.freepointer].text, s); 
			l_table.freepointer++; 
		} else { 
			error("Exceed the max symbol table size"); 
		} 
	} 
	if( GLOBAL == curLevel ) { 
		if( g_table.freepointer < MAX_SYMBOL ) { 
			g_table.smb[g_table.freepointer].type = type; 
			strcpy(g_table.smb[g_table.freepointer].text, s); 
			g_table.freepointer++; 
		} else { 
			error("Exceed the max symbol table size"); 
		} 
	} 
} 
// add int value's text into the symbol table 
void	enter(int  v) { 
	if( LOCAL == curLevel ) { 
		if( l_table.freepointer < MAX_SYMBOL ) { 
			l_table.smb[l_table.freepointer].type = INTLITERAL; 
			l_table.smb[l_table.freepointer].int_val = v; 
			sprintf(l_table.smb[l_table.freepointer].text,"%d", v); 
			l_table.freepointer++; 
		} else { 
			error("Exceed the max symbol table size"); 
		} 
	} 
	if( GLOBAL == curLevel ) { 
		if( g_table.freepointer < MAX_SYMBOL ) { 
			g_table.smb[g_table.freepointer].type = INTLITERAL; 
			g_table.smb[g_table.freepointer].int_val = v; 
			sprintf(g_table.smb[g_table.freepointer].text,"%d", v); 
			g_table.freepointer++; 
		} else { 
			error("Exceed the max symbol table size"); 
		} 
	} 
} 
char * extract(expr_rec & s) { 
	Symbol * smb; 
	switch(s.kind) { 
	case IDEXPR: 
		return s.name; 
	case LITERALEXPR: 
		smb = lookup(s.val); 
		if( NULL != smb )  
			return smb->text; 
		error("no intliterval in the symbol table"); 
	case TEMPEXPR: 
		return s.name; 
	case CALLEXPR: 
		return s.name; 
	default: 
		char buf[100]; 
		sprintf(buf, "[symboltable] extract(..) Unexpected expr_rec type : %d\n", s.kind); 
		error(&buf[0]); 
		break; 
	} 
	return 0; 
} 
 
char * extract(op_rec  & op) { 
	switch(op.operType) { 
	case PLUS: 
		return "Add"; 
		break; 
	case MINUS: 
		return "Sub"; 
		break; 
	case MUL: 
		return "Mul"; 
		break; 
	case DIV: 
		return "Div"; 
		break; 
	default: 
		error("Unsupported op kind"); 
		break; 
	} 
	return 0; 
}