748

Capítulo 17 Estructuras de datos

Sección especial: construya su propio compilador

En los ejercicios 7.34 y 7.35 presentamos el Lenguaje Máquina Simpletron (LMS) y usted implementó un simulador 
de computadora Simpletron para ejecutar programas escritos en LMS. En esta sección crearemos un compilador que 
convierta los programas escritos en un lenguaje de programación de alto nivel a LMS. Esta sección “enlaza” entre sí 
todo el proceso de programación. Usted escribirá programas en este nuevo lenguaje de alto nivel, los compilará en el 
compilador que va a construir y los ejecutará en el simulador que construyó en el ejercicio 7.35. Usted deberá hacer 
todo el esfuerzo posible por implementar su compilador con un enfoque orientado a objetos.

17.26 

(El lenguaje Simple) Antes de empezar a construir el compilador, hablaremos sobre un lenguaje de alto nivel 

simple pero poderoso, similar a las primeras versiones del popular lenguaje BASIC. Llamaremos a este lenguaje 

Simple

Cada 

instrucción de Simple consiste de un número de línea y de una instrucción de Simple. Los números de línea deben 

aparecer en orden ascendente. Cada instrucción empieza con uno de los siguientes 

comandos de Simple: 

rem

input

let

print

goto

if/goto

 o 

end

 (vea la fi gura 17.22). Todos los comandos excepto 

end

 pueden utilizarse en forma repetida. 

Simple evalúa solamente las expresiones de enteros que utilizan los operadores 

+

-

*

 y 

/

. Estos operadores tienen la 

misma precedencia que en Java. Pueden utilizarse paréntesis para cambiar el orden de evaluación de una expresión.

Nuestro compilador de Simple reconoce solamente letras en minúscula; por lo tanto, todos los caracteres en un 

archivo de Simple deben estar en minúsculas. (Las letras mayúsculas producen un error de sintaxis a menos que aparez-
can en una instrucción 

rem

, en cuyo caso se ignoran). Un 

nombre de variable es una sola letra. Simple no permite el uso 

de nombres descriptivos para las variables, por lo que éstas deben explicarse en comentarios para indicar su uso en un 
programa. Simple utiliza solamente variables enteras. Simple no tiene declaraciones de variables; con sólo mencionar 
el nombre de una variable en un programa, ésta se declara y se inicializa con cero. La sintaxis de Simple no permite la 
manipulación de cadenas (leer una cadena, escribir una cadena, comparar cadenas, etcétera). Si se encuentra una cadena 
en un programa de Simple (después de un comando distinto de 

rem

), el compilador genera un error de sintaxis. La pri-

mera versión de nuestro compilador supone que los programas de Simple se introducen correctamente. En el ejercicio 
17.29 pedimos al lector que modifi que el compilador para llevar a cabo la comprobación de errores de sintaxis.

Simple utiliza la instrucción 

if/goto

 condicional y la instrucción 

goto

 incondicional para alterar el fl ujo de con-

trol durante la ejecución del programa. Si la condición en la instrucción 

if/goto

 es verdadera, el control se transfi ere 

a una línea específi ca del programa. Los siguientes operadores relacionales y de igualdad son válidos en una instrucción 

if/goto

<

>

<=

>=

==

 o 

!=

. La precedencia de estos operadores es la misma que en Java.

Consideremos ahora varios programas para demostrar las características de Simple. El primer programa (fi gura 

17.23) lee dos enteros del teclado, almacena los valores en las variables 

a

 

b

, calcula e imprime su suma (almacenada 

en la variable 

c

).

El programa de la fi gura 17.24 determina e imprime el mayor de dos enteros. Los enteros se introducen desde 

el teclado y se almacenan en 

s

 

t

. La instrucción 

if/goto

 evalúa la condición 

s

 

>=

 

t

. Si es verdadera, el control se 

transfi ere a la línea 

90

 y se muestra el valor de 

s

 en pantalla; en caso contrario se muestra 

t

 y el control se transfi ere a la 

instrucción 

end

 de la línea 

99

, en donde termina el programa.

    99
  97
    92
 83
    72
  71
    69
49
    44
  40
    32
 28
    19
  18
    11

Figura 17.21

  |  Resultados de ejemplo del método recursivo 

mostrarArbol

.

17_MAQ_CAP_17_DEITEL.indd748

4/19/081:30:14AM