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

Страницы работы

Содержание работы

Національний Технічний Університет

«Харківський Політехнічний Інститут»

Звіт

з лабораторної роботи № 8

з дисципліни «системного програмування»

Виконав:  студент

групи КІТ-14в     

Богачов О. С.      

Викладачі:           

Межерицький С. Г.

Харків-2006 р.

Препроцесор

Ціль роботи: розробити програму-препроцесор, який виконує розбір тексту .ASM файлу на рівні макросів та условної компіляції (формування ASM файлу).

Текст програми pre.cpp:

#include <conio.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define PT_EOST 0

#define PT_SIGN 1

#define PT_WORD 2

#define PT_LABEL 3

#define MAXSTR 64

#define DIR_SEG   0

#define DIR_DB    1

#define DIR_DW    2

#define DIR_ENDS  3

#define DIR_MACRO 0

#define OP_DEC   1

#define OP_ENDM  1

#define OP_IFB   10

#define OP_ELSE  11

#define OP_ENDIF 12

#define OP_IFNB  13

char *directories[] = {

     "SEGMENT",

     "DB",

     "DW",

     "ENDS",

} ;

char *registers[] = {

    "AX",

    "CX",

    "DX",

    "BX",

    "SP",

    "BP",

    "SI",

    "DI",

};

char *mnemonics[] = {

  "MOV","DEC","INC","ADD",

  "SUB","CMP","OR","XOR",

  "AND","END","IFB","ELSE",

  "ENDIF","IFNB"

};

struct seg_tab

{

  char name[MAXSTR];

  int length;

};

struct sym_tab

{

  char mnem[MAXSTR];

  char type[MAXSTR];

  char atrib[MAXSTR];

  int ef_adr;

};

struct label_tab

{

  char mnem[MAXSTR];

  char type[MAXSTR];

  char atrib[MAXSTR];

  int ef_adr;

};

struct formal_parameters

{

  char name[MAXSTR];

  char buf[MAXSTR];

};

struct fact_parameters

{

  char name[MAXSTR];

  char buf[MAXSTR];

};

struct macro_tab

{

   char name[MAXSTR];

   struct formal_parameters param[10];

   struct fact_parameters fact_param[10];

   int param_count;

   int fact_param_count;

   int str_count;

};

 struct seg_tab segtab[20];

 struct sym_tab symtab[20];

 struct label_tab labeltab[20];

 struct macro_tab macrotab[10];

char *mnem[]={"8B","4","4","03","2B","3D","OB","33","23"};

char cop1[]={'C','C','D','D','E','E','F','F'};

char cop2[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

int  operandcount[]={2,1,1,2,2,2,2,2,2,0};

char signs[] = "~!@#$%^&*()_)+|`\\=-,/<>?;':\"";

char signs1[] = "~!@#$%^&*()_)+|`\\=-,/<>?;'\"";

char *sym[]={"NEAR","BYTE","WORD","NEAR"};

char *macrodir[]={"MACRO","ENDM"}; /* Директивы препроцессора */

char *seg_registr[]={"DS:","CS:","SS:"};

char *prepr_dir[]={"INCLUDE","REPT"};     /* Директивы препроцессора*/

char separators[] = "\t \r\n";

char parsetyp = 0;

char lexbuf[MAXSTR];

char cmdbuf[MAXSTR];

char *parsep;

int idx=0;

int opcode,cmdidx;

int j=0;

int n,number=0,offs;

FILE *F,*F1,*F2,*F3;

int strtoi(char *s, int *i)

{

  int sign,val=0;

  if(!*s)return -1;

  if(*s == '-'){

    sign = -1;s++;}

  else sign = 1;

  while(*s)

  {

    if(*s < '0') return -1;

    if(*s > '9') return -1;

     val *= 10;val += *s - '0';*s++;

  }

  *i = val * sign;

  return 0;

}

void strupcase(char *s)

{ while(*s){

   if((*s > ('a' - 1)) && (*s < ('z'+1)))

     *s -= ('z' - 'Z');s++;}}

char strcomp(char *s1, char *s2){

  while(*s1){

   if(*s1 != *s2) return 0;

     s1++;s2++;}

   if(*s2) return 0;

  return 1;

}

int strconsist(char *s, char c){

  while(*s) if(*s++ == c) return 1; return 0;}

char *parse(char *buf, char *str)

{

    char c;

    while(*str)

    {

      c=*str;

      if  (!strconsist(separators,c))

      {

      if (strconsist(signs,c))

       {

         buf[0]=c;

         buf[1]=0;

         return str+1;

       }

       while ((*str)&&(!strconsist(separators,*str))&&

           (!strconsist(signs1,*str)))

          {

            *buf++=*str++;

            if (*str==':')

            {

             parsetyp=PT_LABEL;

               return str+1;

            }

          }

            *buf=0;

            parsetyp=PT_WORD;

            return str;

       }

        str++;

    }

      *buf=0;

      parsetyp=PT_EOST;

      return str;

}

int findstr(char *tab[], char *it)

{

    int cmdidx;

    cmdidx = 0;

    while(tab[cmdidx])

    {

        if(strcomp(tab[cmdidx], it))

            return cmdidx;

        cmdidx++;

    }

    return -1;

}

     /* Обработка директивы macro */

void macro_def()

{

  read:

  while (!feof(F2))

  {

    number++;

    fgets(cmdbuf,MAXSTR,F2);

    strupcase(cmdbuf);

    if (!cmdbuf[0])

    {

      fprintf(F1,"1\t%10i",number);

      number++;

      goto read;

    }

    parsep=cmdbuf;

    parsep=parse(lexbuf,parsep);

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

    parsep=parse(lexbuf,parsep);

Похожие материалы

Информация о работе