Unidad 1 - Analisis Semantico

download Unidad 1 - Analisis Semantico

of 7

description

Analisis semantico en generadores de un analizador de un lenguaje.

Transcript of Unidad 1 - Analisis Semantico

  • 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 de las gramticas libres de contexto, denominada definicin dirigida por la sintaxis:

    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 S-Atribuida.

    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.

    OBJETIVO UNIDAD IINTRODUCCIN UNIDAD ITEMAS A TRATAR UNIDAD I. ANLISIS SEMNTICO