Macro Processors Chapter 4 System Software An introduction to systems programming Leland L. Beck 1 Introduction Concept » 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) 2 Macro Processor Recognize macro definitions Save the macro definition Recognize macro calls Expand macro calls Source Code (with macro) Macro Processor Expanded Code Compiler or Assembler obj 3 Macro Definition copy code parameter substitution conditional macro expansion macro instruction defining macros 4 Copy code -- Example Source STRG MACRO STA DATA1 STB DATA2 STX DATA3 MEND . STRG . STRG . . Expanded source . . . STA DATA1 STB DATA2 STX DATA3 . STA DATA1 STB DATA2 STX DATA3 . { { 5 Macro vs. Subroutine Macro » the statement of expansion are generated each time the macro are invoked Subroutine » the statement in a subroutine appears only once 6 Parameter Substitution -- Example Source STRG MACRO &a1, &a2, &a3 STA &a1 STB &a2 STX &a3 MEND . STRG DATA1, DATA2, DATA3 . STRG DATA4, DATA5, DATA6 . . Expanded souce . . . STA STB STX . STA STB STX . { { DATA1 DATA2 DATA3 DATA4 DATA5 DATA6 7 Parameter Substitution Dummy arguments » Positional argument STRG DATA1, DATA2, DATA3 GENER ,,DIRECT,,,,,,3 » Keyword argument STRG &a3=DATA1, &a2=DATA2, &a1=DATA3 GENER TYPE=DIRECT, CHANNEL=3 Example: Fig. 4.1, Fig. 4.2 » Labels are avoided in macro definition 8 Macro processor algorithm and data structures Macro definition within macros » process macro definition during expansion time Example 4.3(nested macro definition) 9 One-Pass Macro Processor Data Structures -- Global Variables DEFTAB NAMTAB ARGTAB EXPANDING 10 One-Pass Macro Processor Prerequisite » every macro must be defined before it is called Sub-procedures » macro definition: DEFINE » macro invocation: EXPAND NAMTAB MACRO DEFINE DEFTAB CALL EXPAND ARGTAB PROCESSLINE 11 13 14 One-Pass Macro Processor That Allows Nested Macro Definition Sub-procedures » macro definition: DEFINE » macro invocation: EXPAND EXPAND may invoke DEFINE when encounter macro definition NAMTAB DEFTAB ARGTAB Expanding MACRO DEFINE CALL EXPAND PROCESSLINE MACRO Definition 15 1-Pass Macro Processor DEFINE MACRO PROCESSOR GETLINE EXPANDING=FALSE PROCESSLINE GETLINE PROCESSLINE EXPAND EXPANDING=TRUE GETLINE PROCESSLINE GETLINE EXPANDING FALSE TRUE READ FROM DEFTAB READ FROM INPUT 16 Comparison of Macro Processors Design Single pass » every macro must be defined before it is called » one-pass processor can alternate between macro definition and macro expansion » nested macro definitions may be allowed but nested calls are not Two pass algorithm » Pass1: Recognize macro definitions » Pass2: Recognize macro calls » nested macro definitions are not allowed 17 Machine Independent Macro Processor Features Concatenation of Macro Parameters Generation of Unique Labels Conditional Macro Expansion Keyword Macro parameters 18 Concatenation of Macro Parameters Pre-concatenation » LDA Post-concatenation » LDA X&ID1 X&ID1 Example: Figure 4.6 19 Generation of Unique Labels Example » JEQ *-3 » inconvenient, error-prone, difficult to read Example Figure 4.7 – $LOOP TD =X’&INDEV’ TD =X’F1’ TD =X’F1’ » 1st call: – $AALOOP » 2nd call: – $ABLOOP 20 21 RDBUFF F1, BUFFER, LENGTH 22 Conditional Macro Expansion Macro-time conditional statements » Example: Figure 4.8 » IF-ELSE-ENDIF Macro-time variables » any symbol that begins with the character & and that is not a macro parameter » macro-time variables are initialized to 0 » macro-time variables can be changed with their values using SET – &EORCK SET 1 23 RDBUFF F3, BUF, RECL, 04, 2048 RDBUFF 0E, BUFFER, LENGTH, , 80 RDBUFF F1, BUFF, RLENG, 04 Conditional Macro Expansion (Cont.) Macro-time looping statement » Example: Figure 4.9 » WHILE-ENDW Macro processor function » %NITEMS: THE NUMBER OF MEMBERS IN AN ARGUMENT LIST 27 Parameter Substitution Dummy arguments » Positional argument STRG DATA1, DATA2, DATA3 GENER ,,DIRECT,,,,,,3 » Keyword argument fig 4.10 STRG &a3=DATA1, &a2=DATA2, &a1=DATA3 GENER TYPE=DIRECT, CHANNEL=3 Example: Fig. 4.1, Fig. 4.2 » Labels are avoided in macro definition 28 Macro Processor Design Options Recursive Macro Expansion General Purpose Macro Processors Macro Processing within Language Translators 29 Recursive Macro Expansion Nested Macro Invocations Macro invocations within macros » process macro invocation during expansion time Recursive macro expansion » Example: Figure 4.11 » Problems: – ARGTAB – EXPANDING » Solution – Recursive call – While loop with stack 30 ARGTAB DEFTAB MACRO Definition NAMTAB DEFINE GETLINE PROCESSLINE Macro Invocation EXPAND ARGTAB 31 1-Pass Macro Processor DEFINE MACRO PROCESSOR GETLINE EXPANDING=FALSE PROCESSLINE GETLINE PROCESSLINE EXPAND EXPANDING=TRUE GETLINE PROCESSLINE GETLINE EXPANDING FALSE TRUE READ FROM DEFTAB READ FROM INPUT 32 Allowing Nested Macro Invocation DEFINE(f) MACRO PROCESSOR GETLINE(f) PROCESSLINE(f) GETLINE(0) PROCESSLINE(0) EXPAND GETLINE(1) PROCESSLINE(1) GETLINE(f) f FALSE TRUE READ FROM DEFTAB READ FROM INPUT 33 Implementation Examples Fig 4.12 Fig 4.13 MASM Macro Processor ANSI C Language 34 General Purpose Macro Processor ELENA » Software: Practice and Experience, Vol. 14, pp. 519-531, Jun. 1984 Macro definition » header: – a sequence of keywords and parameter markers (%) – at least one of the first two tokens in a macro header must be a keyword, not a parameter marker » body: – the character & identifies a local label – macro time instruction (.SET, .IF .JUMP, .E) – macro time variables or labels (.) 35 ANSI C Macro Language 36 ANSI C Macro Language Definitions and invocations of macros are handled by a preprocessor, which is generally not integrated with the rest of the compiler. Examples: #define #define #define #define NULL 0 EOF (-1) EQ == ABSDIFF (X,Y) syntactic modification ( (X)>(Y) ? (X)-(Y) : (Y)-(X) ) 37 ANSI C Macro Language Parameter substitutions are not performed within quoted strings: #define DISPLAY(EXPR) printf(“EXPR= %d\n”, EXPR) » Macro expansion example DISPLAY(I*J+1) printf(“EXPR= %d\n”, I*J+1) A special “stringizing” operator, #, can be used to perform argument substitution in quoted strings: #define DISPLAY(EXPR) printf(#EXPR “= %d\n”, EXPR) » Macro expansion example DISPLAY(I*J+1) printf(“I*J+1” “= %d\n”, I*J+1) 38 ANSI C Macro Language Recursive macro definitions or invocations » After a macro is expanded, the macro processor rescans the text that has been generated, looking for more macro definitions or invocations. » Macro cannot invoke or define itself recursively. DISPLAY(ABSDIFF(3,8)) printf(“ABSDIFF(3,8)”scan “= %d\n”, ABSDIFF(3,8)) printf(“ABSDIFF(3,8)” “= %d\n”, ( (3)>(8) ? (3)-(8) : (8)-(3) )) rescan 39 ANSI C Macro Language Conditional compilation statements Example 1: #ifndef BUFFER_SIZE #define BUFFER_SIZE 1024 #endif Example 2: #define DEBUG 1 : #if DEBUG == 1 printf(…) /* debugging outout */ #endif 40 ANSI C Macro Language Miscellaneous functions of the preprocessor of ANSI C » Trigraph sequences are replaced by their single-character equipments, e.g., ??< { » Any source line that ends with a backlash, \, and a newline is spliced together with the following line. » Any source files included in response to an #include directive are processed. » Escape sequences are converted e.g., \n, \0 » Adjacent string literals are concatenated, e.g., “hello,” “world” “hello, world”. 41 ELENA (cont.) Macro invocation » There is no single token that constitutes the macro “name” » Constructing an index of all macro headers according to the keywords in the first two tokens of the header » Example – DEFINITION: ADD %1 TO %2 ADD %1 TO THE FIRST ELEMENT OF %2 – INVOCATION: DISPLAY %1 DISPLAY TABLE %1 TABLE 42