Your SlideShare is downloading. ×
0
An álisis Semántico Clase 14
El Compilador hasta ahora <ul><li>An álisis léxico </li></ul><ul><ul><li>Detecta entradas de tokens legales </li></ul></ul...
Por qu é necesitamos el análisis semántico <ul><li>El analizador sint áctico no puede detectar todos los errores. </li></u...
¿Qué hace el análisis semántico? <ul><li>Verificaciones de varias clases, t ípicamente: </li></ul><ul><ul><li>Que todos lo...
Ámbitos <ul><li>Consiste en empatar las declaraciones de identificadores con su uso </li></ul><ul><li>El  ámbito de un ide...
Ámbitos estáticos vs dinámicos <ul><li>La mayor ía de los lenguajes tienen ámbitos estáticos. </li></ul><ul><ul><li>El  ám...
Ejemplo de ámbito estático <ul><li>int x;  -- variable global o campo est ático </li></ul><ul><li>float convert_speed(floa...
Ámbito en lenguajes OO <ul><li>No todas las clases de identificadores siguen la regla del anidamiento m ás cercano </li></...
M ás sobre ámbito <ul><li>Los nombres de m étodos y atributos tienen reglas complejas. </li></ul><ul><li>Los nombres de ca...
Implementaci ón de la regla anidada más cercana <ul><li>La mayor parte del an álisis semántico se puede expresar como un r...
Tabla de S ímbolos <ul><li>Una tabla de s ímbolos es una estructura de datos empleada para registrar las declaraciones de ...
Implementación de la tabla de símbolos <ul><li>La estructura es una pila </li></ul><ul><ul><li>O una lista ligada que oper...
Una tabla de s í mbolos más elaborada  <ul><li>enter_scope()  comenzar un nuevo  ámbito anidado </li></ul><ul><li>find_sym...
Definición de clase <ul><li>Los nombres de clases se pueden usar antes de que sean definidos. </li></ul><ul><li>Usualmente...
Definición de clase <ul><li>Soluci ón usual </li></ul><ul><ul><li>Fase 1: Junta todos los nombres de clases (+ otras cosas...
Tipos <ul><li>¿Qu é es un tipo? </li></ul><ul><ul><li>La noci ón varía de lenguaje a lenguaje. </li></ul></ul><ul><li>Cons...
Tipos y operaciones <ul><li>Ciertas Operaciones son legales para cada tipo </li></ul><ul><ul><li>No tiene sentido sumar un...
Sistema de tipos <ul><li>Un sistema de tipos de un lenguaje especifica las operaciones que son v álidas para cada tipo. </...
Traslaci ón dirigida por la sintaxis <ul><li>La mayor ía de los compiladores son de múltiples pasadas. </li></ul><ul><li>R...
Compilación de una pasada <ul><li>Bajo ciertas circunstancias, es posible construir un compilador completo de una sola pas...
Verificaci ón de tipos <ul><li>Existen dos aspectos a considerar en la verificaci ón de tipos de un compilador: </li></ul>...
Verificación de tipos con aseveraciones <ul><li>En cada regla declaramos la aseveraci ón que se debe cumplir si el program...
Ejemplo de verificación de tipos (un ejemplo similar esta en la Sec. 6.4.4 de Kenneth)
Implementaci ón de una Tabla de Símbolos simple
Verificaci ón de tipos en Bison
Verificaci ón de tipos (Cont.)
Upcoming SlideShare
Loading in...5
×

Clase15

489

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
489
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
9
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "Clase15"

  1. 1. An álisis Semántico Clase 14
  2. 2. El Compilador hasta ahora <ul><li>An álisis léxico </li></ul><ul><ul><li>Detecta entradas de tokens legales </li></ul></ul><ul><li>An álisis Sintáctico </li></ul><ul><ul><li>Detecta entradas con árboles mal formados. </li></ul></ul><ul><li>An álisis Semántico </li></ul><ul><ul><li>Detecta todos los errores restantes </li></ul></ul>
  3. 3. Por qu é necesitamos el análisis semántico <ul><li>El analizador sint áctico no puede detectar todos los errores. </li></ul><ul><li>Algunos constructores del lenguaje no son libres de contexto </li></ul><ul><ul><li>Ejemplo: declaraci ón de identificadores y su uso. </li></ul></ul><ul><ul><li>No puedes utilizar una GLC para describir que alguna palabra particulares aparezca dos veces en una cadena separada por un texto en medio. </li></ul></ul><ul><ul><li>Una versión abstracta del problema es: </li></ul></ul><ul><ul><li>{wcw | w  (a | b)* } </li></ul></ul>declaraci ón uso
  4. 4. ¿Qué hace el análisis semántico? <ul><li>Verificaciones de varias clases, t ípicamente: </li></ul><ul><ul><li>Que todos los identificadores est én declarados. </li></ul></ul><ul><ul><li>Los tipos de las expresiones y la compatibilidad de las asignaciones. </li></ul></ul><ul><ul><li>Invocación de métodos compatibles con las declaraciones </li></ul></ul><ul><ul><li>etc … </li></ul></ul><ul><ul><li>Los requerimientos dependes del lenguaje. </li></ul></ul>
  5. 5. Ámbitos <ul><li>Consiste en empatar las declaraciones de identificadores con su uso </li></ul><ul><li>El ámbito de un identificador es la porción del programa en la cual el identificador es accesible. </li></ul><ul><li>El mismo identificador se puede referir a diferentes cosas en diferentes partes del programa. </li></ul><ul><ul><li>Ámbitos diferentes para el mismo nombre no se sobreponen. </li></ul></ul><ul><li>Un identificador puede tener ámbitos restringidos. </li></ul><ul><ul><li>Es decir solo es visible en áreas particulares del programa </li></ul></ul>
  6. 6. Ámbitos estáticos vs dinámicos <ul><li>La mayor ía de los lenguajes tienen ámbitos estáticos. </li></ul><ul><ul><li>El ámbito sólo depende del texto del programa no de la conducta en tiempo de ejecución. </li></ul></ul><ul><ul><li>Java, C, C++, Pascal, Modula, cool, etc. Tienen ámbito estático. </li></ul></ul><ul><li>Pocos lenguajes tiene ámbitos dinámicos </li></ul><ul><ul><li>Lisp, SNOBOL </li></ul></ul><ul><ul><li>El ámbito depende de la ejecución del programa </li></ul></ul>
  7. 7. Ejemplo de ámbito estático <ul><li>int x; -- variable global o campo est ático </li></ul><ul><li>float convert_speed(float y) </li></ul><ul><li>{ </li></ul><ul><li>float x ; --una x diferente (variable local) </li></ul><ul><li>x=y*1.6 </li></ul><ul><li>return x; </li></ul><ul><li>} </li></ul><ul><li>(El uso de x se refiere a la definici ón más cercana ) </li></ul>
  8. 8. Ámbito en lenguajes OO <ul><li>No todas las clases de identificadores siguen la regla del anidamiento m ás cercano </li></ul><ul><li>Por ejemplo las definiciones de clases </li></ul><ul><ul><li>Todas son visibles globalmente </li></ul></ul><ul><li>Declaraci ón de campos en Java </li></ul><ul><ul><li>Visibles a todos los m étodos en una clase </li></ul></ul><ul><ul><li>Y algunas veces a otras clases tambi én </li></ul></ul><ul><ul><ul><li>Dependiendo si son p úblicas o privadas, etc. </li></ul></ul></ul>
  9. 9. M ás sobre ámbito <ul><li>Los nombres de m étodos y atributos tienen reglas complejas. </li></ul><ul><li>Los nombres de campos son globales dentro de cualquier clase. </li></ul><ul><li>Pero los métodos y campos no necesitan estar definidos en la clase en la cual se están utilizando, pero si en una clase padre (herencia) </li></ul><ul><li>Los m étodos se pueden redefinir (sobreescritura) </li></ul>
  10. 10. Implementaci ón de la regla anidada más cercana <ul><li>La mayor parte del an álisis semántico se puede expresar como un recorrido descendente recursivo de un árbol o AST. </li></ul><ul><ul><li>Procesa un nodo n </li></ul></ul><ul><ul><li>Procesa los hijos de n </li></ul></ul><ul><ul><li>Finaliza procesando el nodo n </li></ul></ul><ul><li>En cualquier porci ón del árbol (contexto en el programa), necesitamos saber que identificadores están definidos. </li></ul>
  11. 11. Tabla de S ímbolos <ul><li>Una tabla de s ímbolos es una estructura de datos empleada para registrar las declaraciones de identificadores. </li></ul><ul><li>Los identificadores se almacenan cuando se declaran </li></ul><ul><ul><li>Con atributos </li></ul></ul><ul><ul><ul><li>Nombres de clases, m étodos, variables, etc </li></ul></ul></ul><ul><ul><li>Y sub-atributos </li></ul></ul><ul><ul><ul><li>public, private, integer, float, static, array, etc </li></ul></ul></ul><ul><ul><ul><li>Su localizaci ón en la pila si es variable local </li></ul></ul></ul><ul><ul><li>La tabla de s ímbolos se consulta para cualquier uso. </li></ul></ul><ul><ul><ul><li>Verificaci ón semántica y generación de código. </li></ul></ul></ul>
  12. 12. Implementación de la tabla de símbolos <ul><li>La estructura es una pila </li></ul><ul><ul><li>O una lista ligada que opera como pila </li></ul></ul><ul><li>Operaciones </li></ul><ul><ul><li>add_symbol(x) inserta x y la informaci ón asociada, tal como el tipo, en la pila. </li></ul></ul><ul><ul><li>find_symbol(x) busca en la pila, comenzando del tope de la pila.Regresa el primer x encontrado o NULL si no se encontro. </li></ul></ul><ul><ul><li>remove_symbol() saca elemento de la pila </li></ul></ul>
  13. 13. Una tabla de s í mbolos más elaborada <ul><li>enter_scope() comenzar un nuevo ámbito anidado </li></ul><ul><li>find_symbol(x) encuentra el x actual (o null) </li></ul><ul><li>add_symbol(x) agrega un símbolo x a la tabla </li></ul><ul><li>check_scope(x) verdadero si x esta definido en el ámbito actual (verificar declaraciones múltiples) </li></ul><ul><li>exit_scope() salir del ámbito </li></ul><ul><ul><li>Descartar todos los s ímbolos del ámbito reciente </li></ul></ul>
  14. 14. Definición de clase <ul><li>Los nombres de clases se pueden usar antes de que sean definidos. </li></ul><ul><li>Usualmente no se puede verificar esto para los nombres de clases. </li></ul><ul><ul><li>Usando una tabla de s ímbolos (compilación separada?) </li></ul></ul><ul><ul><li>O en una pasada (a menos que se requieran prototipos) </li></ul></ul>
  15. 15. Definición de clase <ul><li>Soluci ón usual </li></ul><ul><ul><li>Fase 1: Junta todos los nombres de clases (+ otras cosas) </li></ul></ul><ul><ul><li>Fase 2: Realiza la verificaci ón </li></ul></ul><ul><li>El an álisis semántico completo requiere varias pasadas. </li></ul><ul><ul><li>Probablemente m ás de una </li></ul></ul><ul><li>La mayor ía de compiladores en JAVA busca por archivos de clases previamente compiladas. </li></ul>
  16. 16. Tipos <ul><li>¿Qu é es un tipo? </li></ul><ul><ul><li>La noci ón varía de lenguaje a lenguaje. </li></ul></ul><ul><li>Consenso </li></ul><ul><ul><li>Un conjunto de valores </li></ul></ul><ul><ul><li>Un conjunto de operadores sobre los valores </li></ul></ul><ul><li>Las clases son una instanciaci ón moderna de la noción de tipo </li></ul>
  17. 17. Tipos y operaciones <ul><li>Ciertas Operaciones son legales para cada tipo </li></ul><ul><ul><li>No tiene sentido sumar un apuntador a funci ón y un entero en C </li></ul></ul><ul><ul><li>Tiene sentido sumar dos enteros </li></ul></ul><ul><ul><li>Pero ambos tienen la misma implementación en lenguaje ensamblador! </li></ul></ul>
  18. 18. Sistema de tipos <ul><li>Un sistema de tipos de un lenguaje especifica las operaciones que son v álidas para cada tipo. </li></ul><ul><li>La meta de la verificación de tipos es asegurar que las operaciones se utilizan con los tipos correctos. </li></ul><ul><ul><li>Hace cumplir la interpretaci ón de los valores. </li></ul></ul><ul><ul><li>Algunas veces puede realizar conversiones autom áticas cuando el lenguaje permite modos mezclados y promoción de tipos. </li></ul></ul><ul><li>El sistema de tipos provee una formalizaci ón concisa de las reglas de verificación semántica. </li></ul>
  19. 19. Traslaci ón dirigida por la sintaxis <ul><li>La mayor ía de los compiladores son de múltiples pasadas. </li></ul><ul><li>Recorre el AST para el análisis semántico, verificación de tipos. </li></ul><ul><li>Recorre este otra vez para optimización. </li></ul><ul><li>y generación de código </li></ul><ul><li>.. etc. </li></ul>
  20. 20. Compilación de una pasada <ul><li>Bajo ciertas circunstancias, es posible construir un compilador completo de una sola pasada. </li></ul><ul><li>Es posible con ciertas condiciones del lenguaje </li></ul><ul><ul><li>Particularmente cuando se declara antes de que se use. </li></ul></ul><ul><li>Esto requiere que la traslaci ón se realice durante un recorrido del árbol en profundidad. </li></ul><ul><ul><li>La forma en que el analizador sint áctico se mueve a través del árbol </li></ul></ul>
  21. 21. Verificaci ón de tipos <ul><li>Existen dos aspectos a considerar en la verificaci ón de tipos de un compilador: </li></ul><ul><ul><li>Procesar las declaraciones y mantener una tabla de s ímbolos. </li></ul></ul><ul><ul><ul><li>Almacenar el tipo de cada identificador en la tabla de s ímbolos. </li></ul></ul></ul><ul><ul><li>Realizar la verificaci ón de tipos y hacer cumplir las reglas semánticas en expresiones y otros elementos del lenguaje (e.g. Lista de argumentos, etc) </li></ul></ul><ul><ul><li>Buscar el tipo de los identificadores usados. </li></ul></ul><ul><ul><li>Inferir los tipos de constantes </li></ul></ul><ul><ul><li>Calcular el tipo de los nodos que denotan expresiones. </li></ul></ul>
  22. 22. Verificación de tipos con aseveraciones <ul><li>En cada regla declaramos la aseveraci ón que se debe cumplir si el programa es válido. </li></ul><ul><li>ASSERT(condición) ¨mensaje¨ significa: </li></ul><ul><ul><li>La condici ón se supone debe cumplirse </li></ul></ul><ul><ul><li>Si no es verdadera, imprime mensaje. </li></ul></ul><ul><li>Puede usarse una macro en C para este prop ósito </li></ul><ul><ul><li>#define ASSERT(x,y) if (!x) printf( ¨line %d: %sn¨,lineno, (y) ) </li></ul></ul>
  23. 23. Ejemplo de verificación de tipos (un ejemplo similar esta en la Sec. 6.4.4 de Kenneth)
  24. 24. Implementaci ón de una Tabla de Símbolos simple
  25. 25. Verificaci ón de tipos en Bison
  26. 26. Verificaci ón de tipos (Cont.)
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×