📄 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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -