expo_automata_.2,1.3 - Ingeniería en Sistemas Computacionales

Report
INGENIERIA EN SISTEMAS COMPUTACIONALES
Lenguaje y autómatas II
Unidad I
1.2. Acciones semánticas de un analizador sintáctico.
1.3. Comprobaciones de tipos en expresiones .
Integrantes :
Luis Felipe Mendoza Cruz
Martina del Carmen Huchin Canche
Docente : Eduardo José González Ehuán
111080080
111080069
El
análisis
semántico
se
realiza
después
del
sintáctico y es más difícil de formalizar que éste. Se
trata de determinar el tipo de los resultados
intermedios, comprobar que los argumentos que tiene
un
operador
pertenecen
al
conjunto
de
los
operadores posibles, y si son compatibles entre sí, es
decir, comprobará que el significado de lo que se va
leyendo es válido.
1.2. Acciones
sintáctico.
semánticas
de
un
analizador
Dependiendo del tipo de sentencias, las acciones
semánticas pueden agruparse en:
• Sentencias de Declaración: completar la sección de
tipos de la Tabla de Símbolos.
• Sentencias “ejecutables”: realizar comprobaciones de
tipos entre los operandos implicados.
• Funciones y procedimientos: comprobar el número,
orden y tipo de los parámetros actuales en cada llamada
a una función o procedimiento.
• Identificación de variables: comprobar si identificador ha
sido declarado antes de utilizarlo.
• Etiquetas: comprobar si hay etiquetas repetidas y
validación.
• Constantes: comprobar que no se utilicen en la parte
izquierda de una asignación.
• Conversiones y equivalencias de tipo: verificación.
• Sobrecarga de operadores y funciones: detectar y
solventar.
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. En ella se utiliza la estructura
jerárquica determinada por la fase de análisis sintáctico
para
identificar
los
operadores
expresiones y proposiciones.
y
operandos
de
1.3. Comprobaciones de tipos en expresiones .
Verificación de tipos
La verificación de los tipos de datos se hace
asignando el valor de tipo de cada una de los
componentes léxicos.
Estos valores se comparan para verificar que los
tipos de datos coincidan y sean congruentes, de lo
contrario no se pueden realizar los cálculos.
Hay situaciones en las cuales se tiene un valor de un tipo
dado y se desea almacenar ese valor en una variable de
un tipo diferente.
En algunos tipos es posible almacenar simplemente el
valor sin una conversión de tipos; lo que se denomina
conversión automática.
A la conversión de tipos se le llama coerción o casting.
Conversión de Tipos
Esto sólo es posible en algún lenguaje de programación, si
el compilador reconoce que la variable destino tiene la
suficiente precisión para contener el valor origen.
En Java se puede almacenar un valor byte en una variable
int, dado que este tipo de datos es de mayor precisión que
el primero.
A esto se le llama ensanchamiento o promoción,
dado que el tipo más pequeño se ensancha o
promociona al tipo compatible más grande. Si por el
contrario, se desea asignar un valor de variable int a
una variable byte se necesita realizar una conversión
de tipos explícita.
En algunos casos se puede realizar la conversión
pero se pueden perder datos, como por ejemplo al
pasar un valor flotante a un entero.
A esto se le llama estrechamiento, dado que se estrecha
explícitamente el valor para que quepa en el destino.
La conversión de un tipo se realiza poniendo delante un
nombre de tipo entre paréntesis, por ejemplo, (tipo) valor.
Ejemplos de coerción: byte a; int b; a=(byte) b;
Comprobación de Tipos
La comprobación ayuda a evitar la mayoría de los errores
de programación.
Ejemplos de comprobación de tipos: Para saber si el
operador aplicado a los operadores es correcto.
Existen dos tipos de comprobación: estática y dinámica.
1.Comprobaciones
de tipos. Un compilador
debe
informar de un error si se aplica un operador a un
operando incompatible, por ejemplo, si se suman una
variable tipo matriz y una variable de función.
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 Por ejemplo, una
proposición break en C hace que el control abandone la
proposición que la engloba, while, for o switch más
cercana si dicha proposición englobadora no existe, ocurre
un error.
3.Comprobación de unicidad: definir un objeto una sola vez.
4.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.
Comprobación estática
Diferente de la dinámica (en runtime)
Ejemplos
 Comprobación de tipos
Incompatibilidad de operadores
 Flujo de control
Exit Do, break, halt, while, next
 Unicidad
Variables únicas en su ámbito
Más ejemplos:
 Nombres
Begin transaction NNN --- Commit transaction
NNN
 Comprobación dinámica es necesaria:
tabla: array[0..255] of char;
i: integer
¿Verificar i <= 255 estáticamente?
Sistemas de tipos
Basado en:
• La noción de tipo
Tipos básicos o primitivos
Tipos construidos o referenciales
• Las reglas para asignar tipos
¿Suma de dos reales es un?
¿Concatenación de dos char es un?
Expresiones de tipos
• Un tipo básico
Boolean, char, integer, long, float, etc.
error_tipo
• El nombre de un tipo
public class Telefono {
int número; int internacional;
}
Constructores de tipos
Bibliografía
Adilene Perez Reyes, A. G. (18 de Mayo de 2011).
Analisis
Semantico.
Obtenido
de
http://compiladoresasignatura.blogspot.mx/2011/05
/unidad-5-analisis-semantico.html
Guevara, M. (s.f.). Acciones Semanticas. Obtenido
de
http://es.scribd.com/doc/128330225/1-2Acciones-semanticas

similar documents