IMPLEMENTATION OF
MACRO PROCESSOR
AIM
To write a C-program for implementing a macro processor.
ALGORITHM
1.Get the state from input file.
2.From the line read,check if opcode is directive “MACRO” if
so then number of macro “n” must be incremented.
3.Repeat step 1 and 2 until end of file is encountered.
4.Open “n” number of files in write mode.These files will
later hold body of “n” macro respectively.
5.Rewind the input file pointer.
6.If opcode is “MACRO”
7.Enter macro name present in operand file field into array
names “m”.
8.Write line to expanded output file.
9.Enter lines in body of each macro into corresponding files
already opened in file.
10.Write body of each macro to be expanded output file also
until “END” is reached.
11.Else if OPCODE is “CALL” the line must be a macro
invocation statement so the macro body is retrieved from the corresponding
file.
12.Write all the remaining lines directly to expanded lines.
PROGRAM:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
FILE *f1,*f2,*f3,*f4,*f5;
void main()
{
char
lbl[20],opc[20],opr[20],mname[20],arg[20],check[20];
char
ch,dlbl[20],dopc[20],dopr[20];
int c;
clrscr();
f1=fopen("MACIN.DAT","r");
rewind(f1);
f2=fopen("NAMETAB.DAT","r");
rewind(f2);
f3=fopen("DEFTAB.DAT","r");
f4=fopen("EXPAND.DAT","w");
f5=fopen("ARGTAB.DAT","w");
while(!feof(f1))
{
l1:
fscanf(f1,"%s%s%s",lbl,opc,opr);
if(strcmp(opc,mname)==0)
c=1;
if(strcmp(opc,"MACRO")==0)
{
while(strcmp(opc,"MEND")!=0)
{
fscanf(f1,"%s%s%s",lbl,opc,opr);
continue;
}
goto
l1;
}
rewind(f2);
rewind(f3);
fscanf(f2,"%s",mname);
if(strcmp(opc,mname)==0)
{
fprintf(f5,"%s",opr);
rewind(f5);
while(!feof(f3))
{
fscanf(f3,"%s%s%s",dlbl,dopc,dopr);
if(strcmp(dopc,"MEND")!=0)
{
if(strcmp(dopc,"MACRO")==0)
{
continue;
}
if(strcmp(dopr,"=X'?1'")==0)
strcpy(dopr,"=X'F1'");
if(strcmp(dopr,"?2,X")==0)
strcpy(dopr,"BUFFER,X");
if(strcmp(dopr,"?3")==0)
strcpy(dopr,"LENGTH");
if(c==1)
{
fprintf(f4,"%s\t%s\t%s\n",lbl,opc,opr);
c=0;
}
fprintf(f4,"%s\t%s\t%s\n",dlbl,dopc,dopr);
}
}
goto
l1;
}
fprintf(f4,"%s\t%s\t%s\n",lbl,opc,opr);
}
fcloseall();
printf("\nINPUT\n\nMacro program before expanded:\n");
printf("-----------------\n");
f1=fopen("MACIN.DAT","r");
ch=fgetc(f1);
while(ch!=EOF)
{
printf("%c",ch);
ch=fgetc(f2);
}
printf("\nDefinition table\n");
printf("-----------------\n");
f2=fopen("DEFTAB.DAT","r");
ch=fgetc(f2);
while(ch!=EOF)
{
printf("%c",ch);
ch=fgetc(f2);
}
printf("\nName
table\n");
printf("-----------------\n");
f3=fopen("NAMETAB.DAT","r");
ch=fgetc(f3);
while(ch!=EOF)
{
printf("%c",ch);
ch=fgetc(f3);
}
getch();
clrscr();
printf("\n\nOUTPUT\n\nMacro Program after expanded\n");
printf("----------------\n\n");
f4=fopen("EXPAND.DAT","r");
ch=fgetc(f4);
while(ch!=EOF)
{
printf("%c",ch);
ch=fgetc(f4);
}
printf("\nArgument Table\n");
printf("---------------------\n\n");
f5=fopen("ARGTAB.DAT","r");
ch=fgetc(f5);
while(ch!=EOF)
{
printf("%c",ch);
ch=fgetc(f4);
}
fcloseall();
getch();
}
INPUT FILES:
MACIN.DAT
COPY START NULL
RDBUFF MACRO INDEV,BUFADR,RECLTH
NULL CLEAR X
NULL CLEAR A
NULL CLEAR S
NULL +LDT #4096
NULL TD =X'&INDEV'
NULL JEQ *_3
NULL RD =X'&INDEV'
NULL COMPR A,S
NULL JEQ *+11
NULL STCH BUFADR,X
NULL TIXR T
NULL JLT *-19
NULL STX RECLTH
NULL MEND NULL
FIRST STL RETADR
CLOOP RDBUFF F1,BUFFER,LENGTH
NULL LDA LENGTH
NULL COMP #0
NULL JEQ ENDFIL
EOF BYTE C'EOF'
THREE WORD 3
RETADR RESW 1
LENGTH RESW 1
BUFFER RESB 4096
NULL END FIRST
DEFTAB.DAT
COPY START NULL
RDBUFF MACRO &INDEC,&BUFADR,&RECLTH
NULL CLEAR X
NULL CLEAR A
NULL CLEAR S
NULL +LDT #4096
NULL TD =x'?1'
NULL JEQ *-3
NULL RD =X'?1'
NULL COMPR A,S
NULL JEQ *+11
NULL STCH ?2,X
NULL TIXR T
NULL JLT *-19
NULL STX ?3
NULL MEND NULL
NAMETAB.DAT
RDBUFF
OUTPUT:
MACRO PROGRAM BEFORE EXPANSION:
MACRO PROGRAM AFTER EXPANSION:
RESULT
Thus macro processor has been successfully implemented using
C.
Light Source
ReplyDeleteLink State Routing Algorithm
Linked List vs Array
Linker
Linking Loaders
Lock Based Protocol
Hierarchical Routing