Académique Documents
Professionnel Documents
Culture Documents
Análisis Semántico
Verifica:
Compatibilidad entre un operador y sus operandos
Flujo de control sea correcto
Duplicidad de nombres cuando esto sea prohibido
Verificaciòn de tipos
Puede hacerse durante el anàlisis sintàctico
Ejemplo:
P -> D ; E
D -> D ; D | id : T
T -> char | integer | array [num] of T | ^T
E -> literal | num | id | E mod E | E^
Expresiones de tipo
Esquema de traducción
D -> id : T {addtype(id.entry,T.type)}
T-> char {T.type = char}
T-> integer {T.type = integer}
T -> ^T1 {T.type = pointer(T1.type)}
T -> array[num] of T1 {T.type =array(1..num.val,T1.type) }
Verificación de tipos
Tipos básicos
entero E -> num {E.type = integer}
caracter E-> literal {E.type = char}
Expresiones
E -> id {E.type = buscar(id.entry)}
E -> E1 mod E2 {E.type = if E1.type = integer and
E2.type = integer then integer else type_error}
Tipos construidos
E -> E1[E2] {E.type = if E2.type = integer and
E1.type = array(s,t) then t else type_error}
E -> E1^ {E.type = if E1.type = pointer(t) then t ...}
Equivalencia de Expresiones de Tipo
La equivalencia depende de si un nombre de un tipo
en una expresión se representa a si mismo, o a una
expresion de tipo:
Equivalencia Estructural: dos expresiones de tipo son
equivalentes si son del mismo tipo básico, o si están
formadas aplicando el mismo constructor de tipo a dos
tipos estructuralmente equivalentes.
Ejemplo: “entero” es equivalente a “entero”
“registro((c1xentero)x(c2xreal))” es equivalente a
“registro((c1xentero)x(c2xreal))”
ARREGLO
1..10 ENTERO
Pontificia U. Javeriana Cali - Ingenieria de Sistemas y Computación – Compiladores – Prof. Ma. Constanza Pabón
Ejemplo de un Algoritmo para
Comprobar Equivalencia Estructural
Eq_Est (s, t) :
Si s y t son del mismo tipo básico
Retorne Verdadero
Sino Si s = arreglo(s1, s2) y t = arreglo(t1, t2)
Retorne Eq_Est(s1, t1) y Eq_Est(s2, t2)
Sino Si s = apuntador(s1) y t = apuntador(t1)
Retorne Eq_Est(s1, t1)
......
Sino Retorne Falso
Pontificia U. Javeriana Cali - Ingenieria de Sistemas y Computación – Compiladores – Prof. Ma. Constanza Pabón
Conversiones de Tipos
Las reglas del lenguaje definen que conversiones son
necesarias
Al generar código intermedio se pueden introducir las
conversiones de tipo necesarias
Coacciones: conversiones de tipo implicitas (realizadas por el
compilador). Generalmente se realizan en los casos en que
no se pierde información.
Conversiones Explicitas: cuando el programador causa la
conversión escribiendo una instrucción.
Las coacciones se deben tener en cuenta al escribir
las reglas semánticas para comprobación de tipos del
compilador.
Pontificia U. Javeriana Cali - Ingenieria de Sistemas y Computación – Compiladores – Prof. Ma. Constanza Pabón
Sobrecarga de Funciones y
Operadores
Un símbolo sobrecargado es aquel que tiene diferentes
significado dependiendo del contexto.
Ejemplo: el operador +
El significado es diferente cuando se suman enteros, o
reales, o complejos, o matrices.
La sobrecarga se resuelve cuando se define un significado
unico para una ocurrencia del símbolo sobrecargado
Si la sobrecarga no se resuelve, una expresión puede tener
un conjunto de tipos posibles
Ejemplo: si para el operador + se tienen los siguientes tipos
posibles: entero x entero → entero
entero x entero → complejo
complejo x complejo → complejo
Pontificia U. Javeriana Cali - Ingenieria de Sistemas y Computación – Compiladores – Prof. Ma. Constanza Pabón
Funciones Polimorficas
Una función polimorfica permite ser ejecutada con
argumentos de tipos diferentes cada vez (pero
siempre ejecuta el mismo cuerpo de instrucciones).
Ejemplo: los operadores definidos por el lenguaje para
indexar arreglos, llamar funciones y manejar punteros.
Pontificia U. Javeriana Cali - Ingenieria de Sistemas y Computación – Compiladores – Prof. Ma. Constanza Pabón
Variables de Tipo
Variables de Tipo: Permiten representar tipos
desconocidos en una expresión de tipo.
Se usan para comprobación de tipos de lenguajes que no
exigen declarar los identificadores antes de su uso.
Pontificia U. Javeriana Cali - Ingenieria de Sistemas y Computación – Compiladores – Prof. Ma. Constanza Pabón
Variables de Tipo y Funciones
Polimorficas
La expresión de tipo de una función polimorfica se
define usando el cuantificador universal ∀ (para
todo)
Para la función que retorna la longitud de una lista:
∀ α . List(α ) → integer
La equivalencia de tipos se determina haciendo unificación
de tipos.
Pontificia U. Javeriana Cali - Ingenieria de Sistemas y Computación – Compiladores – Prof. Ma. Constanza Pabón