/* 生成一项名字表 */
  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;
  }