📄 tables.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 + -