Sie sind auf Seite 1von 26

Anlisis Semntico

El Compilador hasta ahora


Anlisis lxico
Detecta entradas de tokens legales

Anlisis Sintctico
Detecta entradas con rboles mal formados.

Anlisis Semntico
Detecta todos los errores restantes

Por qu necesitamos el anlisis semntico


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

Qu 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.

mbitos
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 programa

mbitos 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.

Pocos lenguajes tiene mbitos dinmicos


Lisp, SNOBOL El mbito depende de la ejecucin del programa

Ejemplo de mbito esttico


int 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 )

mbito 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 globalmente

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.

Ms 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)

Implementacin 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 n

En cualquier porcin del rbol (contexto en el programa), necesitamos saber que identificadores estn definidos.

Tabla de Smbolos
Una tabla de smbolos es una estructura de datos empleada para registrar las declaraciones de identificadores. Los identificadores se almacenan cuando se declaran
Con atributos
Nombres de clases, mtodos, variables, etc

Y sub-atributos
public, private, integer, float, static, array, etc Su localizacin en la pila si es variable local

La tabla de smbolos se consulta para cualquier uso.


Verificacin semntica y generacin de cdigo.

Implementacin de la tabla de smbolos


La estructura es una pila
O una lista ligada que opera como pila

Operaciones
add_symbol(x) inserta x y la informacin asociada, tal como el tipo, en la pila. find_symbol(x) busca en la pila, comenzando del tope de la pila.Regresa el primer x encontrado o NULL si no se encontro. remove_symbol() saca elemento de la pila

Una tabla de smbolos ms elaborada


enter_scope()

comenzar un nuevo mbito anidado find_symbol(x) encuentra el x actual (o null) add_symbol(x) agrega un smbolo x a la tabla check_scope(x) verdadero si x esta definido en el mbito actual (verificar declaraciones mltiples) exit_scope() salir del mbito Descartar todos los smbolos del mbito reciente

Definicin de clase
Los nombres de clases se pueden usar antes de que sean definidos. Usualmente no se puede verificar esto para los nombres de clases.
Usando una tabla de smbolos (compilacin separada?) O en una pasada (a menos que se requieran prototipos)

Definicin de clase
Solucin usual
Fase 1: Junta todos los nombres de clases (+ otras cosas) Fase 2: Realiza la verificacin

El anlisis semntico completo requiere varias pasadas.


Probablemente ms de una

La mayora de compiladores en JAVA busca por archivos de clases previamente compiladas.

Tipos
Qu es un tipo?
La nocin vara de lenguaje a lenguaje.

Consenso
Un conjunto de valores Un conjunto de operadores sobre los valores

Las clases son una instanciacin moderna de la nocin de tipo

Tipos 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!

Sistema 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.

El sistema de tipos provee una formalizacin concisa de las reglas de verificacin semntica.

Traslacin dirigida por la sintaxis


La mayora de los compiladores son de mltiples pasadas. Recorre el AST para el anlisis semntico, verificacin de tipos. Recorre este otra vez para optimizacin. y generacin de cdigo .. etc.

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.

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 rbol

Verificacin de tipos
Existen dos 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.

Verificacin 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.

Puede usarse una macro en C para este propsito


#define ASSERT(x,y) if (!x) printf(line %d: %s\n,lineno, (y))

Ejemplo de verificacin de tipos (un ejemplo similar esta en la Sec. 6.4.4 de Kenneth)

Implementacin de una Tabla de Smbolos simple

Verificacin de tipos en Bison

Verificacin de tipos (Cont.)

Das könnte Ihnen auch gefallen