/* 项处理 */
  int term(bool* fsys,int* ptx,int lev) /* 参数意义见block和enter函数 */
  {
   enum symbol mulop; /* 用于保存乘除法符号 */
   bool nxtlev[symnum];

   memcpy(nxtlev,fsys,sizeof(bool)*symnum);
   nxtlev[times]=true;
   nxtlev[slash]=true;
   factordo(nxtlev,ptx,lev); /* 处理因子 */
   while(sym==times||sym==slash)
   {
    mulop=sym;
    getsymdo;
    factordo(nxtlev,ptx,lev);
    if(mulop==times)
    {
     gendo(opr,0,4); /* 生成乘法指令 */
    }
    else
    {
     gendo(opr,0,5); /* 生成除法指令 */
    }
   }
   return 0;
  }

   /* 因子处理 */
   int factor(bool* fsys,int* ptx,int lev) /* 参数意义见block和enter函数 */
   {
    int i;
    bool nxtlev[symnum];
    testdo(facbegsys,fsys,24); /* 检测因子的开始符号 */
    while(inset(sym,facbegsys)) /* 循环直到不是因子开始符号 */
    {
     if(sym==ident) /* 因子为常量或变量 */
     {
      i=postion(id,*ptx); /* 查找名字 */
      if(i==0)error(11); /* 名字未声明 */
      else
      {
       switch(table[i].kind)
       {
    case constant: /* 名字为常量 */
        gendo(lit,0,table[i].val); /* 直接把常量的值入栈 */
        break;
    case variable: /* 名字为变量 */
        gendo(lod,lev-table[i].level,table[i].adr); /* 找到变量地址并将其值入栈 */
        break;
    case procedur: /* 名字为过程 */
        error(21); /* 不能为过程 */
        break;
       }
     }
     getsymdo;
    }
    else
    {
     if(sym==number) /* 因子为数 */
     {
      if(num>amax)
      {
       error(31);
       num=0;
      }
      gendo(lit,0,num);
      getsymdo;
     }
     else
     {
      if(sym==lparen) /* 因子为表达式 */
      {
       getsymdo;
       memcpy(nxtlev,fsys,sizeof(bool)*symnum);
       nxtlev[rparen]=true;
       expressiondo(nxtlev,ptx,lev);
       if(sym==rparen)
       {
        getsymdo;
       }
       else error(22); /* 缺少右括号 */
      }
      test(fsys,facbegsys,23); /* 因子后有非法符号 */
     }
    }
   }
   return 0;
  }

  /* 通过过程活动记录基址求上l层过程的基址活动记录 */
  int base(int l,int* s,int b)
  {
   int b1;
   b1=b;
   while(l>0)
   {
    b1=s[b1];
    l--;
   }
   return b1;
  }