0 оценок0% нашли этот документ полезным (0 голосов)
65 просмотров13 страниц
A macro processor is a program that copies text from one place to another while making systematic replacements. It recognizes macro definitions and calls, and expands macro calls by replacing them with the corresponding macro body text. This document describes the implementation of a C program for a macro processor, including functions for defining macros, expanding macro calls, reading lines, and generating unique labels during expansion to avoid duplicate labels.
A macro processor is a program that copies text from one place to another while making systematic replacements. It recognizes macro definitions and calls, and expands macro calls by replacing them with the corresponding macro body text. This document describes the implementation of a C program for a macro processor, including functions for defining macros, expanding macro calls, reading lines, and generating unique labels during expansion to avoid duplicate labels.
A macro processor is a program that copies text from one place to another while making systematic replacements. It recognizes macro definitions and calls, and expands macro calls by replacing them with the corresponding macro body text. This document describes the implementation of a C program for a macro processor, including functions for defining macros, expanding macro calls, reading lines, and generating unique labels during expansion to avoid duplicate labels.
A general-purpose macro processor or general purpose preprocessor is a macro processor
that is not tied to or integrated with a particular language or piece of software.A macro processor is a program that copies a stream of text from one place to another, making a systematic set of replacements as it does so. Macro processors are often embedded in other programs, such as assemblers and compilers. Sometimes they are standalone programs that can be used to process any kind of text. Macro processors have been used for language expansion (defining new language constructs that can be expressed in terms of existing language components), for systematic text replacements that require decision making, and for text reformatting (e.g. conditional extraction of material from an HTML file). A macro instruction is a notational convenience for the programmer. It allows the programmer to write shorthand version of a program (module programming).The macro processor replaces each macro invocation with the corresponding sequence of statements (expanding). A Macro processor: Recognize macro definitions, Save the macro definition, Recognize macro calls, Expand macro calls.
IMPLEMENTATION The following functionalities are implemented in our C code for macro processor: MACROPROCESSOR EXPANDING=FALSE. Read each line and call GETLINE() and PROCESSLINE() until END encounters. PROCESSLINE ( ) If OPCODE is a macroname then EXPAND ( ). Else if OPCODE is MACRO ,then DEFINE ( ). Else write line to expanded file as such. DEFINE( ) Enter Macro name into NMATAB. Enter macro prototype into DEFTAB. Set LEVEL=1. Substitute parameters with positional notations and enter to DEFTAB. If OPCODE=MACRO, LEVEL++; If OPCODE=MEND, LEVEL--; Continue this until LEVEL=0 Store beginning and end of definition as pointers within NAMTAB EXPAND ( ) EXPANDING = TRUE Set up arguments from macro invocation in ARGTAB. Write macro invocation statement to expanded file as a comment line. Call GETLINE() and PROCESSLINE() till macro definition ends. Set EXPANDING=FALSE. GETLINE ( ) If EXPANDING is TRUE, read from DEFTAB (data structure where macro body is stored) and substitute arguments for positional notations. If EXPANDING is FALSE , read next line from input file. UINQUE LABEL GENERATION a. Labels in the macro body may cause duplicate labels problem if the macro is invocated and expanded multiple times. b. Use of relative addressing at the source statement level is very inconvenient, error- prone, and difficult to read. c. It is highly desirable to
- let the programmer use label in the macro body a. Labels used within the macro body begin with $.
- let the macro processor generate unique labels for each macro invocation and expansion. b. During macro expansion, the $ will be replaced with $xx, where xx is a two- character alphanumeric counter of the number of macro instructions expanded. c. XX=AA, AB, AC,..
char label[20],opcode[20],operand[40],uniquelabel[20],modopcode[10]; char line[20]; int namcount=0, defcount=0; int EXPANDING; int curr,zz,yy,flag,oplen; char start[3]={'$',65,64};
struct namtab { char name[10]; int start,end; }mynamtab[15];
switch(count) { case 0:strcpy(opcode,word1);break; case 1:{strcpy(opcode,word2);strcpy(operand,word1);}break; case 2:{strcpy(label,word3);strcpy(opcode,word2);strcpy(operand,word1);}break; } //printf("\n%s\n",label);
}
// PROCESSLINE void PROCESSLINE() { int i; for( i=0;i<namcount;i++)
if(!strcmp(opcode,mynamtab[i].name)) {
EXPAND();return;
}
{ if(!strcmp(opcode,"MACRO"))
DEFINE();
else fprintf(expanded,"%s",line); } }
void DEFINE() { int LEVEL,i=0,j=0,k=0; char param[5][9]; char s[3]; strcpy(s,"123");