sábado, 20 de noviembre de 2010

UNIDAD 5: ANÁLISIS SEMÁNTICO

EN ESTA UNIDAD SE MUESTRAN LAS REGLAS SEMÁNTICAS, CUAL ES LA FUNCIÓN DEL ANÁLISIS SEMÁNTICO ASI COMO LAS REGLAS Y LA COMPATIBILIDAD DE TIPOS...



TEMARIO:
FUNCIÓN DEL ANÁLISIS SEMÁNTICO
REGLAS SEMÁNTICAS
COMPATIBILIDAD DE TIPOS
SISTEMAS DE TIPOS
COMPROBACIÓN ESTÁTICA Y DINÁMICA DE TIPOS
COMPROBACIÓN DE TIPOS EN EXPRESIONES, SENTENCIAS Y FUNCIONES
CONVERSIÓNES DE TIPOS

FUNCION DEL ANÁLISIS SEMÁNTICO


La tarea del compilador requiere la extracción del contenido semántico incluido en las distintas sentencias del programa. Es por esto que se hace necesario dotar al compilador de una serie de rutinas auxiliares que permitan captar todo aquello que no se ha expresado mediante la sintaxis del lenguaje y todo aquello que hace descender a nuestro lenguaje de programación de las alturas de una máquina abstracta hasta el nivel de un computador real.
El análisis semántico completa las dos fases anteriores de análisis lexicográfico y sintáctico incorporando ciertas comprobaciones que no pueden asimilarse al mero reconocimiento de una cadena dentro de un lenguaje.
La fase de análisis semántico revisa el programa fuente para tratar de encontrar errores semánticos y reúne la información sobre los tipos para la fase posterior de generación de código. Un componente importante del análisis semántico es la Verificación de Tipos. Aquí, el compilador verifica si cada operador tiene operandos permitidos por la especificación del lenguaje fuente.

REGLAS SEMÁNTICAS


Las reglas semánticas vienen dadas en función de los atributos de los demás símbolos que componen la regla.
La evaluación de las reglas semánticas puede generar código, guardar información en una tabla de símbolos, emitir mensajes de error o realizar otras actividades. La traducción de la cadena de componentes léxicos es el resultado obtenido al evaluar las reglas semánticas.La evaluación de las reglas semánticas define los valores de los atributos en los nodos del árbol de análisis sintáctico para la cadena de entrada.

COMPATIBILIDAD DE TIPOS


Un compilador debe comprobar si el programa fuente sigue tanto las convenciones sintácticas como las semánticas del lenguaje fuente. Esta comprobación, llamada comprobación estática, garantiza la detección y comunicación de algunas clases de errores de programación.
Los ejemplos de comprobación estática incluyen:
1. Comprobaciones de tipos: Un compilador debe informar de un error si se aplica un operador a un operando incompatible.
2. Comprobaciones del flujo de control: Las proposiciones que hacen que el flujo del control abandone una construcción deben tener algún lugar a dónde transferir el flujo de control
3. Comprobaciones relacionadas con nombres: En ocasiones, el mismo nombre debe aparecer dos o más veces en un mismo bloque de instrucciones, el compilador debe comprobar que se utilice el mismo nombre en ambos sitios.

SISTEMAS DE TIPOS


El diseño de un comprobador de tipos para un lenguaje se basa en información acerca de las construcciones sintácticas del lenguaje, la noción de tipos y las reglas para asignar tipos a la construcciones de lenguaje.

Expresiones de tipos
El tipo de una construcción de un lenguaje se denotará mediante una “expresión de tipo”. De manera informal, una expresión de tipo es, o bien un tipo básico o se forma aplicando un operador llamado constructor de tipos a otras expresiones de tipos.
Cada lenguaje de programación requerirá unas expresiones de tipos adecuadas a sus características.
Expresiones de tipos más comunes:
• Tipos simples: Son expresiones de tipos los tipos simples del lenguaje, y algunos tipos especiales:
 integer
 real
 char
 boolean
 void
 error

• Constructores de tipos: Permiten formar tipos complejos a partir de otros más simples. La semántica de cada lenguaje tiene asociada unos constructores de tipos propios. En general, en los lenguajes de programación se definen los siguientes constructores:
 Matrices: Si T es una expresión de tipos, entonces array(R,T) es también una expresión de tipos que representa a una matriz de rango R de elementos de tipo T.
 Productos: Sea T1 y T2 expresiones de tipos, T1 x T2 es una expresión de tipos que representa al producto cartesiano de los tipos T1 y T2. A fin de simplificar consideraremos que el constructor u operador de tipos x es asociativo por la izquierda.
 Registros: Sea un registro formado por los campos u1, u2 ... uN, siendo cada uno de ellos de los tipos T1,T2 ... TN.
 Punteros: Si T es una expresión de tipos, entonces pointer(T) es una expresión de tipos que representa a un puntero a una posición de memoria ocupada por un dato de tipo T.
 Funciones: Sean T1,T2 ... TN, las expresiones de tipos asociadas a los segmentos de código correspondientes a los argumentos de una función, y sea T el tipo devuelto por la función. Las expresiones de tipo pueden contener variables cuyos valores son expresiones de tipos.

COMPROBACIÓN ESTÁTICA Y DINÁMICA DE TIPOS


Se dice que la comprobación realizada por un compilador es estática, mientras que la comprobación hecha al ejecutar el programa objeto se denomina dinámica. En principio, cualquier verificación se puede realizar dinámicamente, si el código objeto carga el tipo de un elemento con el valor de dicho elemento.

Recuperación de errores
Como la comprobación de tipos tiene la capacidad de descubrir errores en los programas, es importante que un comprobador de tipos haga algo razonable cuando se descubre un error. Como mínimo, el compilador debe informar de la naturaleza y la posición del error. Es mejor que el comprobador de tipos se recupere de los errores, para que pueda comprobar el resto de la entrada. Como el manejo de errores afecta a las reglas de comprobación de tipos, tiene que diseñarse como parte del sistema de tipos desde el principio; las reglas tienen que servir para tratar los errores.

COMPROBACIÓN DE TIPOS EN EXPRESIONES, SENTENCIAS Y FUNCIONES


A partir de reglas semánticas se desarrolla la comprobación de tipos para expresiones, sentencias y funciones. El comprobador de tipos es un esquema de traducción que sintetiza el tipo de cada expresión a partir de los tipos de las subexpresiones. El comprobador de tipos puede manejar matrices, apuntadores, proposiciones y funciones.

CONVERSIONES DE TIPOS


Considérense expresiones como x + i donde x es de tipo real e i es de tipo entero. Como pa representación de enteros y reales es distinta dentro de un computador, y se utilizan instrucciones de máquina distintas para las operaciones sobre enteros y reales, puede que el compilador tenga que convertir primero uno de los operandos de + para garantizar que ambos operandos sean del mismo tipo cuando tenga lugar la suma.
La definición del lenguaje especifica las conversiones necesarias. Cuando un entero se asigna a un real, o viceversa, la conversión es al tipo del lado izquierdo de la asignación. En expresiones, la transformación más común es la de convertir el entero en un número real y después realizar una operación real con el par de operandos reales obtenidos. Se puede utilizar el comprobador de tipos en un compilador para insertar estas operaciones de conversión en la representación intermedia del programa fuente.

Coerciones
Se dice que la conversión de un tipo a otro es implícita si el compilador la va a realizar automáticamente. Las conversiones de tipo implícitas, también llamadas coerciones, se limitan en muchos lenguajes a situaciones donde en principio no se pierde ninguna información; por ejemplo, un entero se puede transformar en un real pero no al contrario.
Se dice que la conversión es explícita si el programador debe escribir algo para motivar la conversión. Para un comprobador de tipos, las conversiones explícitas parecen iguales que las aplicaciones de función, así que no presentan problemas nuevos.
La conversión implícita de constantes se puede realizar generalmente en el momento de la compilación, mejorando a menudo el tiempo de ejecución del programa objeto.

Sobrecarga de funciones y operadores
Un símbolo sobrecargado es el que tiene distintos significados dependiendo de su contexto. La sobrecarga se resuelve cuando se determina un significado único para un caso de un símbolo sobrecargado. La resolución de la sobrecarga a menudo aparece referida como identificación de operadores porque determina la operación que denota un símbolo de operador.
Funciones polimórficas
Un procedimiento normal permite que las proposiciones de su cuerpo se ejecuten con argumentos de tipos fijos; cada vez que se llama un procedimiento polimórfico, las proposiciones de su cuerpo pueden ejecutarse con argumentos de tipos distintos. El término “polimórfico” también se aplica a cualquier parte de código que pueda ejecutarse con argumentos de tipos distintos, de modo que se puede hablar de funciones, así como de operadores polimórficos.

No hay comentarios:

Publicar un comentario