Documente Academic
Documente Profesional
Documente Cultură
Anlisis sintctico
En esta fase los caracteres o componentes lxicos se agrupan jerrquicamente
en frases gramaticales que el compilador utiliza para sintetizar la salida. Se
comprueba si lo obtenido de la fase anterior es sintcticamente correcto
(obedece a la gramtica del lenguaje). Por lo general, las frases gramaticales
del programa fuente se representan mediante un rbol de anlisis sintctico.
La estructura jerrquica de un programa normalmente se expresa utilizando
reglas recursivas. Por ejemplo, se pueden dar las siguientes reglas como parte
de la definicin de expresiones:
1. Cualquier identificador es una expresin.
2. Cualquier nmero es una expresin.
3. Si expresin1 y expresin2 son expresiones, entonces tambin lo son:
expresin1 + expresin2
expresin1 * expresin2
( expresin1 )
Las reglas 1 y 2 son reglas bsicas (no recursivas), en tanto que la regla 3
define expresiones en funcin de operadores aplicados a otras expresiones.
La divisin entre anlisis lxico y anlisis sintctico es algo arbitraria. Un factor
para determinar la divisin es si una construccin del lenguaje fuente es
inherentemente recursiva o no. Las construcciones lxicas no requieren
recursin, mientras que las construcciones sintcticas suelen requerirla. No se
requiere recursin para reconocer los identificadores, que suelen ser cadenas
de letras y dgitos que comienzan con una letra. Normalmente, se reconocen
los identificadores por el simple examen del flujo de entrada, esperando hasta
encontrar un carcter que no sea ni letra ni dgito, y agrupando despus todas
las letras y dgitos encontrados hasta ese punto en un componente lxico
llamado identificador. Por otra parte, esta clase de anlisis no es
suficientemente poderoso para analizar expresiones o proposiciones. Por
ejemplo, no podemos emparejar de manera apropiada los parntesis de las
expresiones, o las palabras begin y end en proposiciones sin imponer alguna
clase de estructura jerrquica o de anidamiento a la entrada.
Anlisis semntico
rbol sintctico
Si el analizador sintctico genera un rbol sintctico, por lo regular se
construye como una estructura estndar basada en un puntero que se asigna
de manera dinmica a medida que se efecta el anlisis sintctico. El rbol
entero puede entonces conservarse como una variable simple que apunta al
nodo raz. Cada nodo en la estructura es un registro cuyos campos representan
la informacin recolectada tanto por el analizador sintctico como,
posteriormente, por el analizador semntico. Por ejemplo, el tipo de datos de
una expresin puede conservarse como un campo en el nodo del rbol
sintctico para la expresin.
En ocasiones, para ahorrar espacio, estos campos se asignan de manera
dinmica, o se almacenan en otras estructuras de datos, tales como la tabla de
smbolos, que permiten una asignacin y desasignacin selectivas. En realidad,
cada nodo del rbol sintctico por s mismo puede requerir de atributos
diferentes para ser almacenado, de acuerdo con la clase de estructura del
lenguaje que represente. En este caso, cada nodo en el rbol sintctico puede
estar representado por un registro variable, con cada clase de nodo
conteniendo solamente la informacin necesaria para ese caso.
Tabla de smbolos
Esta estructura de datos mantiene la informacin asociada con los
identificadores: funciones, variables, constantes y tipos de datos. La tabla de
smbolos interacta con casi todas las fases del compilador: el analizador
lxico, el analizador sintctico o el analizador semntico pueden introducir
identificadores dentro de la tabla; el analizador semntico agregar tipos de
datos y otra informacin; y las fases de optimizacin y generacin de cdigo
utilizarn la informacin proporcionada por la tabla de smbolos para efectuar
selecciones apropiadas de cdigo objeto.
Puesto que la tabla de smbolos tendr solicitudes de acceso con tanta
frecuencia, las operaciones de insercin, eliminacin y acceso necesitan ser
eficientes, preferiblemente operaciones de tiempo constante. Una estructura
de datos estndar para este propsito es la tabla de dispersin o de clculo de
direccin, aunque tambin se pueden utilizar diversas estructuras de rbol. En
ocasiones se utilizan varias tablas y se mantienen en una lista o pila.
Tabla de literales
La bsqueda y la insercin rpida son esenciales tambin para la tabla de
literales, la cual almacena constantes y cadenas utilizadas en el programa. Sin
embargo, una tabla de literales necesita impedir las eliminaciones porque sus
datos se aplican globalmente al programa y una constante o cadena aparecer
slo una vez en esta tabla. La tabla de literales es importante en la reduccin
temp1 := entreal(60)
temp2 := id3 * temp1
===> (2)
Optimizacin de Cdigo
La fase de optimizacin de cdigo trata de mejorar el cdigo intermedio de
modo que resulte un cdigo de mquina ms rpido de ejecutar. Algunas
optimizaciones son triviales. Por ejemplo, un algoritmo natural genera el cdigo
intermedio (2) utilizando una instruccin para cada operador de la
representacin del rbol despus del anlisis semntico, aunque hay una forma
mejor de realizar los mismos clculos usando las dos instrucciones
===> (3)