Procesadores de Macros Parte 2 MIS. Lizbeth Alejandra Hernández González Programación de Sistemas Opciones de diseño para el procesador de macros • El algoritmo de la figura 4.5 no funciona bien si aparece una proposición de invocación a macros en el cuerpo de una instrucción a macros. • A menudo es deseable admitir esta utilización de las macros. • Aunque el uso más común de las instrucciones a macros es en ensamblador, hay otras posibilidades. Figura 4.11 10 15 20 25 RDBUFF MACRO &BUFADR,&RECLTH,&INDEV MACRO QUE LEE UN REGISTRO EN EL BUFFER 30 CLEAR X 35 CLEAR A 50 45 CLEAR +LDT 50 $L00P RDCHAR S # 4096 LEE EL CARACTER EN EL REGISTRO A A,S EXAMINA SI HAY FIN DE REGISTRO $EX IT SALE DEL CICLO SI ES FIN DE REGISTRO &BUFADR,X ALMACENA EL CARACTER EN EL BUFFER T REPITE EL CICLO A MENOS QUE SE HAYA C0MPR 70 JEQ 75 STCH 80 TIXR 85 JLT $L00P STX &RECLTH 95 $EXIT MEND ASIGNA LA LONGITUD MAXIMA DEL REGISTRO &INDEV 65 90 LIMPIA EL CONTADOR DE CICLO ALCANZADO LA LONGITUD MAXIMA GUARDA LA LONGITUD DEL REGISTRO 5 10 15 20 25 30 35 40 RDCHAR MACRO &IN . MACRO QUE LEE UN CARACTER EN EL REGISTRO A TD =X'&IN' PRUEBA EL DISPOSITIVO DE ENTRADA JEQ *-3 REPITE EL CICLO HASTA QUE ESTE LISTO RD =X'&IN' LEE EL CARACTER MEND (b) RDBUFF BUFFER,LENGTH,F1 (c) FIGURA 4.11 Ejemplo de invocaciones a macros anidadas. • Suponemos que ya existe una macroinstrucción relacionada (RDCHAR). • El objetivo de RDCHAR es leer un carácter de un dispositivo especificado en el registro A, cuidando el ciclo de prueba y espera necesario. • RDCHAR podría escribirse en un momento distinto o por otro programador. problemas ocasionados por esas proposiciones de invocación a macros • Expansión de macros recursiva ▫ la invocación a una macro por otra • el diseño del procesador de macros analizado no puede manejar tales invocaciones de macros • ¿por qué? • Siguiendo el código 4.5 para el programa 4.11 tendríamos para la primera llamada a EXPANDE: TABARG: Parámetro Valor 1 BUFFER 2 LENGTH 3 F1 4 (sin usar) • EXPANSION=TRUE 50 $L00P RDCHAR &INDEV LEE EL CARACTER EN EL REGISTRO A • PROCESA-LINEA llamaría de nuevo a EXPANDE, y esta vez, TABARG sería: TABARG: Parámetro 1 2 Valor FI (sin usar) • el procesador de macros "olvidará" que estaba a la mitad de la expansión de una macro al encontrar la proposición RDCHAR • los argumentos de la invocación a macros original (RDBUFF) se perdieron (los valores de TABARG se superpusieron) • podría incorporarse la misma lógica en una estructura de ciclo, en lugar de llamadas recursivas. • Estos problemas no son difíciles de resolver si el procesador de macros está escrito en un lenguaje de programación (como Pascal o C) que permita hacer llamadas recursivas. Procesadores de macros de aplicación general • Esos procesadores de macros a menudo se combinan, o se relacionan estrechamente, con el ensamblador. • Ventajas aplicación general para el procesador de macros: ▫ El programador no necesita aprender un dispositivo de macros diferente para cada compilador o lenguaje ▫ Se ahorra mucho tiempo y dinero de prácticas. • Pero… ▫ Los costos relacionados con la producción de un procesador de macros de aplicación general son algo superiores • Hay relativamente pocos procesadores de macros de aplicación general. ▫ El gran número de detalles ▫ Por ejemplo, un procesador de macros en general debe ignorar los comentarios ▫ dispositivos de agrupación de términos, expresiones o proposiciones: () [] Begin end ▫ Un problema más general es el de los componentes léxicos o tokens (identificadores, constantes, operadores y palabras clave) := asignación en Pascal = asignación en C ▫ Definir si espacios en blanco son significativos o no ▫ definición e invocación de macros. (En la mayoría de los procesadores de macros de aplicación especial, las invocaciones a macros tienen una forma muy parecida a las proposiciones del lenguaje fuente de programación) ▫ es difícil de conseguir con un procesador de macros de aplicación general Procesamiento de macros en traductores de lenguaje • Preprocesadores de macros.definiciones de macros y invocaciones a macros procesan expanden ▫ código fuente versión expandida ensamblador/compilador • alternativa: la combinación de las funciones de procesamiento de macros con el traductor de lenguaje Procesamiento de macros en traductores de lenguaje • El método más simple es con un procesador de macros línea a línea • Ventajas: ▫ Evita hacer un paso adicional sobre el programa fuente ▫ Puede ser más eficiente • Algunas estructuras de datos requeridas por el procesador de macros y el traductor de lenguaje se pueden combinar: ▫ búsqueda en las líneas de entrada, búsqueda en tablas y conversión de valores numéricos ▫ facilita la emisión de mensajes de diagnóstico • las funciones de procesamiento de macros y traducción de programas son relativamente independientes • es posible tener una cooperación más estrecha • Un procesador de macros integrado tiene la posibilidad de utilizar cualquier información con respecto al programa fuente que extraiga el traductor de lenguaje • El procesador de macros tan sólo puede usar los resultados (sin implicarse en aspectos como operadores de varios caracteres, líneas de continuación y reglas de formación de componentes léxicos) • un procesador de macros integrado puede manejar macroinstrucciones dependientes del contexto • Procesadores de macros integrados y línea a línea tienen desventajas: ▫ Deben ser especialmente diseñados y escritos para trabajar con una implantación determinada de un ensamblador o compilador (no sólo con un lenguaje de programación determinado) • Sería más grande y más costoso • Las decisiones sobre el tipo de procesador de macros que se va a utilizar deben tener en cuenta aspectos como la frecuencia y la complejidad del procesamiento de macros que se espera, y otras características del ambi.ente de computación Ejemplos de procesadores de macros 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 &NAME .FLOAT &TYPE . INTGR &NAME .MIXTYP .TYPERR MACRO ADD LCLC AIF AIF AIF AGO ANOP SETC ANOP L&TYPE A&TYPE ST&TYPE MEXIT MNOTE MEXIT MNOTE MEND (a) &0P1,&0P2,&SUM &TYPE (T'&OPl NE T'&0P2) .MIXTYP (T'&OPl EQ 'F') .INTGR (T'&OPl EQ 'F') .FLOAT .TYPERR 'E'2 ,&0P1 2,&0P2 2,&SUM 'TIPOS DE OPERANDOS MEZCLADOS' 'TIPO DE OPERANDO ILEGAL' LAB ADD I,J,K LAB A ST L 2,J 2,K 2,I ADD X,Y,Z LE 2,X STE 2,Z (b) AE (C) 2,Y ADD I,Y,Z *** TIPOS DE OPERANDOS MEZCLADOS (d) FIGURA 4.12 Ejemplos de definición y expansión de macros en el Sistema/370. 1 MACRO 2 SUB’SIZE’3 3 TSTL 4 BGEQ 5 MNEGL 6 L1: .ENDM ABSDIF SUBL3 TSTL BGEQ MINEGL 30000$: ABSDIF SUBW3 TSTL BGEQ MNEGL 30001$: ABSDIF OP1, OP2, SIZE, NUM, ?L1 OP1, OP2, R’NUM R’NUM L1 R’NUM, R’NUM ABSDIF (a) X,Y,L,O X,Y,RO RO 30000$ RO,RO (b) I,J,W,2 I,J,R2 R2 30001$ R2,R2 (c) FIGURA 4.13 Ejemplos de definición y expansión de macros en VAX 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. macro 'for' id 'from' f ('by' b I /) 'to' t 'do' body:noneg 'od' begin <%id = %f %snum IF (%id .GT. %t) GO TO %(snum+l) %body %id = %id + >; if b * " then <(%b)> else <1> fi; <%/G0 TO %snum %(snum+l) CONTINUE %/>; snum := snum + 2; end (a) for I from 0 to n-1 do S := S + A(I) Od (b) I=0 IF (I .GT. N-1) G0 T0 9001 S = S + A(I) 1=1+1 G0 T0 9000 CONTINUE (c) FIGURA 4.14 Ejemplos de definición y expansión de macros en PM • La macro definida en la figura 4.14(a) está diseñada para su uso en FORTRAN • la invocación a macros es una proposición for parecida a la de ALGOL; • el texto de salida está en formato FORTRAN. • La línea 1 proporciona el patrón general para la proposición de invocación a macros: ▫ for, seguida de un parámetro id, seguido de la palabra clave from … • La expresión entre paréntesis de esta línea indica una alternativa, cuya primera posibilidad es la cláusula by y la segunda opción está vacía (indicada por /). • El patrón indica que una proposición de invocación a macros puede contener opcionalmente una cláusula by. • La especificación noneg unida al cuerpo del parámetro especifica que los espacios y los saltos de línea se consideran significativos. • El texto que se escribirá en la salida expandida está encerrado entre < y > . • Las líneas 3 a 6 contienen ese tipo de cadenas de salida. • El carácter % se utiliza como bandera para indicar parámetros y variables en el momento del procesamiento de macros. • La línea 3 especifica que el valor del parámetro id se escribirá a la salida, seguido de un signo igual y del valor del parámetro /. • En la figura 4.14(b) se muestra una proposición fuente que corresponde al patrón definido. • En la figura 4.14(c) se muestra la salida generada por la expansión de esta invocación a macros. Ejercicios en clase PARA EL LUNES 1. Buscar procesadores actuales de propósito general. 2. Selecciónense dos lenguajes de programación de alto nivel diferentes con los cuales se esté familiarizado. ¿Qué diferencias entre esos lenguajes pueden ser significativas para un procesador de macros que se vaya a utilizar con el lenguaje? 3. Lístense las funciones de utilidad y rutinas que podrían compartir un ensamblador y un procesador de macros integrado