⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 symboltable.cpp

📁 现代编译原理C语言实现中的第二章的编译器实现。并在书中的基础上有所改变。包括词法语法分析及汇编代码生成。
💻 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 + -