unidad5. analisis semantico

Upload: kiit-hernandez

Post on 17-Jul-2015

84 views

Category:

Documents


0 download

TRANSCRIPT

Unidad V Anlisis SemnticoM.C. Juan Carlos Olivares Rojas

Agenda5.1 Analizador semntico 5.2 Verificacin de tipos en expresiones. 5.3 Conversin de tipos. 5.4 Acciones agregadas en un analizador sintctico descendente (top-down). 5.5 Pila semntica en un analizador sintctico ascendente (bottom-up). 5.6 Administracin de la tabla de smbolos. 5.7 Manejo de errores semnticos.

5.1 Analizador semntico Ajuste significativo Comprobacin de tipos: operandos-operadores Comprobacin del flujo de control: for(;;) { break; w= a+2; }

Analizador semntico Comprobacin de unicidad int a; char a; //una sola vez Comprobacin relacionadas con nombres

Analizador semntico Tabla de smbolos: Estructura en memoria Almacena informacin sobre los tipos

Sistemas de tipo: Tipo bsico: entero, carcter, real, lgico Nombres de tipo

Analizador semntico 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 cdigo fuente

Analizador semntico Cada analizador semntico implementa un sistema de tipos Comprobacin dinmica y esttica Esttica: compilacin Dinmica: Ejecucin char a[5]; strcpy(a, abcdefghijk);

Analizador semntico Fuertemente tipificado Dbilmente tipificado Smbolo { nombre; tipo; mbito; }

5.2 Verificacin de tipos en expresiones La verificacin de los tipos de datos se hace asignando el valor de tipo de cada una de los componentes lxicos. Estos valores se comparan para verificar que los tipos de datos coincidan y sean congruentes, de lo contrario no se pueden realizar los clculos.

5.3 Conversin 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 conversin de tipos; lo que se denomina conversin automtica.

Conversin de tipos Esto slo es posible en algn lenguaje de programacin, si el compilador reconoce que la variable destino tiene la suficiente precisin 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 precisin que el primero.

Conversin de tipos A esto se le llama ensanchamiento o promocin, dado que el tipo ms pequeo se ensancha o promociona al tipo compatible ms grande. Si por el contrario, se desea asignar un valor de variable int a una variable byte se necesita realizar una conversin de tipos explcita. En algunos casos se puede realizar la conversin pero se pueden perder datos, como por ejemplo al pasar un valor flotante a un entero.

Conversin de tipos A esto se le llama estrechamiento, dado que se estrecha explcitamente el valor para que quepa en el destino. La conversin de un tipo se realiza poniendo delante un nombre de tipo entre parntesis, por ejemplo, (tipo) valor. byte a; int b; a=(byte) b;

Comprobacin de tipos Existen dos tipos de comprobacin: esttica y dinmica. La comprobacin ayuda a evitar la mayora de los errores de programacin. Ejemplos: Comprobacin de tipos. Para saber si el operador aplicado a los operadores es correcto

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

Comprobacin de tipos La comprobacin de tipos es la ms complicada. Las dems comprobaciones son rutinarias. El operador % ocupa que los dos operandos sean enteros. + es una funcin suma(a,b) que est sobrecargada para distintos tipos de datos

Comprobacin de tipos Siempre se disean reglas de tipos como los valores numricos se convierten al de mayor jerarqua o el tipo de datos punteros slo apunta al tipo de datos declarado. Algunos lenguajes revisan el tamao de los arreglos (Java) de manera esttica otros lo hacen de manera dinmica (en tiempo de ejecucin).

Comprobacin de tipos Diferenciar el uso de +, * enteros que con punteros (aritmtica de punteros) Al conjunto de reglas que se definen para la comprobacin de los tipos de datos se denomina sistema de tipos La mayora de veces la recuperacin de errores se suele omitir ya que el programa no finaliza pero tal vez no obtenga los valores deseados

Comprobacin de tipos Generalmente en la etapa de anlisis sintctico se suelen agregar los tipos a la tabla de smbolos. Se revisa el rbol sintctico para comprobar los tipos asignados.

Comprobacin de tipos Existen conversiones explcitas en las cuales el usuario indica el tipo de datos a = (int)(23.3/18.2); Las conversiones implcitas requieren de mayor tiempo de ejecucin. Un ciclo de 1 a N tard 5.4 y 48.4 nanosegundos utilizando conversiones implicitas.

Comprobacin de tipos Polimorfismo: una funcin puede tener el mismo nombre con diferentes elementos. El tipo de datos debe ser diferente. Un ejemplo de polimorfismo son las plantillas en algn lenguaje de programacin. Se debe considerar el mbito de las variables (locales y globales).

5.4 Acciones agregadas en un analizador sintctico descendente (top-down) Muchas de las actividades que realiza un analizador semntico no son estndares, dependern del objetivo del lenguaje de programacin; por ejemplo, en algunas aplicaciones es interesante conocer que los datos estn en algn rango vlido o que ciertos valores se utilicen para uso reservado

Acciones agregadas a un analizador semntico En algunas ocasiones nos interesa conocer el significado de las palabras de algn lenguaje dependiendo del contexto (gramticas de tipo 1) para diferenciar palabras polisemnticas. La Web es una base de datos en la mayora de los casos sin sentidos por lo que la tercera generacin de la Web ser la llamada Web semntica.

5.5 Pila semntica en un analizador sintctico ascendente (bottom-up). El diseo ascendente se refiere a la identificacin de aquellos procesos que necesitan computarizarse con forme vayan apareciendo, su anlisis como sistema y su codificacin, o bien, la adquisicin de paquetes de software para satisfacer el problema inmediato.

Pila semntica Los problemas de integracin entre los subsistemas son sumamente costosos y muchos de ellos no se solucionan hasta que la programacin alcanza la fecha limite para la integracin total del sistema. Se necesita una memoria auxiliar que nos permita guardar los datos intermedios para poder hacer la comparacin.

5.6 Administracin de la tabla de smbolos La tabla de smbolos tambin recibe el nombre de ambiente. Un ambiente contiene un conjunto de parmetros que slo son visibles en ese ambiente. La tabla de smbolos se mantiene durante todo el proceso de traduccin agregando elementos especficos en cada paso.

Operaciones sobre la tabla de smbolos Inserta(smbolo) Existe(nombre) Tipo(nombre) Declaracin TIPO {tipo=obtengo(yytext());} listavar PYC Listavar var {inserta(smbolo);} | var {inserta(simbolo);} Var ID {simbolo=yytext; smbolo.tipo=tipo; simbolo.amb=ambito;}

Operaciones sobre la tabla de smbolos 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;}

5.7 Manejo de errores semnticos Los errores semnticos son pocos y los que existen no se pueden detectar tan fcilmente. Hasta esta etapa los errores son mostrados a los usuarios. Los dems errores ya son muy difciles de detectar y generalmente se dan en tiempo de ejecucin

Manejo de errores semnticos Algunos problemas se presentan durante la fase de gestin de memoria al pasar argumentos o al crear la pila semntica. Muchos errores se generan durante la etapa del enlazador, al tratar de obtener cdigo existente de algunas funciones/mtodos ya implementadas en bibliotecas/APIs

Preguntas?