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

📄 symbol.cpp

📁 扩展后的mini-pl0语法编译器
💻 CPP
字号:
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <iostream.h>
#include "symbol.h"

symbol::symbol()
{
	m_next = NULL;
	m_name = NULL;
	for(int i=0;i<30;i++)
	{
		m_typeInfo[i] = NULL;
	}
	m_checkvar= false;
}

symbol::~symbol()
{
	if(m_name != NULL)
		delete []m_name;
	if(m_type == DRecord)
	{
		for(int i=0;i<30;i++)
		{
			if(m_typeInfo[i])
				delete m_typeInfo[i];//与record有关
			m_typeInfo[i] = NULL;
		}
	}
	else
	{
		for(int i=0;i<30;i++)
		{
			m_typeInfo[i] = NULL;
		}
	}
}

symbol* symbol::create(const char* name,symbol** psymbol)
//过程名初始化
{
	assert(name != NULL);
	int length = strlen(name);
	m_name = new char[length + 1];
	strcpy(m_name, name);

	int i,index;
	//查找到第一个不为空的下标
	for(index=29;index>=0;index--)
	{
		if(psymbol[index])
			break;
	}

	int len=0,addlen;
	for(i = index;i>=0;i--)	//参数信息
	{
		m_typeInfo[i] = psymbol[i];
		//确定当前变量的长度
		if(psymbol[i]->m_checkparam)	//var型
			addlen=1;	
		else
			addlen=psymbol[i]->m_length;
		len=len-addlen;
		m_typeInfo[i]->m_value=len;		//写入偏移量
	}	
	m_type = CProce;					//当前节点的类型
	m_length = 0;						//该数据的长度为0(不是变量,也不是新类型)
	return this;						//返回当前节点
}

symbol* symbol::create(const char* name,IdType type)
//普通类型,int和bool型
{
	assert(name != NULL);
	int length = strlen(name);
	m_name = new char[length + 1];
	strcpy(m_name, name);
	m_type = type;
	m_length = 1;
	return this;
}

symbol* symbol::create(const char* name, const int start, const int end,IdType type, symbol* psymbol)
//array的新类型名,name为新类型名,start为起点,end为结尾下标,
//type为此数组中数据的类型, psymbol存储当type是新类型的有关信息,如果是普通类型,则为空
{
	assert(name != NULL);
	int length = strlen(name);
	m_name = new char[length + 1];
	strcpy(m_name, name);
	arraystart = start;
	arrayend = end;
	m_type = DArray;		//标注数组新类型的名字节点
	arrayType = type;		//标注是什么类型的数组(初始数组为int或bool)
	m_typeInfo[0] = psymbol;
	if(psymbol)				//不是普通数组
		m_length = (end - start +1) * psymbol->m_length;//当前name类型的长度
	else
		m_length = end - start +1;
	return this;
}

symbol* symbol::create(const char* name,int length)
//record的新类型名
{
	assert(name != NULL);
	int l = strlen(name);
	m_name = new char[l + 1];
	strcpy(m_name, name);
	m_type = DRecord;
	m_length = length;
	return this;
}

symbol* symbol::create(const char* name, IdType type, symbol* psymbol)
//插入的类型为新类型的变量
{
	//变量名的插入
	if((type == VArray && psymbol->m_type == DArray) 
		|| (type == VRecord && psymbol->m_type == DRecord) )
	{
		assert(name != NULL);
		int length = strlen(name);
		m_name = new char[length + 1];
		strcpy(m_name, name);
		m_type = type;		
		m_typeInfo[0] = psymbol;
		m_length = psymbol->m_length;
		return this;
	}
	else
	{
		cout<<"不是新类型。"<<endl;
		return NULL;
	}
}

//插入过程的参数
symbol* symbol::create(const char* name, IdType type, int length, symbol* psymbol, bool checkparam)
{
	assert(name != NULL);
	int len = strlen(name);
	m_name = new char[len + 1];
	strcpy(m_name, name);
	m_type = type;
	m_length = length;
	m_typeInfo[0] = psymbol;
	m_checkparam = checkparam;	//表明是否是实参
	m_checkvar = true;			//表明示参数
	return this;
}

//返回值
int symbol::GetValue()
{
	return m_value;
}

//设置值
void symbol::SetSimpleValue(int value)
{
	m_value = value;
}

/*********************************************************/
//symboltable类的构造函数
symboltable::symboltable(int lever, symboltable* parent, symboltable* sibling)
{
	for(int i = 0; i < BUCKET_SIZE; i++)
	{
		m_bucket[i] = NULL;
	}
	m_lever = lever;
	m_procesymbol = NULL;
	m_childtable = NULL;
	m_parenttable = parent;
	m_siblingtable = sibling; 
	for(i = 0; i < 30; i++)
	{
		symbolList[i] = NULL;
	}
	m_listindex = 0;
}

//析构函数
symboltable::~symboltable()
{
	for (int i = 0; i < BUCKET_SIZE; i++)
	{
		symbol* p= m_bucket[i];
		while(p != NULL)
		{
			symbol* next = p->m_next;
			delete p;
			p = next;
		}
	}
	delete m_procesymbol;
	m_procesymbol = NULL;
}

//散列函数
int symboltable::hash(const char* name) const
{
	assert(name != NULL);
	int index = 0;
	while (*name != '\0')
	{
		index = index << 1 ^ *name++;
	}
	index %= BUCKET_SIZE;
	if (index < 0)
	{
		index = -index;
	}
	return index;
}

symbol* symboltable::install(const char* name, symbol** psymbol,IdType type)
//插入过程名或插入record的新类型名
{
	if(type == CProce) //插入过程名
	{
		symbol* p;
		p = new symbol();
		m_procesymbol = p->create(name,psymbol);
		return p;
	}
	else	//插入record的新类型名
	{
		assert(name != NULL);
		int index = hash(name);
		symbol* p;
		for (p = m_bucket[index]; p != NULL; p = p->m_next) {
			if (strcmp(p->m_name, name) == 0) {
				return NULL;	//名字已经存在,则不能再插入
			}
		}
		p = new symbol();
		p->create(name,0);
		p->m_next = m_bucket[index];
		m_bucket[index] = p;
		int length = 0;
		for(int i = 0; i<30 ; i++)
		{
			p->m_typeInfo[i]=psymbol[i];
			if(psymbol[i])
			{
				p->m_typeInfo[i]->m_value=length;
				length += psymbol[i]->m_length;
			}		
		}
		p->m_length = length;
		return p;
	}
}

symbol* symboltable::install(const char* name,IdType type)
//插入int和bool型变量
{
	assert(name != NULL);
	int index = hash(name);
	symbol* p;
	for (p = m_bucket[index]; p != NULL; p = p->m_next) {
		if (strcmp(p->m_name, name) == 0) {
			return NULL;
		}
	}
	p = new symbol();
	p->create(name,type);
	p->m_next = m_bucket[index];
	m_bucket[index] = p;
	return p;
}

symbol* symboltable::install(const char* name,const int start, const int end ,IdType type, symbol* psymbol)
//插入array的新类型名
{
	assert(name != NULL);
	int index = hash(name);
	symbol* p;
	for (p = m_bucket[index]; p != NULL; p = p->m_next) {
		if (strcmp(p->m_name, name) == 0 && p->m_type != CProce) {
			return NULL;
		}
	}
	p = new symbol();
	//psymbol为数组类型(新类型)的节点指针,不是新类型,则为NULL
	p->create(name,start,end,type,psymbol);
	p->m_next = m_bucket[index];
	m_bucket[index] = p;
	return p;
}
//插入新类型的变量
//变量名name,新类型名为nametype
symbol* symboltable::install(const char* name, IdType type, symbol* q)
{
	assert(name != NULL);
	int index = hash(name);
	symbol* p;
	for (p = m_bucket[index]; p != NULL; p = p->m_next) {
		if (strcmp(p->m_name, name) == 0 ) {
			return NULL;
		}
	}
	p = new symbol();
	p->create(name,type,q);
	p->m_next = m_bucket[index];
	m_bucket[index] = p;
	return p;
}

symbol* symboltable::install(const char* name,IdType type, int length, symbol* psymbol, bool checkparam)
//插入
{
	assert(name != NULL);
	int index = hash(name);
	symbol* p;
	for (p = m_bucket[index]; p != NULL; p = p->m_next) {
		if (strcmp(p->m_name, name) == 0 && p->m_type != CProce) {
			return NULL;
		}
	}
	p = new symbol();
	if(type==DArray)
		type=VArray;
	if(type==DRecord)
		type=VRecord;
	p->create(name,type,length,psymbol,checkparam);
	p->m_next = m_bucket[index];
	m_bucket[index] = p;
	return p;
}

symboltable* symboltable::search(char* name)
//查找变量
{
	assert(name != NULL);
	int index = hash(name);
	symbol* p;
	for (p = m_bucket[index]; p != NULL; p = p->m_next) 
	{
		if (strcmp(p->m_name, name) == 0) 
		{
			m_tempsymbol = p;
			return this;
		}
	}
	symboltable* outLook = NULL; 
	if(m_parenttable)
	{
		outLook= m_parenttable->search(name);
		if(outLook)
		{
			m_tempsymbol = m_parenttable->m_tempsymbol;
		}
		else
			m_tempsymbol = NULL;
	}
	return outLook;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -