Препроцесор. Розробка програми-препроцеса, що виконує розбір тексту ASM файлу на рівні макросів та условної компіляції

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

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

Лабораторна робота № 2

Препроцесор

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

Індивідуальне завдання: написати програму-обробник системи команд обробки макророзширень мови Assemblera, а також перетворення вхідного файлу в готовий ASM-файл (без макросів). Прозвести симантичний та синтаксичний аналіз тексту вхідного файлу.

Розробка алгоритму:

-відкриття входного файлу;

-утворення підсписку імен та параметрів макросів

-симантичний та синтаксичний аналіз

-аналіз директив обробки команд условної компіляції:

IFNDEF, ELSE, ENDIF

-обробка директиви INCLUDE

-формування виходного файлу

Типи даних:

При зустрічі макровизначення (в процесі обробки тексту початкового модулю) макропроцесор повинен обробити команду, шляхом занесення даного макровизначення в список макровизначень.  Структура приведена нижче: 

struct macroname { char name[10];   //ім’я макросу

                           struct macroparam{ char  paramname[10];//формальні параметри

                                                       macroparam *next;

                                                     } *mp,*mp1,*mp2;

                           struct macrobuf  { char  mbuf[80]; //команди макросу

                                                       macrobuf   *next;

                                                     } *mb,*mb1,*mb2;

                           struct namparam { char  name[10]; //фактичні параметри

                                                      namparam *next;

                                                    } *np,*np1,*np2;

                           macroname *next;

                        } *m,*m1,*m2;

};

Вхідні дані: вхідними даними являється файл, написаний на мові Assemblera (вводиться через командну строку).



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

#include <conio.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define true 1

#define false 0

#define clearbuf for (int t=0;t<10;t++)\

                                  buf[t]=0;

#define openf if ((file_r=fopen(argv[1],"rt"))==NULL){ \

                 printf("Cant open file '%s'",argv[1]);  \

                                return 1;}

open file",argv[1]);  \

int p=0,p1=0,p2=0,p3=0,p4=0,p5=0,l=0,u=false;

char nam[1][12];

struct equ      {  int  cons;

                                 char name[10];

                                 equ *next;

                              } *eq,*eq1,*eq2;

struct macroname { char name[10];//имя макроса

    struct macroparam{ char  paramname[10]; //формальные парам

        macroparam *next; } *mp,*mp1,*mp2;

    struct macrobuf  { char  mbuf[80]; //команды макроса

        macrobuf   *next; } *mb,*mb1,*mb2;

    struct namparam { char  name[10]; //фактич. параметры

        namparam *next;  } *np,*np1,*np2;

    macroname *next;} *m,*m1,*m2;

FILE *file_r,*file_w;

void MacroTab(char *str); //записывает в список имена всех макросов и создает подсписки в этом списке с параметрами этих макросов

void LoadMacro(char *str); //создаёт подсписок macrobuf в кот содержатся команды макроса

void InsertBuf();   //вставка макрорасширения

void MakeList(char **argv); //добавляет .lst к имени входного файла и запись в nam[1]

void SetParam(char *str);  //созд. подсписка namparam  фактических параметров макроса

void FileReading(char *str); //определ. имени подкл. ф. и копирование его содержимого в выходной (.lst)

void LoadEqu(char *str);  //запись в список имён констант(equ) и их значений

void AnalisIF(char *str);  //поиск в списке нужной переменной и её значен. и определение выполняется ли условная директива

void ObrIF(); //если условная директива выполн., то чтение команд и запись их в выходной файл

int main(int argc,char **argv)

{    argv[1]="pre.asm";

argc=2;

    char str[80];

    int f=0; //счетчик команд в макросе

    if (argc<2){

      fprintf(file_w,"Invalid parametr\n");

      return 1;    }

   clrscr();   openf;

   MakeList(argv);    //к имени входного файла добавл. ".lst"

   if ((file_w = fopen(nam[1],"wt"))== NULL)

      {       fprintf(file_w,"Cannot open output file\n");    exit(0);      }

   while (!feof(file_r)) //открытие для чтения констант и макросов

               { fgets(str,40,file_r);

                if (strstr(str," EQU ")) //если это константа

                 LoadEqu(str); //запись в список имён констант equ и их значений

                if (strstr(str,"MACRO")) //если это макрос(макроопределение)

                    {    MacroTab(str); //запись в список имён всех макросов и созд. подсписков с параметрами этих макросов

                      if (f>0) p3++;  // если 1-й макрос уже есть

                      p4=0;   fgets(str,40,file_r); //чтение команд макроса

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

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