Está en la página 1de 7

OBJETIVO UNIDAD I

La unidad I. Anlisis Semntico


La primera unidad se centra totalmente en el analizador semntico, por lo que el analizador
sintctico debi ser concluido en la materia de lenguajes y autmatas I, ya que servir de base
en esta unidad.
El objetivo de esta unidad consiste en:
Disear mediante el uso de rboles de expresiones dirigidas por la sintaxis un analizador
semntico para construir un metacompilador.

INTRODUCCIN UNIDAD I
Esta asignatura busca proveer al estudiante de herramientas, conocimientos y habilidades
necesarias para desarrollar un compilador con base en los conocimientos previos de la
asignatura lenguajes y autmatas I.
La aportacin de esta materia es relevante en el mbito del desarrollo de software de
sistemas. Es indispensable distinguir que la carrera de Ingeniera en Sistemas Computacionales
se basa no slo en el desarrollo de software comercial y administrativo, sino tambin en el
desarrollo de software cientfico y para el desarrollo tecnolgico. Esta materia se ubica en la
segunda categora y es indispensable desarrollar software en estos campos para preparar a
los egresados y tengan la posibilidad de cursar posgrados de alto nivel.
La asignatura trata de concretar un traductor iniciado en la materia previa para que el estudiante
comprenda que es capaz, mediante tcnicas bien definidas, de crear su propio lenguaje de
programacin.
La materia consta de cuatro bloques estructurados y definidos que abarcan la ltima etapa de
la fase de anlisis y sntesis. Al trmino del semestre se debe obtener un compilador o traductor
completo, funcionando de acuerdo a ciertas restricciones y requisitos.

TEMAS A TRATAR UNIDAD I. ANLISIS


SEMNTICO
Unidad I: Anlisis Semntico
1.1.

ANALIZADOR SEMNTICO

La fase de anlisis semntico de un procesador de lenguaje es aqulla que computa la


informacin adicional necesaria para el procesamiento de un lenguaje, una vez que la estructura
sintctica de un programa haya sido obtenida. Es por tanto la fase posterior a la de anlisis
sintctico y la ltima dentro del proceso de sntesis de un lenguaje de programacin.

La sintaxis de un lenguaje de programacin es el conjunto de reglas formales que especifican


la estructura de los programas pertenecientes a dicho lenguaje. Semntica de un lenguaje de
programacin es el conjunto de reglas que especifican el significado de cualquier sentencia
sintcticamente vlida.

Finalmente, el anlisis semntico de un procesador de lenguaje es la fase encargada de


detectar la validez semntica de las sentencias aceptadas por el analizador sintctico.

Dado el siguiente ejemplo en cdigo c:


Superficie = base * altura / 2;

La sintaxis del lenguaje C indica que las expresiones se pueden formar con un conjunto de
operadores y un conjunto de elementos bsicos. Entre los operadores, con sintaxis binaria infija,
se encuentran la asignacin, el producto y la divisin. Entre los elementos bsicos de una
expresin existen los identificadores y las constantes enteras sin signo (entre otros).

Su semntica identifica que en el registro asociado al identificador superficie se le va a asociar


el valor resultante del producto de los valores asociados a base y altura, divididos por dos (la
superficie de un tringulo).

Finalmente, el anlisis semntico del procesador de lenguaje, tras haber analizado


correctamente que la sintaxis es vlida, deber comprobar que se satisfacen las siguientes
condiciones:

Que todos los identificadores que aparecen en la expresin hayan sido declarados en el
mbito actual, o en alguno de sus mbitos (bloques 2 ) previos.
Que la subexpresin de la izquierda sea semnticamente vlida, es decir, que sea un lvalue
3.
Que a los tipos de los identificadores base y altura se les pueda aplicar el operador de
multiplicacin. Un registro en C, por ejemplo, no sera vlido.
Deber inferirse el tipo resultante de la multiplicacin anterior. Al tipo inferido se le deber
poder aplicar el operador de dividir, con el tipo entero como multiplicando.
Deber inferirse el tipo resultante de la divisin y comprobarse si ste es compatible con el
tipo de superficie para llevar a cabo la asignacin. Como ejemplo, si superficie fuese entera
y division real, no podra llevarse a cabo la asignacin.

El objetivo principal del analizador semntico de un procesador de lenguaje es asegurarse de


que el programa analizado satisfaga las reglas requeridas por la especificacin del lenguaje,
para garantizar su correcta ejecucin. El tipo y dimensin de anlisis semntico requerido vara
enormemente de un lenguaje a otro. En lenguajes interpretados como Lisp o Smalltalk casi no
se lleva a cabo anlisis semntico previo a su ejecucin, mientras que en lenguajes como Ada,
el analizador semntico deber comprobar numerosas reglas que un programa fuente est
obligado a satisfacer.

Vemos, pues, cmo el anlisis semntico de un procesador de lenguaje no modela la semntica


o comportamiento de los distintos programas construidos en el lenguaje de programacin, sino
que, haciendo uso de informacin parcial de su comportamiento, realiza todas las
comprobaciones necesarias no llevadas a cabo por el analizador sintctico para asegurarse
de que el programa pertenece al lenguaje. Otra fase del compilador donde se hace uso parcial
de la semntica del lenguaje es en la optimizacin de cdigo, en la que analizando el significado
de los programas previamente a su ejecucin, se pueden llevar a cabo transformaciones en los
mismos para ganar en eficiencia.
1.2.

VERIFICACION DE TIPOS DE EXPRESIONES

Sistema de Tipos
Reglas de un lenguaje que permiten asignar tipos a las distintas partes de un programa y
verificar su correccin.

Formado por las definiciones y reglas que permiten comprobar el dominio de un


identificador, y en qu contextos puede ser usado.
Cada lenguaje tiene un sistema de tipos propio, aunque puede variar de una a otra
implementacin.
La comprobacin de tipos es parte del anlisis semntico.

Funciones Principales:

Reglas de un lenguaje que permiten asignar tipos a las distintas partes de un programa y
verificar su correccin.
Inferencia de tipos: calcular y mantener la informacin sobre los tipos de datos.
Verificacin de tipo: asegurar que las partes de un programa tienen sentido segn las reglas
de tipo del lenguaje.

La informacin de tipos puede ser esttica o dinmica:

LISP, CAML o Smalltalk utilizan informacin de tipos dinmica.


En ADA, Pascal o C la informacin de tipos es esttica.
Tambin puede ser una combinacin de ambas formas.

Cuantas ms comprobaciones puedan realizarse en la fase de compilacin, menos tendrn que


realizarse durante la ejecucin.

Mayor eficiencia del programa objeto.

Es parte de la comprobacin de tipos:

Conversin de tipos explcita: transformacin del tipo de una expresin con un propsito
determinado.
Coercin: conversin de tipos que realiza de forma implcita el compilador.

Conversin de tipos explcita: el programador indica el tipo destino:

Funciona como una llamada a funcin: recibe un tipo y devuelve otro.

Conversin de tipos implcita: el compilador convierte automticamente elementos de un tipo en


elementos de otro:

La conversin se lleva a cabo en la accin semntica de la regla donde se realiza.

Comprobador de tipos seguro : Durante la compilacin (comprobacin esttica) detecta todos


los posibles errores de tipo.

Lenguaje fuertemente tipado : Si un fragmento de cdigo compila es que no se van a


producir errores de tipo.

En la prctica , ningn lenguaje es tan fuertemente tipado que permita una completa
comprobacin esttica.

Informacin de tipos dinmica : El compilador debe generar cdigo que realice la inferencia y
verificacin de tipos durante la ejecucin del programa que se est compilando.
Informacin de tipos esttica:

Se utiliza para verificar la exactitud del programa antes de la ejecucin.


Permite determinar la asignacin de memoria necesaria para cada variable.

Tipo de datos = conjunto de valores + operaciones aplicables


En el mbito de los compiladores, un tipo se define mediante una expresin de tipo (informacin
de tipos explcita):

Nombre de tipo: float.


Expresin estructurada explcita: set of integer.
Estas expresiones se utilizan en la construccin de otros tipos o para declarar variables.

Tambin es posible incluir informacin de tipos implcita:


La informacin de tipos, implcita o explcita, se mantiene en la tabla de smbolos:

Esta informacin se recupera de la tabla de smbolos mediante el verificador de tipo cuando


se hace referencia al nombre asociado.

Ejemplo:

Un lenguaje de programacin contiene un conjunto de tipos predefinido denominados tipos


simples:

Algunos lenguajes permiten definir nuevos tipos simples: enumerado, subrango.

Todos los lenguajes permiten crear nuevos tipos complejos a partir de otros ms simples
mediante constructores de tipos:

Matrices, productos, registros, punteros, funciones,


En Pascal: array, set, record, ...
En C++: struct, class, union, ....

Para analizar los diferentes tipos que intervienen dentro de un programa, el compilador debe
contar con una estructura interna que le permita manejar cmodamente las expresiones de
tipos.
Esta estructura interna:

Debe ser fcilmente manipulable, pues su creacin se realizar conforme se hace la lectura
del programa fuente.
Debe permitir comparar fcilmente las expresiones asignadas a distintos trozos de cdigo,
especialmente a los identificadores de variables..

La forma ms habitual de representacin son los grafos acclicos dirigidos (GADs).

La ventaja de estas representaciones es que ocupan poca memoria y por tanto la


comprobacin de equivalencia se efecta con rapidez.

Ejemplos:

1.3 GRAMATICAS DE ATRIBUTOS


Un atributo es cualquier propiedad de una construccin de un lenguaje de programacin. Varan
en funcin del tipo de informacin que contienen, su complejidad de clculo y el momento en el
que son calculados (en tiempo de compilacin (atributos estticos) o de ejecucin (dinmicos).
Ejemplos tpicos son :

El nombre de una variable.


El tipo de una variable.
El mbito de una variable.
El valor de una expresin.
El nmero de argumentos de una funcin.
La posicin en memoria de una variable.
Un fragmento de cdigo.

Una gramtica con atributos es una generalizacin


denominada definicin dirigida por la sintaxis:

de las gramticas libres de contexto,

Cada smbolo gramatical puede tener asociado un conjunto finito de atributos, que pueden
ser de los siguientes tipos:
o Su valor se calcula en funcin de los atributos de los nodos hijos.
o Heredados: su valor se calcula en funcin de los atributos de los hermanos y/o del nodo
padre.
Cada atributo tomara valores de un dominio.
Cada produccin llevara asociadas un conjunto de reglas semnticas.
Las relaciones de dependencia entre atributos, establecidas por las reglas semnticas, se
representaran mediante el Grafo de Dependencias.

ATRIBUTOS HEREDADOS

Una gramtica con atributos se denomina Gramtica L-Atribuida si cada atributo que se evala
cumple una de las siguientes condiciones:

Es un atributo sintetizado.
Dada una produccin A --> X1,X2XjXn, el atributo heredado asociado a Xj depende
nicamente de los atributos de X1,,Xj-1 y/o de atributos heredados asociados al smbolo
A.

ATRIBUTOS SINTETIZADOS
En el caso de los smbolos terminales de la gramtica, su atributo no es mas que el lexema
asociado al token reconocido por el analizador lxico.
Una gramtica con atributos se denomina Gramtica S-Atribuida si todos los atributos son
sintetizados. Siempre es posible transformar una Gramtica con Atributos en una Gramtica SAtribuida.
Ejemplos:
1. Atributos SINTETIZADOS y reglas para evaluacin de expresiones aritmticas.
2. Atributos HEREDADOS y reglas para propagacin de tipos.

1.4 Manejo de errores semnticos


Errores semnticos, como operaciones realizadas sobre tipos incompatibles. Entre estos se
incluyen los errores relacionados con el uso de la tabla de smbolos, como uso de identificadores
no declarados o declaracin doble de un identificador en la misma regin de alcance.

ACTIVIDADES COMPLEMENTARIAS:

Analizar el entorno semntico de un lenguaje de programacin comercial.


Realizar la comprobacin semntica de ese lenguaje con instrucciones errneas.
Desarrollar las gramticas de atributos para el lenguaje del proyecto.
Comprobar la semntica de su lenguaje en java.