lenguajes y automatas ii unidad i

Download Lenguajes y Automatas II Unidad I

If you can't read please download the document

Upload: specialgaara

Post on 25-Jan-2016

11 views

Category:

Documents


2 download

DESCRIPTION

lenguajes y automatas

TRANSCRIPT

19/09/2013UNIDAD I.- ANALISIS SEMANTICO 1.1.- Arboles de expresiones. 1.2.- Acciones semnticas de un analizador sintctico. 1.3.- Comprobaciones de tipos en expresiones . 1.4.- Pila semntica en un analizador sintctico. 1.5.- Esquema de traduccin. 1.6.- Generacin de la tabla de smbolo y de direcciones. 1.7.- Manejo de errores semnticos.2MATERIA: LENGUAJES Y AUTMATAS IIDra. Miriam Martnez ArroyoIntroduccin El lenguaje es un vehculo por el cual se transmiten instrucciones a un procesador para que las ejecute y produzca ciertos resultados. Es tarea del compilador extraer el contenido semntico incluido en las sentencias del programa. Ciertos aspectos relativos a la correccin de un programa no se pueden expresar claramente mediante el lenguaje de programacin. Es necesario dotar al compilador de rutinas auxiliares para captar todo lo que no se ha expresado mediante la sintaxis del lenguaje.4INTRODUCCIN3El compilador hasta ahora Anlisis lxico Detecta entradas de tokens legales5Introduccin Semntica: conjunto de reglas que espe significado de cualquier sentencia sintcticamente correcta y escrita en un determinado lenguaje. El anlisis semntico, a diferencia de otras no se realiza claramente diferenciado del resto de las tareas del compilador. Fase en la que se obtiene informacin necesaria para la compilacin, tras conocer la estructura sintctica del programa. Completa las fases de anlisis lxico y sintctico incorporando comprobaciones que no pueden asimilarse al mero reconocimiento de una cadena dentro de un lenguaje6 Anlisis Sintctico Detecta entradas con rboles mal formados. Anlisis Semntico Detecta todos los errores restantes119/09/2013Objetivo del anlisis semntico La semntica del lenguaje forma parte de la especificacin del mismo. Normalmente la semntica de un lenguaje se describe de manera informal. El objetivo del anlisis semntico es comprobar si la semntica del programa que se est compilando cumple las especificaciones de la semntica del lenguaje fuente.7Objetivo del anlisis semnticoAlgunas de estas comprobaciones son: Para realizar el anlisis semntico se utilizan gramticas de atributos, que bsicamente, son gramticas independientes del contexto en las que los smbolos tienen asignados atributos o valores semnticos. Hay dos tipos de atributos: sintetizados: corresponden al no terminal de la parte izquierda de una regla. Se calculan a partir de los atributos de los smbolos de la parte derecha de la regla. heredados: corresponden a los smbolos de la parte derecha de la regla. Se construyen a partir de los atributos de los smbolos de ambas partes de la regla.8Por qu necesitamos el anlisis semntico9Qu hace el anlisis semntico? Verificaciones de varias clases, tpicamente: Que todos los identificadores estn declarados. Los tipos de las expresiones y la compatibilidad de las asignaciones. Invocacin de mtodos compatibles con las declaraciones etc Los requerimientos dependes del lenguaje.10 El analizador sintctico no puede detectar todos los errores. Algunos constructores del lenguaje no son libres de contexto Ejemplo: declaracin de identificadores y su uso. No puedes utilizar una GLC para describir que alguna palabra particulares aparezca dos veces en una cadena separada por un texto en medio. Una versin abstracta del problema es: {wcw | w (a | b)* }declaracin uso Se asocia informacin a las construcciones del lenguaje de programacin proporcionando atributos a los smbolos de la gramtica. Ejemplo: el valor de una expresin, el tipo de una variable, su mbito, un trozo de cdigo, el nmero de argumentos de una funcin, etc. Los valores de los atributos se calculan mediante reglas semnticas asociadas a las producciones gramaticales.El anlisis semntico incluye:11 La construccin de la Tabla de Smbolos para llevar un seguimiento del significado de los identificadores en el programa: variables, funciones, tipos, parmetros y mtodos de paso de parmetros en funciEtc.12 Realizar la comprobacin e inferencia de tipos en expresiones y sentencias. Por ejemplo: que ambos lados de una asignacin tengan tipos adecuados, que no se declaren variables con el mismo nombre, que los parmetros de llamada a una funcin tengan tipos adecuados, nmero de parmetros correcto, Etc.219/09/20131.1.-ARBOL DE EXPRESIONES141.1.- Arboles de expresiones.13Las expresiones regulares que se pueden representar a travs de los smbolos contenidos en un alfabeto, tambin se pueden representar a travs de rboles, que se denominan rboles de expresiones. La informacin contenida en los rboles de expresio-nes tienen las siguientes caractersticas. Se almacena en forma de estructura jerrquica, porque los componentes estn en diferentes niveles.La informacin se almacena en forma Dinmica porque su forma, tamao y contenido pueden variar durante la ejecucin. Los datos son almacenados de forma Organizada porque importa la forma en que est dispuesto el contenido. La consulta de los datos se hace de manera rpida y eficiente obteniendo mejores resultados.15Propiedades de los rboles Los rboles de expresiones estn compuestos por los siguientes elementos: Token.- es una Unidad mnima de informacin entendible por un compilador. Puede ser un ope-rando o un operador. Operandos.- Los operandos pueden ser las hojas de los nodos. Raz.- La raz de un rbol puede ser cuaquier operador aritmtico.16Reglas para un rbol La reglas para representar una expresin mediante un rbol son las siguientes:17rboles de expresin Representan un orden de ejecucin18+para la expresin siguiente:1.- Cada hoja est etiquetada con un operando y solo consta de ese operando. 2.- Cada nodo interior n est etiquetado con un solo operador. 3.- Las hojas estn representadas por los operandos y los nodos por la raz de cada rbol.(A* B) + C * D + EA*B C+*DE319/09/2013Otro ejemplo de rbol sintctico para una expresin Aritmtica: (7 + 12) * (-9) -1711920*+ -712921Ejemplo: x=(x+y)*(a-b)222324419/09/2013252627282930519/09/20133132http://www.esdebian.org/wiki/interpretprete-funciones-mediante-arbol-binario-expresiones33343536619/09/201337381.2. Acciones Semnticas de un Analizador SintcticoDependiendo del tipo de sentencias, semnticas pueden agruparse en: las acciones401.2. Acciones Semnticas de un Analizador Sintctico39 Sentencias de Declaracin: Se utilizan para completar la seccin de tipos de la Tabla de Smbolos. Sentencias ejecutables: Se utilizan para realizar comprobaciones de tipos entre los operandos implicados.Algunas de estas comprobaciones son: comprobacin de tipos en sentencias de asignacin comprobacin de tipos en operaciones aritmtico-lgicas comprobacin de tipos en las sentencias condicionales comprobacin de la declaracin de las variables antes de su uso comprobacin de unicidad de identificadores comprobacin del indexado de vectoresContinuacin41 Funciones y procedimientos: Se utilizan para comprobar el nmero, orden y tipo de los parmetros actuales en cada llamada a una funcin o procedimiento. Identificacin de variables: Se utilizan para comprobar si un identificador ha sido declarado antes de utilizarlo. Etiquetas: comprobar si hay etiquetas repetidas y validacin.42719/09/2013Continuacin Constantes: comprobar que no se utilicen en la parte izquierda de una asignacin. Conversiones y equivalencias de tipo: realizan la verificacin de las constantes para que stas sean de un mismo tipo. Sobrecarga de operadores y funciones: en las funciones y los procedimientos, se utilizan para detectar y solventar la autenticidad de los datos.43mbitos Consiste en empatar las declaraciones de identificadores con su uso El mbito de un identificador es la porcin del programa en la cual el identificador es accesible. El mismo identificador se puede referir a diferentes cosas en diferentes partes del programa. mbitos diferentes para el mismo nombre no se sobreponen. Un identificador puede tener mbitos restringidos. Es decir solo es visible en reas particulares del programa44mbitos estticos vs dinmicos La mayora de los lenguajes tienen mbitos estticos. El mbito slo depende del texto del programa no de la conducta en tiempo de ejecucin. Java, C, C++, Pascal, Modula, cool, etc. Tienen mbito esttico.45Ejemplo de mbito estticoint x; -- variable global o campo esttico float convert_speed(float y) { float x; --una x diferente (variable local) x=y*1.6 return x; } (El uso de x se refiere a la definicin ms cercana )46 Pocos lenguajes tiene mbitos dinmicos Lisp, SNOBOL El mbito depende de la ejecucin del programambito en lenguajes OO No todas las clases de identificadores siguen la regla del anidamiento ms cercano Por ejemplo las definiciones de clases Todas son visibles globalmente47Ms sobre mbito Los nombres de mtodos y atributos tienen reglas complejas. Los nombres de campos son globales dentro de cualquier clase. Pero los mtodos y campos no necesitan estar definidos en la clase en la cual se estn utilizando, pero si en una clase padre (herencia) Los mtodos se pueden redefinir (sobreescritura)48 Declaracin de campos en Java Visibles a todos los mtodos en una clase Y algunas veces a otras clases tambin Dependiendo si son pblicas o privadas, etc.819/09/2013Implementacin de la regla anidada ms cercana La mayor parte del anlisis semntico se puede expresar como un recorrido descendente recursivo de un rbol o AST. Procesa un nodo n Procesa los hijos de n Finaliza procesando el nodo n491.3.- Comprobaciones de Tipos en Expresiones50 En cualquier porcin del rbol (contexto en el programa), necesitamos saber que identificadores estn definidos.1.3.-Comprobacin de tipos en Expresiones La comprobacin de tipos es una forma de asegurar que los identificadores relacionados sean de tipos compatibles. Dos identificadores son compatibles de acuerdo a lo siguiente: Cuando forman el lado izquierdo y el lado derecho de un operador. Cuando forman el lado izquierdo y el lado derecho de una proposicin de asignacin. Cuando sean parmetros reales y formales.51Las comprobaciones de consistencia que se efectan antes de la ejecucin del programa fuente, se denominan comprobaciones estticas. Las comprobaciones que se realizan durante la ejecucin del programa objeto se denominan comprobaciones dinmicas. La revisin de la sintaxis de un programa fuente es un ejemplo de comprobacin esttica, mientras que la comprobacin de tipos, es un ejemplo de comprobacin que con frecuencia puede efectuarse en forma esttica y que en ocasiones debe realizarse dinmicamente.52Tipos Qu es un tipo? La nocin vara de lenguaje a lenguaje.53Tipos y operaciones Ciertas Operaciones son legales para cada tipo No tiene sentido sumar un apuntador a funcin y un entero en C Tiene sentido sumar dos enteros Pero ambos tienen la misma implementacin en lenguaje ensamblador!54 Consenso Un conjunto de valores Un conjunto de operadores sobre los valores Las clases son una instanciacin moderna de la nocin de tipo919/09/2013Sistema de tipos Un sistema de tipos de un lenguaje especifica las operaciones que son vlidas para cada tipo. La meta de la verificacin de tipos es asegurar que las operaciones se utilizan con los tipos correctos. Hace cumplir la interpretacin de los valores. Algunas veces puede realizar conversiones automticas cuando el lenguaje permite modos mezclados y promocin de tipos.55Traslacin dirigida por la sintaxis La mayora de los compiladores son de mltiples pasadas. Recorre el AST (rbol de anlisis sintctico) para el anlisis semntico, verificacin de tipos. Recorre este otra vez para optimizacin. y generacin de cdigo .. etc.56 El sistema de tipos provee una formalizacin concisa de las reglas de verificacin semntica.Compilacin de una pasada Bajo ciertas circunstancias, es posible construir un compilador completo de una sola pasada. Es posible con ciertas condiciones del lenguaje Particularmente cuando se declara antes de que se use.Verificacin de tipos 57 Existen aspectos a considerar en la verificacin de tipos de un compilador Procesar las declaraciones y mantener una tabla de smbolos. Almacenar el tipo de cada identificador en la tabla de smbolos. Realizar la verificacin de tipos y hacer cumplir las reglas semnticas en expresiones y otros elementos del lenguaje (e.g. Lista de argumentos, etc.) Buscar el tipo de los identificadores usados. Inferir los tipos de constantes Calcular el tipo de los nodos que denotan expresiones.58 Esto requiere que la traslacin se realice durante un recorrido del rbol en profundidad. La forma en que el analizador sintctico se mueve a travs del rbolVerificacin de tipos con aseveraciones En cada regla declaramos la aseveracin que se debe cumplir si el programa es vlido. ASSERT(condicin) mensaje significa: La condicin se supone debe cumplirse Si no es verdadera, imprime mensaje.59Ejemplo de verificacin de tipos (un ejemplo similar esta en la Sec. 6.4.4 de Kenneth)60 Assert (Visual Studio 2012 ) Prueba una asercin de software en tiempo de compilacin. Si la expresin constante especificada es false, el compilador muestra el mensaje especificado y la compilacin emite un error; si no, la declaracin no tiene ningn efecto.static_assert( constant-expression, string-literal ); Puede usarse una macro en C para este propsito#define ASSERT(x,y) if (!x) printf(line %d: %s\n,lineno, (y))1019/09/2013Verificacin de tipos en Bison61Verificacin de tipos (Cont.)62Expresiones de Tipos El tipo de una construccin de un lenguaje se denotar mediante una Expresin de tipo. Una expresin de tipo es, o bien un tipo bsico o se forma aplicando un operador llamado constructor de tipos a otras expresiones de tipos. Los conjuntos de tipos y construcciones dependen del lenguaje que deba comprobarse. bsicas63 Se utilizar la siguiente definicin de expresiones de tipos: 1. Un tipo bsico es una expresin de tipo. Entre los tipos bsicos se encuentran bolean, char, integer y real. Un tipo bsico especial, la funcin error_tipo(), sealar un error durante la com-probacin de tipos. 2- Como se puede dar nombre a las expresiones de tipos, el nombre de un tipo es una expresin de tipo.643.-Un constructor de tipos aplicado a expresiones de tipos es una expresin de tipo. Los constructores incluyen: Matrices, Productos, Registros, apuntadores y funciones).65b) Productos. Si T1 y T2 son expresiones de tipo, entonces su producto cartesiano T1 x T2 es una expresin de tipo. Se supone que x es asociativa por la izquierda. c) Registros. La diferencia entre un registro y un producto es que los campos de un registro tienen nombres. El constructor de tipos record se aplicar a un conjunto ordenado formado con nombres de campos y tipos de campos. Por ejemplo, el fragmento de programa en Pascal: Type fila = record Direccin: integer; Lexema: array [1..15] of char end; var tabla: array [1..10] of fila;66a) Matrices. Si T es una expresin de tipo, entonces array (I, T) es una expresin de tipo que indica el tipo de una matriz con elementos de tipo T y conjunto de ndices I, I con frecuencia es un rango de enteros. Por ejemplo, la declaracin en Pascal Var A: array[1..10] of integer; Asocia la expresin de tipo array(1..10, integer) con A.1119/09/2013Declara que el nombre de tipo fila representa la expresin de tipo. Record (direccin x integer ) x (lexema x array (1..15, char)) Y que la variable tabla es una matriz de registro de este tipo. d) Apuntadores.- Si T es una funcin de tipo, entonces pointer (T) es una expresin de tipo que indica el tipo apuntador a un objeto de T. Por ejemplo, en Pascal, la declaracin Var pila: - fila Declara que la variable pila tiene tipo pointer (fila)67e) Funciones.- matemticamente una funcin transforma los elementos de un conjunto, el dominio, a elementos de otro conjunto, el rango. Se pueden considerar las funciones dentro de los lenguajes de programacin como transformaciones de un dominio de tipo D a un rango tipo R. La expresin tipo D R indica el tipo de dicha funcin. Por ejemplo, la funcin predefinida mod de Pascal tiene un dominio de tipo int x int, es decir, un par de enteros, y rango de tipo int. De esta forma, se dice que mod tiene el tipo1. int x int int68 Con frecuencia existen, por razones de implantacin, limitaciones que en cuanto al tipo que una funcin puede devolver; por ejemplo, matrices o funciones. Sin embargo existen lenguajes que permiten que las funciones devuelvan objetos de tipos arbitrarios, as que se puede definir una funcin g de tipo (integer integer); (integer integer)694.- Las expresiones de tipo pueden contener variables cuyos valores son expresiones de tipos. Una manera conveniente de representar expresiones de tipo es utilizando un grafo. Con el enfoque de la traduccin dirigida por la sintaxis se puede construir un rbol o un GDA para una expresin de tipo, con nodos interiores para los constructores de tipos y hojas para los tipos bsicos, nombres de tipos, y variables de tipos.70 Es decir, g toma como argumento una funcin que transforma un entero en un entero y g produce como resultado otra funcin del mismo tipo.Por ejemplo, consideremos la siguiente declaracin: Str : array [0..80] of char; I : integer; Estticamente puede que no se cumpla la condicin: 0