Sie sind auf Seite 1von 4

Etapa de anlisis

En esta etapa se controla que el texto fuente sea correcto en todos los sentidos, y se
generan las estructuras necesarias para la generacin de cdigo.

Fase de anlisis lexicogrfico


En esta fase, la cadena de caracteres que constituye el programa fuente se lee de
izquierda a derecha y se agrupa en componentes lxicos, que son secuencias de
caracteres que tienen un significado atmico; adems el analizador lxico trabaja con la
tabla de smbolos introduciendo en sta los nombres de las variables.
En nuestro ejemplo los caracteres de la proposicin de asignacin

Se agruparan en los componentes lxicos siguientes:


1.- El identificador comisin.
2.- El smbolo de asignacin =. 3.- El identificador fijo.
4.- El signo de suma +.
5.- El identificador valor.
6.- El signo de multiplicacin *.
7.- El nmero 8.
8.- El smbolo de fin de sentencia ;.
La figura ilustra cmo cada componente lxico se traduce a su categora gramatical, y se
le asocia alguna informacin, que puede ser un puntero a la tabla de smbolos donde se
describe el identificador, o incluso un valor directo, como ocurre en el caso del literal 8.
As, cada componente se convierte en un par (categora, atributo), y se actualiza la tabla
de smbolos. Esta secuencia de pares se le pasa a la siguiente fase de anlisis.
Ntese como los espacios en blanco que separan los caracteres de estos componentes
lxicos normalmente se eliminan durante el anlisis lxico, siempre y cuando la definicin
del lenguaje a compilar as lo aconseje, como ocurre en C. Lo mismo pasa con los
tabuladores innecesarios y con los retornos de carro. Los comentarios, ya estn anidados
o no, tambin son eliminados.

Fase de anlisis sintctico


Trabaja con una gramtica de contexto libre y genera el rbol sintctico que reconoce su
sentencia de entrada. En nuestro caso las categoras gramaticales del anlisis lxico son
los terminales de la gramtica. Para el ejemplo que nos ocupa podemos partir de la
gramtica:

de manera que el anlisis sintctico intenta generar un rbol sintctico que encaje con la
sentencia de entrada. Para nuestro ejemplo, dicho rbol sintctico existe y es el de la
figura. El rbol puede representarse tal y como aparece en esta figura, o bien invertido.

Fase de anlisis semntico


Esta fase revisa el rbol sintctico junto con los atributos y la tabla de smbolos para tratar
de encontrar errores semnticos. Para todo esto se analizan los operadores y operandos
de expresiones y proposiciones. Finalmente rene la informacin necesaria sobre los
tipos de datos para la fase posterior de generacin de cdigo.
El componente ms importante del anlisis semntico es la verificacin de tipos. Aqu, el
compilador verifica si los operandos de cada operador son compatibles segn la
especificacin del lenguaje fuente. Si suponemos que nuestro lenguaje solo trabaja con
nmeros reales, la salida de esta fase sera su mismo rbol, excepto porque el atributo de
<NUM>, que era el entero 8 a la entrada, ahora pasara a ser el real 8,0. Adems se ha
debido controlar que las variables implicadas en la sentencia, a saber, comisin, fijo y
valor son compatibles con el tipo numrico de la constante 8,0.

Etapa de sntesis
En la etapa anterior se ha controlado que el programa de entrada es correcto. Por tanto,
el compilador ya se encuentra en disposicin de generar el cdigo mquina equivalente
semnticamente al programa fuente. Para ello se parte de las estructuras generadas en
dicha etapa anterior: rbol sintctico y tabla de smbolos.

Fase de generacin de cdigo intermedio

Despus de la etapa de anlisis, se suele generar una representacin intermedia explcita


del programa fuente. Dicha representacin intermedia se puede considerar como un
programa para una mquina abstracta.
Cualquier representacin intermedia debe tener dos propiedades importantes; debe ser
fcil de generar y fcil de traducir al cdigo mquina destino. As, una representacin
intermedia puede tener diversas formas. En el presente ejemplo se trabajar con una
forma intermedia llamada cdigo de tres direcciones, que es muy parecida a un lenguaje
ensamblador para un microprocesador que carece de registros y slo es capaz de trabajar
con direcciones de memoria y literales. En el cdigo de tres direcciones cada instruccin
tiene como mximo tres operandos. Siguiendo el ejemplo propuesto, se generara el
siguiente cdigo de tres direcciones:

De este ejemplo se pueden destacar varias propiedades del cdigo intermedio escogido:
Cada instruccin de tres direcciones tiene a lo sumo un operador, adems de la
asignacin.
El compilador debe generar un nombre temporal para guardar los valores intermedios
calculados por cada instruccin: t1, t2 y t3.
Algunas instrucciones tienen menos de tres operandos, como la primera y la ltima
instrucciones del ejemplo.

Fase de optimizacin de cdigo


Esta fase trata de mejorar el cdigo intermedio, de modo que en la siguiente fase resulte
un cdigo de mquina ms rpido de ejecutar. Algunas optimizaciones son triviales. En
nuestro ejemplo hay una forma mejor de realizar el clculo de la comisin, y pasa por
realizar sustituciones triviales en la segunda y cuarta instrucciones, obtenindose:
t2 = valor * 8.0
comisin= fijo + t2
El compilador puede deducir que todas las apariciones de la variable t1 pueden sustituirse
por la constante 8,0, ya que a t1 se le asigna un valor que ya no cambia, de modo que la
primera instruccin se puede eliminar. Algo parecido sucede con la variable t3, que se
utiliza slo una vez, para transmitir su valor a comisin en una asignacin directa, luego
resulta seguro sustituir comisin por t3, a raz de lo cual se elimina otra de las lneas del
cdigo intermedio.

Fase de generacin de cdigo mquina

La fase final de un compilador es la generacin de cdigo objeto, que por lo general


consiste en cdigo mquina reubicable o cdigo ensamblador. Cada una de las variables
usadas por el programa se traduce a una direccin de memoria (esto tambin se ha
podido hacer en la fase de generacin de cdigo intermedio). Despus, cada una de las
instrucciones intermedias se traduce a una secuencia de instrucciones de mquina que
ejecuta la misma tarea. Un aspecto decisivo es la asignacin de variables a registros.
Siguiendo el mismo ejemplo, y utilizando los registros R1 y R2 de un microprocesador
hipottico, la traduccin del cdigo optimizado podra ser:

El primer y segundo operandos de cada instruccin especifican una fuente y un destino,


respectivamente. Este cdigo traslada el contendido de la direccin [1Ah] al registro R1,
despus lo multiplica por la constante real 8.0. La tercera instruccin pasa el contenido de
la direccin [15h] al registro R2. La cuarta instruccin le suma el valor previamente
calculado en el registro R1. Por ltimo el valor del registro R2 se pasa a la direccin [10h].
Como el lector puede suponer, la variable comisin se almacena en la direccin [10h], fijo
en [15h] y valor en [1Ah].

Das könnte Ihnen auch gefallen