/* 生成一项名字表 */
void enter(enum object k, /* 名字种类const,var or procedure */
int* ptx, /* 名字表尾指针的指针,为了可以改变名字表尾指针的值,以后所有的ptx都是这样 */
int lev, /* 名字所在的层次,,以后所有的lev都是这样 */
int* pdx /* dx为当前应分配的变量的相对地址,分配后要增加1,所以使用指针,以后所有的pdx都是这样 */
)
{
(*ptx)++;
strcpy(table[(*ptx)].name,id); /* 全局变量id中已存有当前名字的名字 */
table[(*ptx)].kind=k;
switch(k)
{
case constant: /* 常量名字 */
if(num>amax)
{
error(31); /* 数值越界 */
num=0;
}
table[(*ptx)].val=num;
break;
case variable: /* 变量名字 */
table[(*ptx)].level=lev;
table[(*ptx)].adr=(*pdx);
(*pdx)++;
break;
case procedur: /* 过程名字 */
table[(*ptx)].level=lev;
break;
}
}
/* 查找名字的位置 */
/* 找到则返回在名字表中的位置,否则返回0 */
int postion(char* idt, /* 要查找的名字 */
int tx /* 当前名字表尾指针 */
)
{
int i;
strcpy(table[0].name,idt);
i=tx;
while(strcmp(table[i].name,idt)!=0)i--;
return i;
}
/* 常量声明处理 */
int constdeclaration(int* ptx,
int lev,
int* pdx)
{
if(sym==ident)
{
getsymdo;
if(sym==eql||sym==becomes)
{
if(sym==becomes)error(1); /* 把=写成了:= */
getsymdo;
if(sym==number)
{
enter(constant,ptx,lev,pdx);
getsymdo;
}
else error(2); /* 常量说明=后应是数字 */
}
else error(3); /* 常量说明标识后应是= */
}
else error(4); /* const后应是标识 */
return 0;
}
/* 变量声明处理 */
int vardeclaration(int* ptx,int lev,int* pdx)
{
if(sym==ident)
{
enter(variable,ptx,lev,pdx); /* 填写名字表 */
getsymdo;
}
else error(4); /* var后应是标识 */
return 0;
}
|