Vous êtes sur la page 1sur 14

Unidad I: Anlisis semntico

1.1

Arboles de expresiones

Los rboles de expresiones representan el cdigo de nivel del lenguaje en forma


de datos. Los datos se almacenan en una estructura con forma de rbol. Cada
nodo del rbol de expresin representa una expresin, por ejemplo, una llamada al
mtodo o una operacin binaria, como x < y.
Un rbol de expresin sirve para evaluar expresiones del tipo: (a + b)*c/d
Para que un rbol represente una expresin se deben tomar en cuenta 2
caractersticas muy importantes:

Cualquier hoja est etiquetada slo con un operando.

Cualquier nodo interior n est etiquetado por un operador.


+

Imagen 1. rbol de expresiones

Al introducir la expresin debemos de tomar en cuenta las siguientes


caractersticas:

La raz siempre debe ser un operador

Las hojas siempre deben ser operandos

Los nodos deben estar etiquetados por operadores

Si un operador tiene mayor prioridad que la raz se coloca como hijo.

Si un operador tiene igual o menor prioridad que un nodo se coloca


como padre.

Un nodo puede contener como hijo otro subrbol que contiene un


pequea expresin.

En los rboles de expresin, la sucesin del preorden de etiquetas nos da lo que


se conoce como la forma prefijo de una expresin
Anlogamente, la sucesin postorden de las etiquetas de un rbol expresin nos
da lo que se conoce como la representacin postfijo de una expresin
Finalmente, el inorden de una expresin en un rbol de expresin nos da la
expresin infijo en s misma, pero sin parntesis

Construccin de un rbol de expresin


Algoritmo

Mientras carcter diferente de nulo

Leer carcter de la lista

Si es parntesis pasar al siguiente carcter

Crear un nodo nuevo que contenga ese carcter

Operando

Si el rbol est vaco hacer raz a nuevo, si no recorrer el rbol por la


derecha hasta llegar a un nodo con hojas, si la hoja izquierda, no est
etiquetada colocar operando, si no colocarlo en la hoja derecha.

Operador

Si la raz es un operando, insertar nuevo en ese nodo, y convertir el


operando en el hijo izquierdo, si no si hay un parntesis abierto insertar
nuevo en la ltima hoja derecha y colocar operando como hijo izquierdo.

Si el carcter anterior es parntesis izquierdo si el siguiente carcter es


parntesis derecho si solo hay un operador en el rbol nuevo se convierte
en raz, si no se inserta en el ltimo nodo derecho, y el nodo se convierte
en hijo izquierdo.

Si no se cumple ninguna de las condiciones anteriores si la raz es de igual


prioridad o menor prioridad convertir la raz en el hijo izq. de nuevo si no la
prioridad del nodo raz es mayor al de nuevo insertar nuevo como hijo
derecho y colocar el nodo reemplazado como hijo izquierdo.

1.2

Acciones semnticas de un analizador sintctico

Definicin de un analizador sintctico: es la fase del analizador que se encarga de


chequear el texto de entrada en base a una gramtica dada. Y en caso de que el
programa de entrada sea vlido, suministra el rbol sintctico que lo reconoce.
En teora, se supone que la salida del analizador sintctico es alguna
representacin del rbol sintctico que reconoce la secuencia de Token
suministrada por el analizador lxico.
En la prctica, el analizador sintctico tambin hace:

Acceder a la tabla de smbolos (para hacer parte del trabajo del analizador
semntico).

Chequeo de tipos (del analizador semntico).

Generar cdigo intermedio.

Generar errores cuando se producen.

En definitiva, realiza casi todas las operaciones de la compilacin. Este


mtodo de trabajo da lugar a los mtodos de compilacin dirigidos por
sintaxis.

Manejo de errores sintcticos


Los errores sintcticos son dados por una expresin aritmtica o parntesis no
equilibrados.
El manejo de errores de sintaxis es el ms complicado desde el punto de vista de
la creacin de compiladores. Nos interesa que cuando el compilador encuentre un
error, se recupere y siga buscando errores. Por lo tanto el manejador de errores
de un analizador sintctico tiene como objetivos:

Indicar los errores de forma clara y precisa. Aclarar el tipo de error y


su localizacin.

Recuperarse del error, para poder seguir examinando la entrada.

No ralentizar significativamente la compilacin

Tipo de gramtica que acepta un analizador sintctico

Nosotros nos centraremos en el anlisis sintctico para lenguajes basados en


gramticas formales, ya que de otra forma se hace muy difcil la comprensin del
compilador, y se pueden corregir, quizs ms fcilmente, errores de muy difcil
localizacin, como es la ambigedad en el reconocimiento de ciertas sentencias.
La gramtica que acepta el analizador sintctico es una gramtica de contexto
libre:
Gramtica: G (N, T, P, S)
N = No terminales.
T = Terminales.
P = Reglas de Produccin.
S = Axioma Inicial.

1.3

Comprobaciones de tipos en expresiones

La labor de comprobacin de tipos consiste en conferir a las construcciones


sintcticas del lenguaje la semntica de tipificacin y en realizar todo tipo de
comprobaciones de dicha ndole. Por su naturaleza, sin embargo, sta se
encuentra repartida entre la fase de anlisis semntico y la generacin de cdigo
intermedio.

Comprobaciones estticas

Las comprobaciones estticas recogen el compendio de todas aquellas tareas de


carcter semntico que, por su naturaleza, pueden ser realizadas directamente
durante la fase de compilacin mediante el uso de los artefactos y mecanismos
propios de dicha fase. Este tipo de comprobaciones son beneficiosas puesto que
confieren seguridad a la ejecucin del programa.
Caractersticas

-Diferente de la dinmica en runtime.


-Ejemplo: comprobacin de tipos, flujo de control, unicidad.

Comprobaciones dinmicas

Las comprobaciones dinmicas son aquellas que no se realizan durante la fase de


compilacin y se delegan al momento de la ejecucin del programa. Ello requiere
generar

cdigo

ejecutable

especficamente

diseado

para

realizar

tales

comprobaciones. Los lenguajes con una carga excesiva de comprobaciones


dinmicas generan programas ms largos, lentos e inseguros en ejecucin.
Verificacin de tipos
Comprueba la compatibilidad de tipos de todas las expresiones del cdigo fuente
recuperando la informacin durante la gestin de declaraciones. Adems se
asegura de que no existe en el programa ninguna referencia a ningn smbolo no
declarado.

Inferencia de tipos
En lenguajes sin tipificacin de variables o con sobrecarga se aplican tareas de
inferencia de tipos en el nivel gramatical de las expresiones para resolver el tipo
de datos de la expresin resultante en funcin del contexto de evaluacin.

1.4

Pila semntica en un analizador sintctico

Las pilas y colas son estructuras de datos que se utilizan generalmente para
simplificar ciertas operaciones de programacin. Estas estructuras pueden
implementarse mediante arrays o listas enlazadas.
Pila: coleccin de datos a los cuales se les puede acceder mediante un extremo,
que se conoce generalmente como tope. Las pilas tienen dos operaciones
bsicas:

Push (para introducir un elemento)

Pop (para extraer un elemento)

Sus caractersticas fundamentales es que al extraer se obtiene siempre el ltimo


elemento que acabe de insertarse. Por esta razn tambin se conoce como
estructuras de datos LIFO, una posible implementacin mediante listas enlazadas
seria insertando y extrayendo siempre por el principio de la lista.
Las pilas se utilizan en muchas aplicaciones que utilizamos con frecuencia. Las
pilas y colas son estructuras de datos que se utilizan generalmente para simplificar
ciertas operaciones de programacin. Estas estructuras pueden implementarse
mediante arrays o listas enlazadas.
Un analizador sintctico es un autmata de pila que reconoce la estructura de
una cadena de componentes lxicos.
En general, el analizador sintctico inicializa el compilador y para cada smbolo de
entrada llama al analizador morfolgico y proporciona el siguiente smbolo de
entrada.
Al decir pila semntica no se refiere a que hay varios tipos de pila, hace referencia
a que se debe programar nica y exclusivamente en un solo lenguaje, es decir, no
podemos mezclar cdigo de C++ con Visual Basic.

Ventajas

Los problemas de integracin entre los subsistemas son sumamente


costosos y muchos de ellos no se solucionan hasta que la programacin
alcanza la fecha lmite para la integracin total del sistema.

Se necesita una memoria auxiliar que nos permita guardar los datos para
poder hacer la comparacin.

Objetivo terico
Es construir un rbol de anlisis sintctico, este raramente se construye como tal,
sino que las rutinas semnticas integradas van generando el rbol de Sintaxis
abstracta. Se especifica mediante una gramtica libre de contexto.
El anlisis semntico detecta la validez semntica de las sentencias aceptadas por
el analizador sintctico. El analizador semntico suele trabajar simultneamente al
analizador sintctico y en estrecha cooperacin. Se entiende por semntica como
el conjunto de reglas que especifican el significado de cualquier sentencia
sintcticamente correcta y escrita en un determinado lenguaje.
Las rutinas semnticas deben realizar la evaluacin de los atributos de las
gramticas siguiendo las reglas semnticas asociadas a cada produccin de la
gramtica.
El anlisis sintctico es la fase en la que se trata de determinar el tipo de los
resultados intermedios, comprobar que los argumentos que tiene un operador
pertenecen al conjunto de los operadores posibles, y si son compatibles entre s,
etc.
En definitiva, comprobar que el significado de la que se va leyendo es vlido. La
salida terica de la fase de anlisis semntico sera un rbol semntico. Consiste
en un rbol sintctico en el que cada una de sus ramas ha adquirido el significado
que debe tener.

Se compone de un conjunto de rutinas independientes, llamadas por los


analizadores morfolgico y sintctico. El anlisis semntico utiliza como entrada el
rbol sintctico detectado por el anlisis sintctico para comprobar restricciones de
tipo y otras limitaciones semnticas y preparar la generacin de cdigo.
Las rutinas semnticas suelen hacer uso de una pila que contiene la informacin
semntica asociada a los operadores en forma de registros semnticos.
Reglas semnticas
Son el conjunto de normas y especificaciones que definen al lenguaje de
programacin y estn dadas por la sintaxis del lenguaje, las reglas semnticas
asignan un significado lgico a ciertas expresiones definidas en la sintaxis del
lenguaje.
La evaluacin de las reglas semnticas define los valores de los atributos en los
nodos del rbol de anlisis sintctico para la cadena de entrada. Una regla
semntica tambin puede tener efectos colaterales, por ejemplo, imprimir un valor
o actualizar una variable global.
Compatibilidad de tipos
Durante la fase de anlisis semntico, el compilador debe verificar que los tipos y
valores asociados a los objetos de un programa se utilizan de acuerdo con la
especificacin del lenguaje.
Adems debe detectar conversiones implcitas de tipos para efectuarlas o insertar
el cdigo apropiado para efectuarlas as como almacenar informacin relativa a los
tipos de los objetos y aplicar las reglas de verificacin de tipos.
Analizadores descendentes:
Parten del axioma inicial de la gramtica, se va descendiendo utilizando las
derivaciones izquierdas, hasta llegar a construir la cadena analizada.

Se va construyendo el rbol desde sus nodos terminales. Es decir, se construye


desde los smbolos de cadena hasta llegar al axioma de la gramtica.
Bottom up
Es un principio de muchos aos del estilo de programacin que los elementos
funcionales de un programa no deben ser demasiado grandes. Si un cierto
componente de un programa crece ms all de la etapa donde est fcilmente
comprensible, se convierte en una masa de la complejidad que encubre errores
tan fcilmente como una ciudad grande encubre a fugitivos.
Top-down
Este mtodo consiste en dividir los problemas en subproblemas ms sencillos
para conseguir una solucin ms rpida. El diseo descendente es un mtodo
para resolver el problema que posteriormente se traducir a un lenguaje
compresible por la computadora.

Un parser ascendente utiliza durante el anlisis una pila. En esta va guardando


datos que le permiten ir haciendo las operaciones de reduccin que necesita.
Para incorporar acciones semnticas como lo es construir el rbol sintctico, es
necesario incorporar a la pila del parser otra columna que guarde los atributos de
los smbolos que se van analizando. Estos atributos estaran ligados a la
correspondiente produccin en la tabla de parsing.
La pila juega un papel fundamental en el desarrollo de cualquier analizador
semntico. Dentro de cada elemento de la pila se guardan los valores que pueden
tener una expresin.

1.5

Esquema de traduccin

Un esquema de traduccin es una gramtica independiente de contexto en la que


se asocian atributos con los smbolos gramaticales y se insertan acciones
semnticas encerradas entre llaves { } dentro de los lados derechos de las
producciones. Los esquemas de traduccin pueden tener tantos atributos
sintetizados como heredados.
Cuando se disea un esquema de traduccin, se deben respetar algunas
limitaciones para asegurarse de que el valor de un atributo est disponible cuando
una accin se refiera a l. Estas limitaciones, motivadas por las definiciones con
atributos por la izquierda, garantizan que las acciones no hagan referencia a un
atributo que an no haya sido calculado. El ejemplo ms sencillo ocurre cuando
slo se necesitan atributos sintetizados, en este caso, se puede construir el
esquema de traduccin creando una accin que conste de una asignacin para
cada regla semntica y colocando esta accin al final del lado derecho de la
produccin asociada.

Traduccin descendente
Se trabaja con esquema de traduccin en lugar de hacerlo con definiciones
dirigidas por sintaxis, as que se puede ser explcito en cuanto al orden en que
tienen que lugar las acciones y las evaluaciones de los atributos.
Eliminacion de la recursividad izquierda de un esquema de traduccin
Como la mayora de los operadores aritmticos son asociativos por la izquierda,
es natural utilizar gramticas recursivas por la izquierda para las expresiones. La
transformacin se aplica a esquemas de traduccin con atributos sintetizados.
Para el anlisis sintctico descendente, se supone que una accin se ejecuta en el
mismo momento en que se expandira un smbolo en la misma posicin. Un
atributo heredado de un smbolo debe ser calculado por una accin que aparezca
antes que el smbolo, y un atributo sintetizado del no terminal de la izquierda se

debe calcular despus de que hayan sido calculados todos los atributos de los que
depende.

Un atributo heredado de un smbolo debe ser calculado por una accin que
aparezca antes que el smbolo, y un atributo sintetizado del no terminal de la
izquierda se debe calcular despus de que hayan sido calculados todos los
atributos de los que depende.
Los fragmentos de cdigo as insertados se denominan acciones semnticas.
Dichos fragmentos actan, calculan y modifican los atributos asociados con los
nodos del rbol sintctico. El orden en que se evalan los fragmentos es el de un
recorrido primero-profundo del rbol de anlisis sintctico.
Obsrvese que, en general, para poder aplicar un esquema de traduccin hay que
construir el rbol sintctico y despus aplicar las acciones empotradas en las
reglas en el orden de recorrido primero-profundo. Por supuesto, si la gramtica es
ambigua una frase podra tener dos rboles y la ejecucin de las acciones para
ellos podra dar lugar a diferentes resultados. Si se quiere evitar la multiplicidad de
resultados (interpretaciones semnticas) es necesario precisar de qu rbol
sintctico concreto se est hablando.

1.6

Generacin de la tabla de smbolo y de direcciones

Las tablas de smbolos (tambin llamadas tablas de identificadores y tablas de


nombres), realizan dos importantes funciones en el proceso de traduccin:
verificar que la semntica sea correcta y ayudar en la generacin apropiada de
cdigo. Ambas funciones se realizan insertando o recuperando desde la tabla de
smbolos los atributos de las variables usadas en el programa fuente. Estos atributos,

tales como: el nombre, tipo, direccin de almacenamiento y dimensin de una


variable, usualmente se encuentran explcitamente en las declaraciones o ms
implcitamente a travs del contexto en que aparecen los nombres de variables en
el programa.
Una de las estructuras de datos que se encuentran relacionadas con las fases del
proceso de compilacin es la tabla de smbolos, la cual tiene como propsito
registrar informacin que se comparte entre varias etapas y que permite
administrar los recursos asociados a las entidades que manipular el programa.
La tabla de smbolos tiene tpicamente la siguiente estructura:
Una tabla de smbolos puede conceptualizarse como una serie de renglones, cada
uno de los cuales contiene una lista de valores de atributos que son asociados con
una variable en particular. Las clases de los atributos que aparecen en una tabla
de smbolos dependen en algn grado de la naturaleza del lenguaje de
programacin para el cual se escribe el compilador.
Por ejemplo, un lenguaje puede ser sin tipos, y por lo tanto el atributo tipo no
necesita aparecer en la tabla. Similarmente, la organizacin de la tabla de
smbolos variar dependiendo de las limitaciones de memoria y tiempo de acceso.

1.7

Manejo de errores semnticos

Es una de las misiones ms importantes de un compilador, aunque, al mismo


tiempo, es lo que ms dificulta su realizacin. A veces unos errores ocultan otros.
A veces un error provoca una avalancha de muchos errores que se solucionan con
el primero.
Es conveniente un buen manejo de errores, y que el compilador detecte todos los
errores que tiene el programa y no se pare en el primero que encuentre. Hay,
pues, dos criterios a seguir a la hora de manejar errores:

Pararse al detectar el primer error.

Detectar todos los errores de una pasada.

El anlisis semntico es posterior al sintctico y mucho ms difcil de formalizar


que ste. Se trata de determinar el tipo de los resultados intermedios, comprobar
que los argumentos que tiene un operador pertenecen al conjunto de los
operadores posibles, y si son compatibles entre s, etc. En definitiva, comprobar
que el significado de lo que se va leyendo es vlido.
La salida "terica" de la fase de anlisis semntico sera un rbol semntico.
Consiste en un rbol sintctico en el que cada una de sus ramas ha adquirido el
significado que debe tener. En el caso de los operadores polimrficos (un nico
smbolo con varios significados), el anlisis semntico determina cul es el
aplicable.

Vous aimerez peut-être aussi