Procesadores de Macros

Anuncio
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
Descargar