You are on page 1of 33

Lenguajes y Autmatas ll

Alumnos:
Melissa Elizabeth Gmez Whijares
David Guillermo Prez Chessani
Cecilio Arturo Salas Bahena
Juan Antonio Turrubiates Ziga



13 de Octubre del 2014
Profa.: Paula Araceli Aguilar Alcal 11:00-12:00 Hrs

Unidad 1: Anlisis Semntico
Anlisis
Semntico
Introduccin
Anlisis semntico
Que es la semntica?
Se refiere a los aspectos del significado, sentido o interpretacin del significado de
un determinado elemento, smbolo, palabra, expresin o representacin formal.

Anlisis semntico
Se trata de determinar el tipo de los resultados
intermedios, comprobar que los argumentos
que tiene un operador pertenecen al conjunto
de los operadores posibles, y si son compatibles
entre s, etc. En definitiva, comprobar que el
significado de lo que se va leyendo es vlido.
Anlisis semntico
El anlisis semntico se realiza posteriormente al sintctico
y mucho ms difcil de formalizar que ste.

La salida terica de la fase de anlisis semntico sera
un rbol semntico.
Que es un rbol
semntico?
Es una estructura jerrquica en la cual se registran las
operaciones que implica u operan dentro del programa
fuente
En cada una de las ramas del
rbol semntico se registra el
valor o significado que este
debe tener, y el anlisis semntico
se encarga de terminar cual de
los valores registrados en las
ramas es aplicable.
Suponiendo que tenemos esta lnea de cdigo en Java:

res=valor1+valor2;


El anlisis semntico se va a encargar que tanto el valor1 como el
valor2 tengan datos que son compatibles en comn y que adems se
les pueda aplicar dicho operador.
En Java el smbolo (+)
implica una suma de
valores.
Ejemplo:
Tabla de smbolos
Un compilador necesita guardar y usar la informacin de los
objetos que se va encontrando en el texto fuente, como
variables, etiquetas, declaraciones de tipos, etc.

Esta informacin se almacena en una estructura de datos
interna conocida como tabla de smbolos.
Tabla de smbolos
El compilador debe desarrollar una serie de
funciones relativas a la manipulacin de esta tabla
como insertar un nuevo elemento en ella, consultar
la informacin relacionada con un smbolo, borrar
un elemento, etc.

Como se tiene que acceder mucho a la tabla de
smbolos los accesos deben ser lo ms rpidos
posible para que la compilacin sea eficiente.
Unidad 1: Anlisis
Semntico
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.
1.1 rboles 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 una expresin
Por ejemplo:
Una llamada al mtodo o una operacin binaria, como x < y.

Reglas Para La
Construccin De Arboles
De Expresin
Para construir el rbol de expresiones que represente nuestra expresin
matemtica es necesario construir primero la misma expresin pero en
la notacin prefija correspondiente y a partir de esta es que se
construye el rbol.


Reglas Para La
Construccin De Arboles
De Expresin
Sea A una expresin infija cualquiera, formada por operadores,
parntesis (izquierdos y derechos) y operandos, tambin se usar una
pila para los operadores. El procedimiento seguido es el siguiente:
1.- Se lee un elemento de A, si este es un operador o un parntesis
izquierdo, entonces se acta segn la regla I y si es un operando
entonces se enva directamente a la expresin de notacin prefija.
2.- Si el elemento ledo de A es un parntesis derecho, entonces se
desapilarn elementos de la pila de operadores hasta encontrar el
correspondiente parntesis izquierdo.
3.- Cada elemento desapilado pasa a formar parte de la notacin
polaca, excepto los parntesis.
4.- Cuando no queden elementos en A, entonces se desapilan
operadores de la pila, hasta que esta quede vaca.

Ejemplo:





Se lee el primer elemento, si este es un operador o un parntesis
izquierdo, entonces se acta segn la regla I y si es un operando
entonces se enva directamente a la expresin de notacin prefija.
E E + T
Primer Elemento Ledo
Regla 1
Existe un orden de prioridad para los operadores, que de menor a
mayor es el siguiente:
Suma (+) y Resta (-)
Multiplicacin (*) y Divisin (/)
Exponenciacin (^)
Operadores unarios.
El parntesis izquierdo lo trataremos como un operador (aunque no lo
es) cuyo orden de prioridad es el mayor de todos cuando se quiera
apilar y el menor de todos cuando est en la cima de la pila.

Reglas Para La
Construccin De Arboles
De Expresin
Cuando se intente apilar algn operador se har lo siguiente:
Si es un operador unario entonces se apila, si es un operador binario, se
comparar su prioridad con el ltimo insertado en la pila (el de la cima),
si su prioridad es mayor, entonces se apilar.
Si ocurre lo contrario (su prioridad es menor o igual) entonces el
operador de la cima de la pila se desapilar y pasar a formar parte de
la notacin polaca.
Se volver a intentar apilar el operador siguiendo la misma regla, hasta
que se pueda apilar, si la pila queda vaca tambin se apila.
El parntesis izquierdo siempre se apilar y no podr ser desapilado por
ningn operador y por tanto no formar parte de la notacin polaca
inversa.

Ejemplo:
Sea la siguiente expresin infija: 2^sin(y+x)ln(x):

En la siguiente tabla se muestra paso a paso la conversin a notacin postfija.
Se usa el color rojo para sealar los casos en que es necesario desapilar operadores de la pila.


Reglas Para La
Construccin De Arboles
De Expresin
Una vez obtenida la expresin en notacin postfija, se puede evaluar
mediante el uso nuevamente de una pila.
Sin embargo, en nuestro caso se trabaja con una rbol binario de
expresiones, as que lo que se hace es construir el rbol.
El algoritmo usado para construir el rbol no usa como tal la expresin
postfija ya conformada, sino que el rbol se va construyendo usando las
mismas reglas con las que se construye la notacin postfija, una pila para
los operadores y otra para los nodos del rbol, ambas no son necesitadas al
terminar el rbol. El algoritmo es el siguiente:
Se siguen las mismas reglas expuestas anteriormente usando la pila de
operadores, pero cuando se encuentra un operando o un operador es
desapilado, entonces se crea el nodo correspondiente y se acta segn la
regla II. Al finalizar el algoritmo solo debe quedar un nodo apilado en la pila
de nodos, el que constituye el nodo raz de nuestro rbol de expresiones.

Regla 2
Si el nodo corresponde a un operando, entonces se apila.
Si el nodo corresponde a una operador unario entonces se desapila un
nodo de la pila de nodos y es enlazado a la rama izquierda del nodo
correspondiente al operador unario y este ltimo es apilado.
Si el nodo corresponde a un operador binario entonces dos nodos son
desapilados de la pila de nodos, el primero es enlazado a la rama
derecha del nodo binario y el segundo a la rama izquierda, nuevamente
este nodo es apilado.
Ejemplo:
En el siguiente ejemplo se usa la misma expresin infija anterior (2^sin(y+x) ln (x))
para ilustrar el procedimiento para construir el rbol:
Ejemplo:
En el siguiente ejemplo se usa la misma expresin infija anterior (2^sin(y+x) ln (x))
para ilustrar el procedimiento para construir el rbol:
Evaluacin de la expresin
representada por el rbol
Luego de que se tiene el rbol conformado, la evaluacin de la
expresin contenida se realiza mediante un procedimiento recursivo. El
algoritmo en seudocdigo es el siguiente:
resultado = evaluar (raiz_arbol)

1.2. Acciones semnticas
de un analizador sintctico.
ACCIONES SEMNTICAS
Dependiendo del tipo de sentencias, las acciones semnticas pueden agruparse en:
Sentencias de Declaracin: Completar la seccin de tipos de la Tabla de Smbolos.
Sentencias ejecutables: Realizar comprobaciones de tipos entre los operandos
implicados.
Funciones y procedimientos: Comprobar el nmero, orden y tipo de los parmetros
actuales en cada llamada a una funcin o procedimiento.
Identificacin de variables: Comprobar si un identificador ha sido declarado antes 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.

1.2. Acciones semnticas
de un analizador sintctico.
La labor de comprobacin de tipos consiste en conferir a las
construcciones sintcticas del lenguaje la semntica de tipificacin y en
realizar todo tipo de comprobaciones de dicha ndole.

Por su naturaleza, sin embargo, sta se encuentra repartida entre la fase
de anlisis semntico y la generacin de cdigo intermedio.



1.3 Tipos de
comprobaciones
semnticas

Comprobaciones estticas
Las comprobaciones estticas recogen el compendio de todas aquellas tareas de
carcter semntico que, por su naturaleza, pueden ser realizadas directamente
durante la fase de compilacin mediante el uso de los artefactos y mecanismos
propios de dicha fase. Este tipo de comprobaciones son beneficiosas puesto que
confieren seguridad a la ejecucin del programa.

Comprobaciones dinmicas
Las comprobaciones dinmicas son aquellas que no se realizan durante la fase de
compilacin y se delegan al momento de la ejecucin del programa. Ello requiere
generar cdigo ejecutable especficamente diseado para realizar tales
comprobaciones.
Los lenguajes con una carga excesiva de comprobaciones dinmicas generan
programas ms largos, lentos e inseguros en ejecucin.


Tipos de comprobaciones
semnticas estticas
Gestin de declaraciones
Se encarga de registrar todas las declaraciones realizadas por el programador a lo
largo de los distintos mbitos. Esta tarea implica el registro de tipos y la
comprobacin de que no se produce ninguna colisin de nombres con los
identificadores de otras declaraciones.


Verificacin de tipos
Comprueba la compatibilidad de tipos de todas las expresiones del cdigo fuente
recuperando la informacin durante la gestin de declaraciones. Adems se asegura
de que no existe en el programa ninguna referencia a ningn smbolo no declarado.
Inferencia de tipos en lenguajes sin tipificacin de variables o con sobrecarga se
aplican tareas de inferencia de tipos en el nivel gramatical de las expresiones para
resolver el tipo de datos de la expresin resultante en funcin del contexto de
evaluacin.


1.4 Pilas semnticas en un
analizador sintctico
Fundamentacin: Un parser ascendente utiliza durante el anlisis una pila.
En esta, va guardando datos que le permiten ir haciendo las operaciones de
reduccin que necesita.

Para incorporar acciones semnticas como lo es construir el rbol sintctico, es
necesario incorporar a la pila del parser otra columna que guarde los atributos de los
smbolos que se van analizando.

Estos atributos estaran ligados a la correspondiente produccin en la tabla de
parsing.

NOTA: La pila juega un papel fundamental en el desarrollo de cualquier analizador
semntico. Dentro de cada elemento de la pila se guardan los valores que pueden
tener una expresin
1.5 Esquema de traduccin
Un esquema de traduccin es una gramtica independiente del
contexto en la cual se han insertado fragmentos de cdigo en las partes
derechas de sus reglas de produccin. Los fragmentos de cdigo as
insertados se denominan acciones semnticas. Dichos fragmentos
actan, calculan y modifican los atributos asociados con los nodos del
rbol sintctico.
El orden en que se evalan los fragmentos es el de un recorrido
primero-profundo del rbol de anlisis sintctico.
Obsrvese que, en general, para poder aplicar un esquema de
traduccin hay que construir el rbol sintctico y despus aplicar las
acciones empotradas en las reglas en el orden de recorrido primero-
profundo.
1.5 Esquema de traduccin
Por supuesto, si la gramtica es ambigua una frase podra tener dos
rboles y la ejecucin de las acciones para ellos podra dar lugar a
diferentes resultados. Si se quiere evitar la multiplicidad de resultados
(interpretaciones semnticas) es necesario precisar de qu rbol
sintctico concreto se est hablando.

Por ejemplo, si en la regla insertamos un fragmento de cdigo:

La accin se ejecutar despus de todas las acciones asociadas con el
recorrido del subrbol de y antes que todas las acciones asociadas con
el recorrido del subrbol .


1.6 Generacin de la tabla
de smbolos y de
direcciones

Las tablas de smbolos (tambin llamadas tablas de identificadores y
tablas de nombres), realizan dos importantes funciones en el proceso
de traduccin: verificar que la semntica sea correcta y ayudar en la
generacin apropiada de cdigo. Ambas funciones se realizan
insertando o recuperando desde la tabla de smbolos los atributos de
las variables usadas en el programa fuente.

Estos atributos, tales como: el nombre, tipo, direccin de
almacenamiento y dimensin de una variable, usualmente se
encuentran explcitamente en las declaraciones o ms implcitamente a
travs del contexto en que aparecen los nombres de variables en el
programa.

1.6 Generacin de la tabla
de smbolos y de
direcciones
Una de las estructuras de datos que se encuentran relacionadas con las
fases del proceso de compilacin es la tabla de smbolos, la cual tiene como
propsito registrar informacin que se comparte entre varias etapas y que
permite administrar los recursos asociados a las entidades que manipular
el programa. La tabla de smbolos tiene tpicamente la siguiente estructura:

Una tabla de smbolos puede conceptualizarse como una serie de
renglones, cada uno de los cuales contiene una lista de valores de atributos
que son asociados con una variable en particular. Las clases de los atributos
que aparecen en una tabla de smbolos dependen en algn grado de la
naturaleza del lenguaje de programacin para el cual se escribe el
compilador.

Por ejemplo, un lenguaje puede ser sin tipos, y por lo tanto el atributo tipo
no necesita aparecer en la tabla. Similarmente, la organizacin de la tabla
de smbolos variar dependiendo de las limitaciones de memoria y tiempo
de acceso

1.7 Manejo de errores
semnticos
Es una de las misiones ms importantes de un compilador, aunque, al mismo
tiempo, es lo que ms dificulta su realizacin.
A veces unos errores ocultan otros.
A veces un error provoca una avalancha de muchos errores que se
solucionan con el primero.

Es conveniente un buen manejo de errores, y que el compilador detecte
todos los errores que tiene el programa y no se pare en el primero que
encuentre. Hay, pues, dos criterios a seguir a la hora de manejar errores:
1. Pararse al detectar el primer error.
2. Detectar todos los errores de una pasada.


1.7 Manejo de errores
semnticos
El anlisis semntico es posterior al sintctico y mucho ms difcil de
formalizar que ste.
Se trata de determinar el tipo de los resultados intermedios, comprobar
que los argumentos que tiene un operador pertenecen al conjunto de
los operadores posibles, y si son compatibles entre s, etc. En definitiva,
comprobar que el significado de lo que se va leyendo es vlido.
La salida "terica" de la fase de anlisis semntico sera un rbol
semntico.
Consiste en un rbol sintctico en el que cada una de sus ramas ha
adquirido el significado que debe tener. En el caso de los operadores
polimrficos (un nico smbolo con varios significados), el anlisis
semntico determina cul es el aplicable.

REFERENCIAS

A. Garrido, J. Iesta, F. Moreno y J. Prez. 2002. Diseo de compiladores
Edita Universidad de Alicante.
Pila semntica.

You might also like