análisis semántico

12
Lenguajes y Autómatas II Análisis semántico Introducción Además de controlar que un programa cumpla con las reglas de la gramática del lenguaje, hay que comprobar que lo que se quiere hacer tiene sentido. La verificación semántica se encarga de que los tipos que intervienen en las expresiones sean compatibles o que los parámetros reales de una función sean coherentes con los parámetros formales: p.ej. no suele tener mucho sentido el multiplicar una cadena de caracteres por un entero. 1.1 Árbol de Expresiones Los árboles de expresiones representan el código de nivel del lenguaje en forma de datos. Los datos se almacenan en una estructura con forma de árbol. Cada nodo del árbol de expresión representa un elemento de la gramática, por ejemplo, una llamada al método o una operación binaria, como x < y. Árbol de Sintaxis Abstracta es el resultado de la fase de análisis sintáctico o parser. • Recoge toda la información sintáctica y semántica • Elimina los símbolos que no aportan significado • Los nodos reflejan los datos asociados a cada símbolo • El objetivo de las acciones semánticas es construir este árbol Ejemplo A=b+c;

Upload: sipsoms

Post on 12-Nov-2015

1 views

Category:

Documents


0 download

DESCRIPTION

análisis semántico y sus fases

TRANSCRIPT

Lenguajes y Autmatas II

Lenguajes y Autmatas II

Anlisis semnticoIntroduccin

Adems de controlar que un programa cumpla con las reglas de la gramtica del lenguaje, hay que comprobar que lo que se quiere hacer tiene sentido. La verificacin semntica se encarga de que los tipos que intervienen en las expresiones sean compatibles o que los parmetros reales de una funcin sean coherentes con los parmetros formales: p.ej. no suele tener mucho sentido el multiplicar una cadena de caracteres por un entero.

1.1 rbol de Expresiones

Los rboles de expresiones representan el cdigo de nivel del lenguaje en forma de datos. Los datos se almacenan en una estructura con forma de rbol. Cada nodo del rbol de expresin representa un elemento de la gramtica, por ejemplo, una llamada al mtodo o una operacin binaria, comox < y.rbol de Sintaxis Abstracta es el resultado de la fase de anlisis sintctico o parser. Recoge toda la informacin sintctica y semntica Elimina los smbolos que no aportan significado Los nodos reflejan los datos asociados a cada smbolo El objetivo de las acciones semnticas es construir este rbolEjemplo A=b+c;

Ejercicio Se est compilando el siguiente programa, escrito en un lenguaje de programacin ficticio, cuyo sintaxis resultar fcil de comprender.BeginInt a;A=100;A=A+A;Output Aend

GRAMATICAPROGRAMA->begin declaraciones;sentencias endDECLARACIONES->DECLARACIONES | DECLARACIONDECLARACION->TIPO IDSSENTENCIAS->SENTENCIA SENTENCIASSENTENCIA->ASIGNACION

1.2 Acciones semnticas de un analizador sintctico

Dependiendo del tipo de sentencias, las acciones semnticas pueden agruparse en: Sentencias de Declaracin: Completar la seccin de tipos de la Tabla deSmbolos. Sentencias ejecutables: Realizar comprobaciones de tipos entre los operandosimplicados. Funciones y procedimientos: Comprobar el nmero, orden y tipo de losparmetros actuales en cada llamada a una funcin o procedimiento. Identificacin de variables: Comprobar si un identificador ha sido declaradoantes de utilizarlo. Etiquetas: Comprobar si hay etiquetas repetidas y validacin. Constantes: Comprobar que no se utilicen en la parte izquierda de una asignacin. Conversiones y equivalencias de tipo: Verificacin. Sobrecarga de operadores y funciones: Detectar y solventar. Emitir informes de errores semnticos Construir el rbol de Sintaxis AbstractaLas acciones semnticas por el mbito de ejecucin se pueden clasificar en acciones semnticas estticas y acciones semnticas dinmicas.El Analizador Semntico finaliza la fase de Anlisis del compilador y comienza la fase de Sntesis, en la cual se comienza a generar el cdigo objeto.La especificacin de la semntica puede realizarse de dos formas: Lenguaje natural Especificacin formal: Semntica Operacional, semntica denotacional, semntica Axiomtica, Gramticas con Atributos.En funcin del procedimiento utilizado para generar el programa objeto, se distinguen de los siguientes tipos de compiladores: compiladores de un solo paso y compiladores de dos o ms pasos.Tarea: Realizar una tabla de diferencias entre compiladores de un paso y compiladores de dos o ms pasos.Compiladores de un solo pasoCompiladores de dos o ms pasos

Integran la generacin de cdigo con el anlisis semntico Las rutinas de ensamblador se entremezclan con el anlisis semntico Gramticas con atributos Las llamadas a las rutinas semnticas se realizan directamente desde el analizador sintctico. El analizador semntico genera un cdigo abstracto llamado cdigo intermedio. Se utiliza una fase ms llamada optimizador de cdigo. Utilizan pilas semnticas. Impone menos restricciones al lenguaje fuente. Requiere leer varias veces un cdigo fuente para producir un cdigo intermedio. El anlisis semntico se hace independientemente de la generacin de cdigo. Las acciones semnticas son por el mbito de ejecucin.

Las representaciones intermedias facilitan la optimizacin de cdigo. Las representaciones intermedias pueden ser la notacin sufija (expresiones aritmticas) y las tuplas o vectores (cuadrplas) para representar las instrucciones que deben ser ejecutadas.1.3 Comprobaciones de tipo en expresionesUn lenguaje con comprobacin fuerte de tipos es capaz de garantizar que los programas se pueden ejecutar sin errores de tipo, por lo que los errores de tipo se detectarn siempre en tiempo de compilacin.Como mnimo, ante un error, un comprobador de tipos debe informar de la naturaleza y posicin del error y recuperarse para continuar con la comprobacin del resto del programa a analizar.Veamos algunas de las operaciones a tener en cuenta en una comprobacin de tipos: Conversin de Tipos: A veces es necesario transformar el tipo de una expresin para utilizar correctamente un operador o para pasar de forma adecuada un parmetro a una funcin. Coercin: Es una conversin de tipos que realiza de forma implcita el propio compilador. Si es el programador el que realiza la conversin se tratar entonces de una conversin explcita. Sobrecarga de operadores: La sobrecarga se resuelve determinando el tipo de cada una de las expresiones intervinientes en la sobrecarga. Funciones polimrficas: Son aquellas que trabajan con argumentos cuyo tipo puede cambiar en distintas llamadas a la funcin.Tarea: Presentar un ejemplo de cada uno de los puntos anteriores, considerando el lenguaje Java1.4. Pila semntica en un analizadorsintctico.

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 Los problemas de integracin entre los subsistemas son sumamente costosos y muchos de ellos no se solucionan hasta que la programacin alcanza la fecha lmite para la integracin total del sistema. Se necesita una memoria auxiliar que nos permita guardar los datos intermedios para poder hacer la comparacin.Para implementar un traductor para una definicin con atributos sintetizados con la ayuda de un generador de analizadores sintcticos LR, se puede construir de tal manera que evalu los atributos conforme analiza la entrada.Un analizador sintctico ascendente utiliza una pila para guardar la informacin acerca de los subrboles que ya han sido analizados. Se pueden utilizar campos adicionales en la pila del analizador para guardar los valores. Los valores de los atributos se calculan de acuerdo con las ecuaciones de los atributos cada vez que se presenta un desplazamiento o una reduccin en la pila de anlisis sintctico.

Por ejemplo: 1.5. Esquema de traduccin.

Un mtodo para describir el anlisis semntico es la identificacin de atributos, o propiedades, de entidades del lenguaje que deben calcularse y escribir ecuaciones de atributos o reglas semnticas. Un conjunto de atributos y ecuaciones relacionados con la gramtica se le denomina gramtica con atributos. Las gramticas con atributos son ms tiles por que obedecen al principio de traduccin dirigida por sintaxis.Un atributo es cualquier propiedad de una construccin del lenguaje de programacin. Ejemplos: el tipo de datos, el valor de una expresin, la ubicacin de la variable en la memoria, el cdigo objeto de un procedimiento, el nmero de dgitos significativos de un nmero.Los atributos se pueden establecer antes del proceso de compilacin, adems los atributos solo se pueden establecer durante la ejecucin del programa.Ejemplos de atributos: El tipo de datos de una variable El valor de una expresin Ubicacin de una variable en la memoria Cdigo objeto de un procedimiento El numero de dgitos significativos en un numeroEl proceso de calcular un atributo y asociar el valor calculado se le conoce como fijacin del atributo. El tiempo que toma el proceso de compilacin/ejecucin cuando se presenta la fijacin de un atributo se denomina tiempo de fijacin. Si el atributo puede fijarse antes de la ejecucin se denomina esttico, mientras que los atributos que slo pueden fijarse durante la ejecucin se denominan dinmico. Tipo de datos: dinmico Valores de expresiones: generalmente dinmicos. Asignacin de variables: esttica o dinmica. Cdigo objeto de un procedimiento: estticoGramticas de atributosEn la semntica dirigida por sintaxis los atributos estn directamente asociados en los smbolos gramticas del lenguaje (los terminales y no terminales). Si X es un smbolo gramticas, y a es un atributo asociado a X, entonces X.a es una regla gramatical.Informalmente, se llamara atributos de un smbolo de la gramatica a toda la informacin aadida en el rbol de derivacin por el analizador semntico, asociada a los smbolos de los nodos anotados.Una gramtica con atributos es una extensin de las gramticas independientes del contexto a las que se aade un sistema de atributos formado por: Un conjunto de atributos semnticos. Los datos globales de la gramtica accesibles desde cualquiera de sus reglas, pero no asociadas a un objeto en particular. Un conjunto de acciones semnticas, distribuidas por las reglas de produccin.Semntica dirigida por sintaxis

En la semntica dirigida por sintaxis los atributos estn directamente asociados con los smbolos gramticas de los lenguajes. Ejemplo. Considere la siguiente gramtica numero->numero digito | digitoNumero->0 | 1 | 2 |3 |4 |5 |6 |7 |8 |9El atributo ms importante de un nmero es el valor.

Entonces el numero contiene precisamente un dgito, y su valor es el valor de ese digito. La ecuacin de atributo que expresa este hecho es:Numero.val=digito.valRegla gramaticalReglas semnticas

Numero1->numero2digitoNumero1.val=numero2.val*10+digito.val

Numero->digitoNumero.val=digito.val

Digito->0Digito.val=0

Digito->1Digito.val=1

Digito->2Digito.val=2

Digito->3Digito.val=3

Digito->4Digito.val=4

Ejemplo: Construir el rbol de anlisis semntico para el nmero 345

Ejercicio. Considere la siguiente gramtica para expresiones aritmticas enteras simples.Exp->exp+term | exp-term | termTerm->term*factor | factorFactor->(exp) | numero

El atributo principal es el valor.

Regla GramaticalReglas Semnticas

Exp1->exp2+termExp1.val=exp2.val+term.val

Exp1->exp2-termExp1.val=exp2.val-term.val

Exp->termExp.val=term.val

Term1->term2*factorTerm1.val->term2.val*factor.val

Term->factorTerm.val->factor.val

Factor->(exp)Factor.val=exp.val

Factor->numeroFactor.val=numero.val

Ejercicio. Utilice la gramtica anterior para hallar (34-3)*42

1.6. Generacin de la tabla de smbolo yde direcciones.

Se trata sencillamente de una estructura de datos de alto rendimiento que almacena toda la informacin necesaria sobre los identificadores de usuario. Tiene dos funciones principales: Efectuar chequeos semnticos. Generar cdigo.

Esta estructura permanece en memoria slo en tiempo de compilacin, no de ejecucin, excepto en aquellos casos en que se compila con opciones de depuracin. Los intrpretes tambin suelen mantener la tabla de smbolos en memoria durante la ejecucin, ya que sta se produce simultneamente con la traduccin. La tabla de smbolos almacena la informacin que en cada momento se necesita sobre las variables del programa; informacin tal como: nombre, tipo, direccin de localizacin en memoria, tamao, etc. Una adecuada y eficaz gestin de la tabla de smbolos es muy importante, ya que su manipulacin consume gran parte del tiempo de compilacin. De ah que su eficiencia sea crtica.La tabla de smbolos tambin sirve para guardar informacin referente a los tipos de datos creados por el usuario, los tipos enumerados y, en general, cualquier identificador creado por el usuario. En estos casos, el desarrollador puede optar por mezclar las distintas clases de identificadores en una sola tabla, o bien disponer de varias tablas, donde cada una de ellas albergar una clase distinta de identificadores: tabla de variables, tabla de tipos de datos, tabla de funciones de usuario.Cuando un lenguaje posee rea de declaraciones y rea de sentencias, la aparicin de un identificador tiene una semntica bien diferente segn el rea en que se encuentre: Si aparece en el rea de declaraciones, entonces hay que insertar el identificador en la tabla de smbolos, junto con la informacin que de l se conozca. Si el identificador ya se encontraba en la tabla, entonces se ha producido una redeclaracin y debe emitirse un mensaje de error semntico. Si aparece en el rea de sentencias, entonces hay que buscar el identificador en la tabla de smbolos para controlar que el uso que de l se est haciendo sea coherente con su tipo. Si el identificador no se encuentra en la tabla, entonces es que no ha sido previamente declarado, lo que suele considerarse un error semntico del que hay que informar al programador.En estos casos, el analizador lexicogrfico, cuando se encuentra un identificador desconoce en qu rea lo ha encontrado, por lo que no resulta fcil incluir una accin lxica que discrimine entre realizar una insercin o una bsqueda; as, deber ser el analizador sintctico quien haga estas operaciones. As, el atributo del token identificador suele ser su propio nombre.

Sin embargo, hay unos pocos lenguajes de programacin en los que no es necesario declarar las variables, bien porque slo existe un nico tipo de datos (como en nuestro ejemplo de la calculadora donde todo se consideran valores enteros) o bien porque el propio nombre de la variable sirve para discernir su tipo (en BASIC las variables que acaban en $ son de tipo cadena de caracteres). En estos casos, el propio analizador lexicogrfico puede insertar el identificador en la tabla de smbolos la primera vez que aparezca; antes de insertarlo realiza una operacin de bsqueda por si ya exista. Y sea cual sea el caso, se obtiene la entrada o ndice de la tabla en la que se encontraba o se ha incluido; dicho ndice ser el valor que el analizador lxico pasa al sintctico como atributo de cada identificador.La tabla de smbolo es el principal atributo heredado de un compilador. Las principales operaciones de la tabla de smbolos son la insercin, bsqueda y eliminacin.

1.7. Manejo de errores semnticos.

Los errores semnticos se encuentran en el sentido de la construccin: no tiene sentidoEjemplo: Dim A,BA = GuatemalaB = A*8