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

📄 tables.cpp

📁 PL语言到中间代码的编译程序
💻 CPP
字号:
#include "common.h"

NametabItem *NametabHead=NULL;
BlockItem *BlockHead=NULL,*BlockCurrent;
BlockItem *Display[MAXLEVELNUMBER];
ArrayItem *ArrayInfHead=NULL;
int DisplayLevel=0;

void InitNametab()
{
	char *new_string;
	NametabItem *last=NULL;

	new_string=(char *)(new char[10]);
	strcpy(new_string,"char");
	last=AddNametabItem(new_string,NTYPE,TCHAR,1,sizeof(char),NULL,last);

	new_string=(char *)(new char[10]);
	strcpy(new_string,"integer");
	last=AddNametabItem(new_string,NTYPE,TINT,1,sizeof(int),NULL,last);
	
	new_string=(char *)(new char[10]);
	strcpy(new_string,"boolean");
	last=AddNametabItem(new_string,NTYPE,TBOOL,1,sizeof(int),NULL,last);

	new_string=(char *)(new char[10]);
	strcpy(new_string,"false");
	last=AddNametabItem(new_string,CONSTANT,TBOOL,1,0,NULL,last);

	new_string=(char *)(new char[10]);
	strcpy(new_string,"true");
	last=AddNametabItem(new_string,CONSTANT,TBOOL,1,1,NULL,last);

	new_string=(char *)(new char[10]);
	strcpy(new_string,"read");
	last=AddNametabItem(new_string,PROCEDURE,NOTYPE,1,1,NULL,last);

	new_string=(char *)(new char[10]);
	strcpy(new_string,"write");
	last=AddNametabItem(new_string,PROCEDURE,NOTYPE,1,2,NULL,last);
}

NametabItem *AddNametabItem(char *Name,int Kind,int Type,int Normal,int Value,void *Ref,void *Link)
{
	static NametabItem *NametabCur;
	if(!NametabHead)
		NametabHead=NametabCur=new NametabItem;
	else
	{
		NametabCur->Next=new NametabItem;
		NametabCur=NametabCur->Next;
	}
	if(!NametabCur)
	{
		Error(7);
		exit(4);
	}
	NametabCur->Name=Name;
	NametabCur->Kind=Kind;
	if(Kind==VARIABLE)
	{
		if(Normal>0)
		{
			NametabCur->Value=BlockCurrent->VSize+BlockCurrent->PSize;
			Display[DisplayLevel-1]->VSize+=Value; 
		}
		else
		{
			NametabCur->Value=BlockCurrent->PSize;
			Display[DisplayLevel-1]->PSize+=Value; 
		}
	}
	else
		NametabCur->Value=Value;
	NametabCur->Type=Type;
	NametabCur->Level=DisplayLevel-1;
	NametabCur->Normal=Normal;
	if(Normal>0)
		Display[DisplayLevel-1]->LastVar=NametabCur; 
	else
		Display[DisplayLevel-1]->LastPar=NametabCur; 
	NametabCur->Ref=Ref;
	NametabCur->Link=(NametabItem *)Link;
	NametabCur->Next=NULL; 
	return NametabCur;
}

NametabItem *FindNametabItem(char *Name,int Kind)
{
	NametabItem *current;
	for(current=NametabHead;current;current=current->Next)
		if(!stricmp(current->Name,Name) && current->Kind==Kind)
			return current;
	return NULL;
}

NametabItem *FindLowLevelNametabItem(char *Name,int Kind)
{
	int level;
	NametabItem *find;
	for(level=DisplayLevel;level;level--)
	{
		for(find=Display[level-1]->LastPar;find;find=find->Link)
			if(find->Kind==Kind && !stricmp(find->Name,Name))
				return find;
		for(find=Display[level-1]->LastVar;find;find=find->Link)
			if(find->Kind==Kind && !stricmp(find->Name,Name))
				return find;
	}
	return NULL;
}

NametabItem *FindSameLevelNametabItem(char *Name,int Kind)
{
	int level;
	NametabItem *find;
	level=DisplayLevel;
	for(find=Display[level-1]->LastPar;find;find=find->Link)
		if(find->Kind==Kind && !stricmp(find->Name,Name))
			return find;
	for(find=Display[level-1]->LastVar;find;find=find->Link)
		if(find->Kind==Kind && !stricmp(find->Name,Name))
			return find;
	return NULL;
}

void ClearNametabItem()
{
	NametabItem *current,*need_del;
	for(current=NametabHead;current;)
	{
		need_del=current;
		current=current->Next;
		if(!need_del->Level)
			delete need_del->Name; 
		delete need_del;
	}
}

void EnterBlock()
{
	if(!BlockHead)
		BlockHead=BlockCurrent=new BlockItem;
	else
	{
		BlockCurrent->Next=new BlockItem;
		BlockCurrent=BlockCurrent->Next; 
	}
	if(!BlockCurrent)
	{
		Error(7);
		exit(4);
	}
	Display[DisplayLevel++]=BlockCurrent;
	BlockCurrent->Next=NULL; 
	BlockCurrent->LastPar=NULL;
	BlockCurrent->LastVar=NULL;
	BlockCurrent->PSize=0;
	BlockCurrent->VSize=0;
}

void QuitBlock()
{
	DisplayLevel--;
}

ArrayItem *AddArrayItem(int low,int high,ArrayItem *elref)
{
	static ArrayItem *Current;
	if(!ArrayInfHead)
		ArrayInfHead=Current=new ArrayItem;
	else
	{
		Current->Next=new ArrayItem;
		Current=Current->Next;
	}
	if(!Current)
	{
		Error(7);
		exit(4);
	}
	Current->Low=low;
	Current->High=high;
	Current->Size=high-low+1; 
	Current->Elref=elref; 
	Current->Next=NULL; 
	return Current;
}

void ClearArrayItem()
{
	ArrayItem *current,*need_del;
	for(current=ArrayInfHead;current;)
	{
		need_del=current;
		current=current->Next;
		delete need_del;
	}
}

⌨️ 快捷键说明

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