/* 表达式处理 */
  int expression(bool* fsys,int* ptx,int lev) /* 参数意义见block和enter函数 */
  {
   enum symbol addop; /* 用于保存正负号 */
   bool nxtlev[symnum];

   if(sym==plus||sym==minus) /* 开头的正负号,此时当前表达式被看作一个正的或负的项 */
   {
    addop=sym; /* 保存开头的正负号 */
    getsymdo;
    memcpy(nxtlev,fsys,sizeof(bool)*symnum);
    nxtlev[plus]=true;
    nxtlev[minus]=true;
    termdo(nxtlev,ptx,lev); /* 处理项 */
    if(addop==minus)gendo(opr,0,1); /* 如果开头为负号生成取负指令 */
   }
   else /* 此时表达式被看作项的加减 */
   {
    memcpy(nxtlev,fsys,sizeof(bool)*symnum);
    nxtlev[plus]=true;
    nxtlev[minus]=true;
    termdo(nxtlev,ptx,lev); /* 处理项 */
   }
   while(sym==plus||sym==minus)
   {
    addop=sym;
    getsymdo;
    memcpy(nxtlev,fsys,sizeof(bool)*symnum);
    nxtlev[plus]=true;
    nxtlev[minus]=true;
    termdo(nxtlev,ptx,lev); /* 处理项 */
    if(addop==plus)
    {
     gendo(opr,0,2); /* 生成加法指令 */
    }
    else gendo(opr,0,3); /* 生成减法指令 */
   }
   return 0;
  }

  /* 条件处理 */
  int condition(bool* fsys,int* ptx,int lev) /* 参数意义见block和enter函数 */
  {
   enum symbol relop;
   bool nxtlev[symnum];
   if(sym==oddsym) /* 准备按照odd运算处理 */
   {
    getsymdo;
    expressiondo(fsys,ptx,lev);
    gendo(opr,0,6); /* 生成odd指令 */
   }
   else
   {
    /* 逻辑表达式处理 */
    memcpy(nxtlev,fsys,sizeof(bool)*symnum);
    nxtlev[eql]=true;nxtlev[neq]=true;
    nxtlev[lss]=true;nxtlev[leq]=true;
    nxtlev[gtr]=true;nxtlev[geq]=true;
    expressiondo(nxtlev,ptx,lev);
    if(sym!=eql&&sym!=neq&&sym!=lss&&sym!=leq&&sym!=gtr&&sym!=geq)error(20);
    else
    {
     relop=sym;
     getsymdo;
     expressiondo(fsys,ptx,lev);
     switch(relop)
     {
  case eql:
      gendo(opr,0,8);
      break;
  case neq:
      gendo(opr,0,9);
      break;
  case lss:
      gendo(opr,0,10);
      break;
  case geq:
      gendo(opr,0,11);
      break;
  case gtr:
      gendo(opr,0,12);
      break;
  case leq:
      gendo(opr,0,13);
      break;
     }
    }
   }
   return 0;
  }