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

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

Уважаемые коллеги! Предлагаем вам разработку программного обеспечения под ключ.

Опытные программисты сделают для вас мобильное приложение, нейронную сеть, систему искусственного интеллекта, SaaS-сервис, производственную систему, внедрят или разработают ERP/CRM, запустят стартап.

Сферы - промышленность, ритейл, производственные компании, стартапы, финансы и другие направления.

Языки программирования: Java, PHP, Ruby, C++, .NET, Python, Go, Kotlin, Swift, React Native, Flutter и многие другие.

Всегда на связи. Соблюдаем сроки. Предложим адекватную конкурентную цену.

Заходите к нам на сайт и пишите, с удовольствием вам во всем поможем.

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

Лабораторна робота № 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); //чтение команд макроса

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

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

Уважаемые коллеги! Предлагаем вам разработку программного обеспечения под ключ.

Опытные программисты сделают для вас мобильное приложение, нейронную сеть, систему искусственного интеллекта, SaaS-сервис, производственную систему, внедрят или разработают ERP/CRM, запустят стартап.

Сферы - промышленность, ритейл, производственные компании, стартапы, финансы и другие направления.

Языки программирования: Java, PHP, Ruby, C++, .NET, Python, Go, Kotlin, Swift, React Native, Flutter и многие другие.

Всегда на связи. Соблюдаем сроки. Предложим адекватную конкурентную цену.

Заходите к нам на сайт и пишите, с удовольствием вам во всем поможем.