Лабораторна робота № 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); //чтение команд макроса
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.