Macro Processors Chapter 4 System Software An introduction










































- Slides: 42

Macro Processors Chapter 4 System Software An introduction to systems programming Leland L. Beck 1

Introduction l 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 l l 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 l l copy code parameter substitution conditional macro expansion macro instruction defining macros 4

Copy code -- Example Source STRG MACRO STA DATA 1 STB DATA 2 STX DATA 3 MEND. STRG. . Expanded source. . . STA DATA 1 STB DATA 2 STX DATA 3. { { 5

Macro vs. Subroutine l Macro » the statement of expansion are generated each time the macro are invoked l Subroutine » the statement in a subroutine appears only once 6

Parameter Substitution -- Example Source STRG MACRO &a 1, &a 2, &a 3 STA &a 1 STB &a 2 STX &a 3 MEND. STRG DATA 1, DATA 2, DATA 3. STRG DATA 4, DATA 5, DATA 6. . Expanded souce. . . STA STB STX. { { DATA 1 DATA 2 DATA 3 DATA 4 DATA 5 DATA 6 7

Parameter Substitution l Dummy arguments » Positional argument STRG DATA 1, DATA 2, DATA 3 GENER , , DIRECT, , , 3 » Keyword argument STRG &a 3=DATA 1, &a 2=DATA 2, &a 1=DATA 3 GENER TYPE=DIRECT, CHANNEL=3 l Example: Fig. 4. 1, Fig. 4. 2 » Labels are avoided in macro definition 8

Macro processor algorithm and data structures l Macro definition within macros » process macro definition during expansion time l Example 4. 3(nested macro definition) 9

One-Pass Macro Processor Data Structures -- Global Variables l l l DEFTAB NAMTAB ARGTAB EXPANDING 10

One-Pass Macro Processor l Prerequisite » every macro must be defined before it is called l 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 l Sub-procedures » macro definition: DEFINE » macro invocation: EXPAND l EXPAND may invoke DEFINE when encounter macro definition NAMTAB DEFTAB ARGTAB Expanding MACRO DEFINE CALL EXPAND PROCESSLINE MACRO Definition 15

1 -Pass Macro Processor 16

Comparison of Macro Processors Design l 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 l Two pass algorithm » Pass 1: Recognize macro definitions » Pass 2: Recognize macro calls » nested macro definitions are not allowed 17

Machine Independent Macro Processor Features l l Concatenation of Macro Parameters Generation of Unique Labels Conditional Macro Expansion Keyword Macro parameters 18

Concatenation of Macro Parameters l Pre-concatenation » LDA l Post-concatenation » LDA l X&ID 1 Example: Figure 4. 6 19

Generation of Unique Labels l Example » JEQ *-3 » inconvenient, error-prone, difficult to read l Example Figure 4. 7 – $LOOP TD =X’&INDEV’ TD =X’F 1’ » 1 st call: – $AALOOP » 2 nd call: – $ABLOOP 20

21

RDBUFF F 1, BUFFER, LENGTH 22

Conditional Macro Expansion l Macro-time conditional statements » Example: Figure 4. 8 » IF-ELSE-ENDIF l 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 F 3, BUF, RECL, 04, 2048 RDBUFF 0 E, BUFFER, LENGTH, , 80

RDBUFF F 1, BUFF, RLENG, 04

Conditional Macro Expansion (Cont. ) l Macro-time looping statement » Example: Figure 4. 9 » WHILE-ENDW l Macro processor function » %NITEMS: THE NUMBER OF MEMBERS IN AN ARGUMENT LIST 27

Parameter Substitution l Dummy arguments » Positional argument STRG DATA 1, DATA 2, DATA 3 GENER , , DIRECT, , , 3 » Keyword argument fig 4. 10 STRG &a 3=DATA 1, &a 2=DATA 2, &a 1=DATA 3 GENER TYPE=DIRECT, CHANNEL=3 l Example: Fig. 4. 1, Fig. 4. 2 » Labels are avoided in macro definition 28

Macro Processor Design Options l l l Recursive Macro Expansion General Purpose Macro Processors Macro Processing within Language Translators 29

Recursive Macro Expansion Nested Macro Invocations l Macro invocations within macros » process macro invocation during expansion time l 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 32

Allowing Nested Macro Invocation 33

Implementation Examples l l l Fig 4. 12 Fig 4. 13 MASM Macro Processor ANSI C Language 34

General Purpose Macro Processor l ELENA » Software: Practice and Experience, Vol. 14, pp. 519 -531, Jun. 1984 l 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 l l Definitions and invocations of macros are handled by a preprocessor, which is generally not integrated with the rest of the compiler. Examples: #define NULL 0 #define EOF (-1) #define EQ == #define ABSDIFF (X, Y) syntactic modification ( (X)>(Y) ? (X)-(Y) : (Y)-(X) ) 37

ANSI C Macro Language l Parameter substitutions are not performed within quoted strings: #define DISPLAY(EXPR) printf(“EXPR= %dn”, EXPR) » Macro expansion example DISPLAY(I*J+1) printf(“EXPR= %dn”, I*J+1) l A special “stringizing” operator, #, can be used to perform argument substitution in quoted strings: #define DISPLAY(EXPR) printf(#EXPR “= %dn”, EXPR) » Macro expansion example DISPLAY(I*J+1) printf(“I*J+1” “= %dn”, I*J+1) 38

ANSI C Macro Language l 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 “= %dn”, ABSDIFF(3, 8)) printf(“ABSDIFF(3, 8)” “= %dn”, ( (3)>(8) ? (3)-(8) : (8)-(3) )) rescan 39

ANSI C Macro Language l l Conditional compilation statements Example 1: #ifndef BUFFER_SIZE #define BUFFER_SIZE 1024 #endif l Example 2: #define DEBUG 1 : #if DEBUG == 1 printf(…) /* debugging outout */ #endif 40

ANSI C Macro Language l 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, » Adjacent string literals are concatenated, e. g. , “hello, ” “world” “hello, world”. 41

ELENA (cont. ) l 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: l l ADD %1 TO %2 ADD %1 TO THE FIRST ELEMENT OF %2 – INVOCATION: l DISPLAY TABLE DISPLAY %1 %1 TABLE 42