Розробка програми-препроцесора, що виконує розбір тексту (Звіт з лабораторної роботи № 8), страница 3

       }

     my_label:

     while(OP_ENDIF!=(opcode=findstr(mnemonics,lexbuf)))

     {

       fgets(cmdbuf,MAXSTR,F);

       strupcase(cmdbuf);

       parsep = cmdbuf;

       parsep=parse(lexbuf,parsep);

       if(OP_ELSE==(opcode=findstr(mnemonics,lexbuf)))

       {

         my_flag=!my_flag;

         goto my_label;

       }else

       if(OP_ENDIF==(opcode=findstr(mnemonics,lexbuf))) goto my_label;else

       if(my_flag) fputs(cmdbuf,F3);

     }

     goto begin;

   }

//‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑

//────────────────────────────────────────────────────────────────────────────

     if (parsetyp==PT_LABEL)

     {

      strcpy(labeltab[k].mnem,lexbuf);

      strcpy(labeltab[k].type,sym[0]);

      strcpy(labeltab[k].atrib,seg_registr[i]);

      labeltab[k].ef_adr=offs;

      k++;

      if (strconsist("\n",parsep[0]))

      {

        fprintf(F1,"\t%10d %20s ",number,cmdbuf);

        goto begin;

      }

      goto restart;

     }

     /* Обработка вызова макроопределения */

     if (0 <= (opcode=find_macro(lexbuf)))

     {

      if (!seg_open_flag)

      {

        printf("\nline %d:Not open segment",number);

        exit(0);

      }

      cmdidx=opcode;

      fprintf(F1,"\t%10i               \t%-s",number,cmdbuf);

      macrotab[cmdidx].fact_param_count=0;

      /* Подсчет количества параметров при вызове*/

      while(!strconsist("\n",parsep[0]))

      {

        parsep=parse(lexbuf,parsep);

        if (lexbuf[0]!=',')

        {

          strcpy (macrotab[cmdidx].fact_param[macrotab[cmdidx].fact_param_count].name,lexbuf);

          macrotab[cmdidx].fact_param_count++;

        }

      }

      /* Если количество параметров при вызове не равно  количеству

               формальных параметров , то ошибка  */

      if ( macrotab[cmdidx].fact_param_count != macrotab[cmdidx].param_count)

      {

        printf("\n%i:Wrong call macros %s",source_number,macrotab[opcode].name);

        exit(0);

        }

      cmdbuf[0]=0;

      index=0;

      /* Подстановка фактических параметров вместо формальных

      и формирование тела макроса */

      macrogets:

      while (index < macrotab[cmdidx].str_count)

      {

        number++;

        fprintf(F1,"");

        parsep=macrotab[cmdidx].param[index].buf;

        while (!strconsist("\n",parsep[0]))

        {

          parsep=parse(lexbuf,parsep);

          if (0 <= (op1num = find_parametr(lexbuf)))

          {

             lexbuf[0]=0;

             strcpy(lexbuf,macrotab[cmdidx].fact_param[op1num].name );

          }

          if (lexbuf[0]!=',')

            strcat(macrotab[cmdidx].fact_param[index].buf," " );

          strcat(macrotab[cmdidx].fact_param[index].buf,lexbuf);

            lexbuf[0]=0;

         }

        strcat(macrotab[cmdidx].fact_param[index].buf,"\n");

        strcpy(cmdbuf,macrotab[cmdidx].fact_param[index].buf);

        strupcase(cmdbuf);

          parsep=cmdbuf;

        index++;

        goto restart;

        }

         goto begin;

   }

   /*Условная компиляция  */

   if (OP_IFB==(opcode=findstr(mnemonics,lexbuf)))

   {

     if (!seg_open_flag)

     {

       printf("\nline %d:Not open segment",number);

       exit(0);

     }

     fprintf(F1,"\t%10i              \t%-s",number,cmdbuf);

     parsep=parse(lexbuf,parsep);

     if (lexbuf[0]!='<')

     {

        printf("line %i:Must be '<'",source_number);

        exit(0);

     }

     /* Проверка на наличие аргумента */

     parsep=parse(lexbuf,parsep);

     if (lexbuf[0]!='>')

       if (parsetyp==PT_WORD)

       {

         ifgets:

         flag=1;

         /*Если он есть,то флаг компиляции устанавливаем в 1,

         тоесть не компилировать  */

         while (OP_ENDIF!=(opcode=findstr(mnemonics,lexbuf)))

         {

           parsep=parse(lexbuf,parsep);

           /* Откуда брать строку (с исходного файла или с

           тела макроопределения )*/