M.C. Juan Carlos Olivares Rojas

Slides:



Advertisements
Presentaciones similares
Curso de java básico (scjp)
Advertisements

Métodos y parámetros.
Compiladores e intérpretes Análisis Sintáctico II
Compiladores e intérpretes
Prototipo de compilador didáctico del lenguaje LC99
Fundamentos de programación
Temas Operaciones básicas Instalando el compilador
Analizadores Sintácticos Descendentes Predictivos
Procesadores de Lenguajes I
Informática II Prof. Dr. Gustavo Patiño MJ
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO
Aplicación del paradigma orientado a objetos
Traducción dirigida por la Sintaxis
Teoría de lenguajes y compiladores
Herramientas para el acceso directo a memoria en C++
Tema 7: Polimorfismo Antonio J. Sierra. Índice Introducción. Sobrecarga de métodos. Objetos como parámetros. Paso de argumentos. Devolución de objetos.
Material de apoyo Unidad 2 Estructura de datos
Modificadores.
ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como.
Clases y objetos La unidad fundamental de programación OO son las clases. Conjunto de métodos y semántica Qué se va a hacer POO Clase: que define la implementación.
Tema 6: Clases Antonio J. Sierra.
TRADUCTOR DE UN PROGRAMA
Nombre, Alcance y Asociaciones (Bindings). Agenda Definición Nombre y Bindings Binding Time Importancia del Binding Time Eventos relacionados a la Asociación.
SCJP Sun Certified Programmer for Java 6
M.C. Meliza Contreras González
Procesadores del Lenguaje
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Objetos.
Tema 2: Los tipos de datos
Teoría de lenguajes y compiladores
FUNDAMENTOS DE PROGRAMACION
INGENIERIA EN SISTEMAS COMPUTACIONALES
ANALISIS SINTACTICO Parte I
Java. Java nació el año 1991, por un par de ingenieros de la Sun Microsystems.
TIPOS DE DATOS ABSTRACTOS
Resumen de Compilación Preparado por Manuel E. Bermúdez, Ph.D. Associate Professor University of Florida Traducido por Christian Torres Universidad Ricardo.
Tipo de Datos Básicos.
FORMA INTERNA DE REPRESENTAR
Programación Básica con NQC Patricio A. Castillo Pizarro 25/08/2007.
Alcance Dinámico La Asociación Actual para un Nombre dado es el encontrado recientemente durante la ejecución, y no a sido destruido aun por el retornado.
Herramientas de polimorfismo y herencia en C++
Programación de Sistemas
Informática Ingeniería en Electrónica y Automática Industrial
Elementos básicos del lenguaje
Java.
INFORMATICA VII (Programación e implementación de sistemas)
1 Definición y Conversión de datos Agustín J. González ELO-329.
Programación Procedural y Recursiva en C++
Unidad 1. Introducción a los Compiladores.
Términos algoritmo diseñar algoritmo implementar algoritmo
CARACTERÍSTICAS Es un lenguaje de programación estructurado de propósito general. Está estrechamente asociado al sistema operativo UNIX, ya que el propio.
Programación orientada a objetos
Teoría de lenguajes y compiladores
Preposición: suma= var1 + var2 + 10; Análisis Léxico El analizador léxico lee los caracteres del programa fuente, y verifica que correspondan a una secuencia.
PRINCIPIOS DE PROGRAMACIÓN
Lic. Carla Aguirre Montalvo
IV. GRAMÁTICAS DISTRIBUIDAS Y TABLAS DE SÍMBOLOS
Programación de Sistemas
Informática Ingeniería en Electrónica y Automática Industrial
Conceptos y Lenguaje Imperativo
MEMORIA DINÁMICA.
1 Definición y Conversión de datos Agustín J. González ELO-329.
LE, EI, Profesor Ramón Castro Liceaga UNIVERSIDAD LATINA (UNILA) V. GESTIÓN DE TIPOS Y GENERACIÓN DE CÓDIGOS.
Algunas Características de C++ no presentes en C Agustín J. González ELO-329.
Algoritmos y Programación. Objetivos de Aprendizaje: Al finalizar esta unidad ud. debe estar en la capacidad de: Definir el propósito y el contenido de.
Programación orientada a objetos La programación orientada a objetos o POO (OOP según sus siglas en inglés) es un paradigma de programación que usa objetos.
Métodos en Java. Estructura de un programa en Java ► La relación con la vida misma la podemos ver en el siguiente comentario: Imaginemos que dos clases.
Programación en Java Introducción a Java. Reseña histórica Surge en 1991 por Sun Microsystems Desarrollado para electrodomésticos Se buscaba un código.
Omar Herrera Caamal Rigoberto Lizárraga Luis Cetina Luna.
Programación en Java Introducción a Java. Reseña histórica Surge en 1991 por Sun Microsystems Desarrollado para electrodomésticos Se buscaba un código.
Transcripción de la presentación:

M.C. Juan Carlos Olivares Rojas Análisis Semántico M.C. Juan Carlos Olivares Rojas Noviembre 2009

Agenda Analizador semántico Verificación de tipos en expresiones. Conversión de tipos. Acciones agregadas en un analizador sintáctico descendente (top-down). Pila semántica en un analizador sintáctico ascendente (bottom-up).

Agenda Administración de la tabla de símbolos. Manejo de errores semánticos.

Analizador Semántico Ajuste significativo Comprobación de tipos: operandos-operadores Comprobación del flujo de control: for(;;) { … break; w= a+2; }

Analizador Semántico Comprobación de unicidad int a; char a; //una sola vez Comprobación relacionadas con nombres ¿Cómo se realiza la comprobación de unicidad? A través de la tabla de símbolos.

Analizador Semántico Tabla de símbolos: Sistemas de tipo: Estructura en memoria Almacena información sobre los tipos Se debe de agregar una estructura en memoria que permita identificar nombres. Los generadores de analizadores léxicos ya tienen una tabla de símbolos primitivos. Sistemas de tipo: Tipo básico: entero, carácter, real, lógico Nombres de tipo

Analizador Semántico Constructores de tipo: estructuras, uniones, objetos Apuntadores: referencias a tipos Funciones a=suma(); Sistema de tipos: conjunto de reglas que determinan el criterio para asignar expresiones de tipo a las diferentes partes del código fuente. Los sistemas de tipos dependen de los lenguajes.

Analizador Semántico Cada analizador semántico implementa un sistema de tipo (no necesariamente tan robusto) Comprobación de tipos puede ser dinámica y/0 estática. Estática: en tiempo de compilación Dinámica: en tiempo de ejecución.

Analizador Semántico char a[5]; strcpy(a, “abcdefghijk”); Java es un lenguaje con un sistema de tipos más fuerte que C/C++ que lo hace más seguro pero a la vez un poco más deficiente. Los lenguajes interpretados en el pasado eran más susceptibles a errores en tiempo de ejecución pero las cosas han cambiado.

Analizador Semántico En general la tabla de símbolos debe contener la siguiente estructura para validar la parte semántica: Símbolo { nombre; tipo; ámbito; }

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.

Conversión de tipos 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.

Conversión de Tipos 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.

Conversión de tipos 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 Existen dos tipos de comprobación: estática y dinámica. 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.

Comprobación de Tipos Comprobación de flujo de control. Se debe verificar que las instrucciones que cambia el flujo de un programa sean válidos. Ejemplo: break, goto. Comprobación de unicidad: definir un objeto una sola vez. Comprobación relacionadas con nombres. El mismo nombre debe aparecer dos veces. Variables que se declaran pero no utilizan

Comprobación de Tipos La comprobación de tipos es la más complicada. Las demás comprobaciones son rutinarias. El operador % ocupa que los dos operandos sean enteros. + es una función suma(a,b) que está sobrecargada para distintos tipos de datos

Comprobación de Tipos Diferenciar el uso de +, * enteros que con punteros (aritmética de punteros) Al conjunto de reglas que se definen para la comprobación de los tipos de datos se denomina sistema de tipos La mayoría de veces la recuperación de errores se suele omitir ya que el programa no finaliza pero tal vez no obtenga los valores deseados

Comprobación de Tipos Generalmente en la etapa de análisis sintáctico se suelen agregar los tipos a la tabla de símbolos. Se revisa el árbol sintáctico para comprobar los tipos asignados. Existen conversiones explícitas en las cuales el usuario indica el tipo de datos: a = (int)(23.3/18.2);

Comprobación de Tipos Las conversiones implícitas requieren de mayor tiempo de ejecución. Un ciclo de 1 a N tardó5.4 y 48.4 nanosegundos utilizando conversiones implícitas. Polimorfismo: una función puede tener el mismo nombre con diferentes elementos. El tipo de datos debe ser diferente.

Comprobación de Tipos Un ejemplo de polimorfismo son las plantillas en algún lenguaje de programación. Se debe considerar el ámbito de las variables (locales y globales).

Práctica 10 Realizar un parser en Java para documentos en XML. Se debe de validar archivos del lenguaje clima visto previamente ¿Cómo se realiza el análisis sintáctico en XML? ¿Cómo se puede manejar el análisis léxico?

Parser DOM en Java Clases DocumentBuilderFactory Clase DocumentBuilder Método parser Análisis utilizando implementación de DOM a través de todo el documento como si fuera un árbol.

Acciones Agregadas a Parsers Muchas de las actividades que realiza un analizador semántico no son estándares, dependerán del objetivo del lenguaje de programación; por ejemplo, en algunas aplicaciones es interesante conocer que los datos estén en algún rango válido o que ciertos valores se utilicen para uso reservado. En general los analizadores semánticos se llegan a realizar a través de la modificación de parsers.

Pila semántica en un ASem La pila juega un papel fundamental en el desarrollo de cualquier analizador semántico. Dentro de cada elemento de la pila se guardan los valores que pueden tener una expresión.

Admon. Tabla de Símbolos La tabla de símbolos también recibe el nombre de ambiente. Un ambiente contiene un conjunto de parámetros que sólo son visibles en ese ambiente. • La tabla de símbolos se mantiene durante todo el proceso de traducción agregando elementos específicos en cada paso.

Tabla de símbolos Funcionalidades básicas: Inserta(símbolo) Existe(nombre) • Se agrega una primitiva más: Tipo (nombre) ¿El análisis léxico crea la tabla de símbolos? No

Tabla de Símbolos ¿Cómo se agrega la semántica al analizador sintáctico? Declaración TIPO {tipo=obtengo(yytext());} listavar PYC listavar  var {inserta(símbolo);} | var {inserta(simbolo);} var  ID {simbolo=yytext; símbolo.tipo=tipo; simbolo.amb=ambito;}

Tabla de Símbolos Exprlog  PI exprlog{A=A;} PD | NOT exprlog {A=A;} | exprlog {A1=A;} OPLOG exprlog { A2=A if(A1==INT && A2==INT) A=INT; else A=ERROR_TIPO; }

int a; a = (int) 10.1;

Manejo Errores Semánticos Algunos problemas se presentan durante la fase de gestión de memoria al pasar argumentos o al crear la pila semántica. Muchos errores se generan durante la etapa del enlazador, al tratar de obtener código existente de algunas funciones/métodos ya implementadas en bibliotecas/APIs

Examen Analizador semántico que permita construir objetos de java con el siguiente sistema de tipos: Validar unicidad (se deben de manejar paquetes para poderse repetir) El tipo de datos abstracto (clase) debe estar previamente declarado y debe de coincidir plenamente.

Examen Si se desea realizar “operaciones aritméticas” se deberá mantener el sistema de compatibilidad de promoción hacia la clase base más alta (utilizando herencia). Si se trata de igualdad deberán de ser del mismo tipo tanto lado derecho como el izquierdo o bien realizar la conversión explicita (coerción). Cuando sea de un tipo más grande a uno pequeño se indicará un mensaje de advertencia.

Ejemplo examen public class ejemplo{}; public class base extends ejemplo{}; public class profe extends ejemplo{}; public class columna extends base {}; public class ejemplo2 { base B = new base(); profe c, m; m = 23 * b; B = c; }

Ejemplo Examen Este programa devuelve lo siguiente: Sintaxis correcta!!! Asignación correcta Asignación incorrecta Asignación correcta (advertencia son del mismo tipo padre pero diferentes clases)

Semántica en YACC A : B C D {$$=$1*$3}; Expr: ‘(’ Expr ‘)’ {$$=$2}; YYSTYPE determina el tipo de datos del token. En general se maneja de forma predeterminada entero.

Referencias

¿Preguntas?