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

           if ((index > 0)&&(index < macrotab[cmdidx].str_count))

             goto macrogets;

           goto begin;

         }

       }

     if ((index > 0)&&(index < macrotab[cmdidx].str_count))

          goto macrogets;

     goto begin;

   }

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

   {

     if (!seg_open_flag)

     {

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

       exit(0);

     }

     /* Если встретили директиву else,то меняем значение флага

     на противоположное  */

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

     flag=!flag;

     if ((index > 0)&&(index < macrotab[cmdidx].str_count))

        goto macrogets;

     goto begin;

   }

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

   {

     if (!seg_open_flag)

     {

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

       exit(0);

     }

     /* Устанавливаем флаг на компиляцию */

     flag=0;

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

     if ((index > 0)&&(index < macrotab[cmdidx].str_count))

        goto macrogets;

     goto begin;

   }

   /* End if compilation */

     if (0>(opcode=findstr(mnemonics,lexbuf)))

       {

         parsep=parse(lexbuf,parsep);

         if (0>(op1num=findstr(directories,lexbuf)))

         {

         printf("\nline %d",number);

           printf(":Wrong mnemonic");

           exit(0);

       }

       else

         {

         if (flag)

         {

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

           goto ifgets;

         }

           switch (op1num)

         {

              case DIR_SEG:

            seg_open_flag=1;

            offs=0;

            Seg_Begin=offs;

            fputs(cmdbuf,F3);

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

            cmdbuf[0]=0;

            break;

          case DIR_ENDS:

            if (!seg_open_flag)

            {

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

              exit(0);

            }

              seg_open_flag=0;

              fprintf(F3,cmdbuf);

              fprintf(F1,"\t%10i %6.4X              \t%s",number,offs,cmdbuf);

                  Seg_End=offs;

                  parsep=parse(segtab[i].name,cmdbuf);

                  segtab[i].length=Seg_End-Seg_Begin;

                  i++;

              segtab[i].name[0]=0;

              break;

              default:

              if (!seg_open_flag)

              {

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

                exit(0);

              }

              fprintf(F3,cmdbuf);

              parsep=parse(lexbuf,parsep);

              if (strtoi(lexbuf,&n))

              {

                printf("\nLine%d",number);

                printf(":Bad number");

                exit(0);

              }

              if (op1num==DIR_DB)

                fprintf(F1,"\t%10i %6.4X %3.2X    \t%-s ",number,offs,n,cmdbuf);

              if (op1num==DIR_DW)

                fprintf(F1,"\t%10i %6.4X %5.4X    \t%-s ",number,offs,n,cmdbuf);

              parsep=cmdbuf;

              parsep=parse(symtab[j].mnem,parsep);

              strcpy(symtab[j].type, sym[op1num]);

              strcpy(symtab[j].atrib,seg_registr[i]);

              symtab[j].ef_adr=offs;

                    offs=offs+op1num;

                j++;

              break;

         }

         goto begin;

       }

       }

     if (!operandcount[opcode])

     {

      if (seg_open_flag)

      {

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

        exit(0);

      }

        fprintf(F2,cmdbuf);

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

        goto runlist;

     }

     if (!seg_open_flag)

     {

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

                exit(0);

               }

           parsep=parse(lexbuf,parsep);