750

Capítulo 17 Estructuras de datos

if/goto

 y 

goto

. En la fi gura 17.25 se utiliza un ciclo controlado por centinela para calcular los cuadrados de varios 

enteros. Cada entero se introduce desde el teclado y se almacena en la variable 

j

. Si el valor introducido es el valor 

centinela 

-9999

, el control se transfi ere a la línea 

99

, en donde termina el programa. En caso contrario, a 

k

 se le asigna 

el cuadrado de 

j

k

 se muestra en pantalla y el control se pasa a la línea 

20

, en donde se introduce el siguiente entero.

Utilizando los programas de ejemplo de las fi guras 17.23 a 17.25 como guía, escriba un programa de Simple para 

realizar cada una de las siguientes acciones:
 

a) Introducir tres enteros, determinar su promedio e imprimir el resultado.

 

b) Usar un ciclo controlado por centinela para introducir 10 enteros, calcular e imprimir su suma.

 

c) Usar un ciclo controlado por contador para introducir 7 enteros, algunos positivos y otros negativos, 

calcular e imprimir su promedio.

 

d) Introducir una serie de enteros, determinar e imprimir el mayor. El primer entero introducido indica cuán-

tos números deben procesarse.

 

e) Introducir 10 enteros e imprimir el menor.

 

f) Calcular e imprimir la suma de los enteros pares del 2 al 30.

 

g) Calcular e imprimir el producto de los enteros impares del 1 al 9.

 1 

10 rem  

calcular los cuadrados de varios enteros

 2 

20 input j

 3 

23 rem

 4 

25 rem  

evaluar el valor centinela

 5 

30 if j == -9999 goto 99

 6 

33 rem

 7 

35 rem  

calcular el cuadrado de j y asignar el resultado a k

 8 

40 let k = j * j

 9 

50 print k

 10 

53 rem

 11 

55 rem  

iterar para obtener el siguiente valor de j

 12 

60 goto 20

 13 

99 end

Figura 17.25

  |  Calcular los cuadrados de varios enteros.

17.27  

(Construcción de un compilador; prerrequisitos: completar los ejercicios 7.34, 7.35, 17.12, 17.13 y 17.26) Ahora 

que hemos presentado el lenguaje Simple (ejercicio 17.26), hablaremos sobre cómo construir un compilador de Simple. 
Primero debemos considerar el proceso mediante el cual un programa de Simple se convierte a LMS y se ejecuta por 
el simulador Simpletron (vea la fi gura 17.26). El compilador lee un archivo que contiene un programa de Simple y lo 
convierte en código de LMS. Este código se envía a un archivo en disco, en el que las instrucciones de LMS aparecen 
una en cada línea. Después el archivo de LMS se carga en el simulador Simpletron y los resultados se envían a un archi-
vo en disco y a la pantalla. Observe que el programa de Simpletron desarrollado en el ejercicio 7.35 acepta su entrada 
mediante el teclado. Este programa debe modifi carse para que lea desde un archivo y así pueda ejecutar los programas 
producidos por nuestro compilador.

El compilador de Simple realiza dos 

pasadasdel programa de Simple para convertirlo en LMS. En la primera 

pasada se construye una 

tabla de símbolos (objeto) en la que cada número de línea (objeto), nombre de variable (objeto) y 

constante(objeto) del programa de Simple se guarda con su tipo y ubicación correspondiente en el código fi nal de LMS 
(la tabla de símbolos se describe detalladamente a continuación). En la primera pasada también se produce(n) el (los)
objeto(s) correspondientes a la instrucción de LMS para cada una de las instrucciones de Simple (objeto, etcétera). Si 
el programa de Simple contiene instrucciones que transfi eren el control a una línea que se encuentra más adelante en el 
programa, la primera pasada produce un programa de LMS que contiene algunas instrucciones “no terminadas”. En 
la segunda pasada del compilador se localizan y completan las instrucciones no terminadas, y se envía el programa de 
LMS a un archivo.

Primera pasada

El compilador empieza leyendo una instrucción del programa de Simple y la coloca en memoria. La línea debe separarse 
en sus 

tokens individuales (es decir, “piezas” de una instrucción) para su procesamiento y compilación. (Puede usarse la 

clase 

StreamTokenizer

 del paquete 

java.io

). Recuerde que todas las instrucciones empiezan con un número de línea, 

17_MAQ_CAP_17_DEITEL.indd750

4/19/081:30:15AM