📄 declaration.cpp
字号:
void ConstDeclaration() //常量说明
{
char *const_name;
int neg_value=0;
NametabItem *find;
assert(CurSymbol->Type==IDENT);
const_name=CurSymbol->Value.lpValue;
if(FindSameLevelNametabItem(const_name,CONSTANT) || FindSameLevelNametabItem(const_name,VARIABLE))
{
Error(15);
return;
}
GotoNextSymbol();
if(CurSymbol->Type!=EQL)
Error(16);
else
GotoNextSymbol();
if(CurSymbol->Type==CHARCON)
{
LastName=AddNametabItem(const_name,CONSTANT,TCHAR,1,CurSymbol->Value.iValue,NULL,LastName);
GotoNextSymbol();
return;
}
if(CurSymbol->Type==PLUS ||CurSymbol->Type==MINUS)
{
neg_value=(CurSymbol->Type==MINUS);
GotoNextSymbol();
}
if(CurSymbol->Type!=IDENT && CurSymbol->Type!=INTCON)
Error(17);
else
if(CurSymbol->Type==INTCON)
LastName=AddNametabItem(const_name,CONSTANT,TINT,1,CurSymbol->Value.iValue,NULL,LastName);
else
{
find=FindLowLevelNametabItem(CurSymbol->Value.lpValue,CONSTANT);
if(find)
LastName=AddNametabItem(const_name,CONSTANT,find->Type,1,find->Value,NULL,LastName);
else
Error(17);
}
GotoNextSymbol();
}
void VarDeclaration() //变量说明
{
char *var_name[MAXVARNUMBER];
char type_name[VARNAMESIZE];
int var_index=0;
assert(CurSymbol->Type==IDENT);
var_name[var_index++]=CurSymbol->Value.lpValue;
GotoNextSymbol();
while(CurSymbol->Type==COMMA)
{
GotoNextSymbol();
if(CurSymbol->Type!=IDENT)
Error(11);
var_name[var_index++]=CurSymbol->Value.lpValue;
GotoNextSymbol();
}
if(CurSymbol->Type!=COLON)
Error(12);
else
GotoNextSymbol();
if(CurSymbol->Type!=IDENT)
Error(13);
NametabItem *find_type;
strcpy(type_name,CurSymbol->Value.lpValue);
GotoNextSymbol();
find_type=FindLowLevelNametabItem(type_name,NTYPE);
if(find_type)
for(int i=0;i<var_index;i++)
{
if(!FindSameLevelNametabItem(var_name[i],VARIABLE) && !FindSameLevelNametabItem(var_name[i],CONSTANT))
LastName=AddNametabItem(var_name[i],VARIABLE,find_type->Type,1,find_type->Value,find_type->Ref,LastName);
else
Error(15);
}
else
Error(14);
}
void TypeDeclaration()
{
char *type_name;
NametabItem *find;
int low,high,size;
ArrayItem *last=NULL,*current;
assert(CurSymbol->Type==IDENT);
type_name=CurSymbol->Value.lpValue;
if(FindSameLevelNametabItem(type_name,NTYPE))
{
Error(15);
return;
}
GotoNextSymbol();
if(CurSymbol->Type!=EQL)
Error(16);
GotoNextSymbol();
if(CurSymbol->Type==IDENT)
{
find=FindLowLevelNametabItem(CurSymbol->Value.lpValue,NTYPE);
GotoNextSymbol();
if(find)
LastName=AddNametabItem(type_name,NTYPE,find->Type,1,find->Value,NULL,LastName);
else
Error(18);
return;
}
else if(CurSymbol->Type!=ARRAYSYM)
Error(18);
GotoNextSymbol();
if(CurSymbol->Type!=LBRACK)
Error(19);
do
{
GotoNextSymbol();
if(CurSymbol->Type!=INTCON)
Error(19);
low=CurSymbol->Value.iValue;
GotoNextSymbol();
if(CurSymbol->Type!=DPOINT)
Error(19);
GotoNextSymbol();
if(CurSymbol->Type!=INTCON)
Error(19);
high=CurSymbol->Value.iValue;
last=AddArrayItem(low,high,last);
GotoNextSymbol();
}while(CurSymbol->Type==COMMA);
if(CurSymbol->Type!=RBRACK)
Error(19);
GotoNextSymbol();
if(CurSymbol->Type!=OFSYM)
Error(20);
else
GotoNextSymbol();
if(CurSymbol->Type!=IDENT)
Error(14);
else
{
find=FindLowLevelNametabItem(CurSymbol->Value.lpValue,NTYPE);
GotoNextSymbol();
if(find)
{
for(size=1,current=last;current;current=current->Elref)
size*=current->Size ;
LastName=AddNametabItem(type_name,NTYPE,TARRAY,find->Type,size,last,LastName);
//这里借用normal字段填写type
}
else
Error(18);
return;
}
}
void ParaDeclaration()
{
int var_define;
char *var_name[MAXVARNUMBER];
char *type_name;
int var_index,i;
int first_var;
NametabItem *find;
do
{
var_index=0;
GotoNextSymbol();
if(CurSymbol->Type==VARSYM)
{
var_define=1;
GotoNextSymbol();
}
else
var_define=0;
first_var=1;
do
{
if(!first_var)
GotoNextSymbol();
if(CurSymbol->Type!=IDENT)
Error(11);
var_name[var_index++]=CurSymbol->Value.lpValue;
first_var=0;
GotoNextSymbol();
}
while(CurSymbol->Type==COMMA);
if(CurSymbol->Type!=COLON)
Error(12);
GotoNextSymbol();
if(CurSymbol->Type!=IDENT)
Error(13);
type_name=CurSymbol->Value.lpValue;
for(i=0;i<var_index;i++)
{
find=FindLowLevelNametabItem(type_name,NTYPE);
if(find)
LastName=AddNametabItem(var_name[i],VARIABLE,find->Type,var_define?-1:0,find->Value,find->Ref,LastName);
else
Error(14);
}
GotoNextSymbol();
}
while(CurSymbol->Type==SEMICOLON);
if(CurSymbol->Type!=RPAREN)
Error(22);
GotoNextSymbol();
}
void ProcedureDeclaration()
{
char *proc_name;
NametabItem *last_name;
ObjItem *proc_begin,*fill_back_var_size;
assert(CurSymbol->Type==PROCSYM);
GotoNextSymbol();
if(CurSymbol->Type!=IDENT)
Error(21);
proc_name=CurSymbol->Value.lpValue;
if(!FindSameLevelNametabItem(proc_name,PROCEDURE))
LastName=AddNametabItem(proc_name,PROCEDURE,NOTYPE,1,0,NULL,LastName);
else
Error(15);
last_name=LastName; //实际上是压栈,保护全局的LastName
LastName=NULL;
GotoNextSymbol();
EnterBlock();
if(CurSymbol->Type==LPAREN)
{ //参数表
ParaDeclaration();
}
LastName=NULL;
if(CurSymbol->Type!=SEMICOLON)
Error(6);
GotoNextSymbol();
last_name->Value=CurrentCode->LineNum; //回填转子地址
last_name->Ref=Display[DisplayLevel-1]; //回填过程内情变量
#ifdef _DEBUG
printf("\n;-----------------Procdure %s Begin------------------------\n",proc_name);
#endif
fill_back_var_size=GenerateCode(ENTP,DisplayLevel-1,0);
proc_begin=ProgramBlock();
fill_back_var_size->DestOp.iValue=Display[DisplayLevel-1]->PSize+Display[DisplayLevel-1]->VSize;
GenerateCode(RETP,0,0);
QuitBlock();
#ifdef _DEBUG
printf(";-----------------Procdure %s End--------------------------\n\n",proc_name);
#endif
LastName=last_name; //弹栈
if(CurSymbol->Type!=SEMICOLON)
Error(6);
GotoNextSymbol();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -