lunes, 22 de noviembre de 2010

GENERACION DE CODIGO INTERMEDIO

Definicion
El generador de código intermedio transforma un árbol de semántico en una representación en un lenguaje intermedio cercano al código objeto.


Lenguajes sencillos
  • Tercetos
  • Cuartetos

Manejo de Errores

¡¡Los programas no siempre son correctos!!
El compilador tiene que:
Reportar clara y exactamente la presencia de errores
Recuperarse de cada error lo suficientemete rápido para poder detectar errores subsiguientes
Tratar de evitar mensajes falsos de error
 
Tipos de Errores
Léxicos
Sintácticos
Semánticos
Lógicos
 
Errores Léxicos
Un error que produce un token erroneo
Errores léxicos posibles
Un identificador, palabra reservada u operador mal escrito (typo) 
 
Errores Sintácticos
Un programa que no satisface la CFG del lenguaje
Ejemplos
Expresión aritmética con paréntesis no balanceados
Un punto y coma faltante
 
Errores Semánticos
Un error que necesita información sensitiva al contexto para ser identificado
Ejemplos
Un operador aplicado a un tipo incompatible de operando
Accesar una variable no declarada
 
Errores Lógicos
Errores en el modelo de ejecución
Ejemplos
Recursión infinita
Accesar un arreglo fuera de los límites
Dereferenciar un null pointe  
 
Tipos de recuperación de errores de sintáxis

Panic mode recovery
Parse level recovery
Producciones de error
Corrección global

 
 
 
 
 
 
 
 

GRAMATICAS INDEPENDIENTES DE CONTEXTO

Compatibilidad semántica

No todas las proposiciones pueden coordinarse aunque tengan el mismo sujeto y el mismo verbo; para que la coordinación sea posible es necesario que las proposiciones:
  • Sean compatibles, esto es, que no se excluyan: no podemos decir "Manolo duerme mucho y padece insomnio"
  • Sean coherentes, esto es, puedan responder a la misma pregunta; "Luis es rubio y concejal" es incoherente porque responden a preguntas diferentes.
  • En el caso de las preposiciones disyuntivas, que exista alternativa entre ellas: no podemos decir "¿Cumples los años en agosto o durante el verano?"
Sistemas de tipos

Sistema de tipos: conjunto de reglas que determinan el criterio para asignar expresiones de tipo a las diferentes partes del código fuente.

Tipo básico: entero, carácter, real, lógico

Nombres de tipo

Constructores de tipo: estructuras, uniones, objetos

Apuntadores: referencias a tipos

Funciones a=suma();


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.  Los conjuntos de tipos y constructores básicos dependen del lenguaje que deba comprobarse.
Cada lenguaje de programación requerirá unas expresiones de tipos adecuadas a sus características. A continuación, a modo de ejemplo, se definen las 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.
Ejemplos: Sea el segmento de código C :
                   char a[10]
ü  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, entonces, la expresión de tipos asociada al conjunto es:
           record ( (u1:T1) x (u2:T2) x ... x (uN: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. Entonces, la expresión de tipos asociada a la función es:
               ((T1xT2 x... xTN) -> T )
Ø  Las expresiones de tipo pueden contener variables cuyos valores son expresiones de tipos.
 

Sistemas de tipos

Un sistema de tipos  es una serie de reglas para asignar expresiones de tipos a las distintas partes de un programa y verificar su corrección.  En concreto, formarán el sistema de tipos las definiciones y reglas que permiten comprobar cuál es el dominio asignado a una variable, y en qué contextos puede ser usada. 

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.
La conversión de tipos surge con frecuencia en otro contexto.  Se dice que un símbolo que tienen distintos significados dependiendo de su contexto está sobrecargado.  Las conversiones de tipo a menudo acompañan a la sobrecarga.