1.1 Árboles de expresiones
Árbol de expresiones o árbol semántico. Es una estructura jerárquica en la cual se registran las operaciones que realiza el programa fuente. En cada una de las ramas del el árbol se registra el valor o signicado que este debe tener y el análisis se encarga de terminar cuál de los valores registrado en la ramas es aplicable. a plicable.
Los árboles de expresiones expresiones representan el código de nivel del lenguaje en forma de datos. Los datos se almacenan en una estructura con forma de árbol. ada nodo del árbol de expresión representa una expresión. expresión.
ualquier !oja esta etiquetada solo
con un operando. ualquier nodo interior n esta etiquetado por un operador. operador. "odo ra#z es un operador operado r.
$l introducir la expresión debemos de tomar en cuenta las siguientes caracter#sticas%
La ra#z siempre debe
ser un operador •
Las !ojas siempre deben ser operandos
•
Los nodos deben estar etiquetados por operadores
•
&i un operador tiene mayor prioridad que la ra#z se coloca como !ijo.
•
&i un operador tiene igual o menor prioridad que un nodo se coloca como padre.
•
'n nodo puede contener como !ijo otro subárbol que contiene un peque(a expresión.
Construcción de un árbol de expresión Algoritmo
)ientras carácter diferente de nulo. Leer carácter de la lista
&i es par*ntesis pasar al siguiente carácter.
rear un nodo nuevo que contenga ese carácter.
Operando
&i el árbol está vac#o !acer ra#z a nuevo+ si no recorrer el árbol por la derec!a !asta llegar a un nodo con !ojas+ si la !oja izquierda+ no está etiquetada colocar operando+ si no colocarlo en la !oja derec!a.
Operador
&i la ra#z es un operando+ insertar nuevo en ese nodo+ y convertir el operando en el !ijo izquierdo+ si no si !ay un par*ntesis abierto insertar nuevo en la ,ltima !oja derec!a y colocar operando como !ijo izquierdo. &i el carácter anterior es par*ntesis izquierdo si el siguiente carácter es par*ntesis derec!o si solo !ay un operador en el árbol nuevo se convierte en ra#z+ si no se inserta en el ,ltimo nodo derec!o+ y el nodo se convierte en !ijo izquierdo. &i no se cumple ninguna de las condiciones anteriores si la ra#z es de igual prioridad o menor prioridad convertir la ra#z en el !ijo izq. de nuevo si no la prioridad del nodo ra#z es mayor al de nuevo insertar nuevo como !ijo derec!o y colocar el nodo reemplazado como !ijo izquierdo.
Recorridos en árboles Recorrido en Preorden:
En este tipo de recorrido se realiza cierta acción -quizás simplemente imprimir por pantalla el valor de la clave de ese nodo sobre el nodo actual y posteriormente se trata el !ijo izquierdo y cuando se !aya concluido+ el !ijo derec!o.
Recorrido en Postorden:
En este caso se trata primero el !ijo izquierdo+ despu*s el derec!o y por ,ltimo el nodo actual.
Recorrido en Inorden:
En este caso se trata primero el !ijo izquierdo+ despu*s el nodo actual y por ,ltimo el !ijo derec!o.
Recorridos en amplitud (o por niveles)
En este caso el recorrido se realiza en orden por los distintos niveles del árbol. $s#+ se comenzar#a tratando el nivel /+ que sólo contiene el nodo ra#z+ seguidamente el nivel 0+ el 1 y as# sucesivamente.
En los árboles de expresión+ la sucesión del preorden de etiquetas nos da lo que se conoce como la forma prejo de una expresión.
$nálogamente+ la sucesión postorden de las etiquetas de un árbol expresión nos da lo que se conoce como la representación postjo de una expresión. 2inalmente+ el inorden de una expresión en un árbol de expresión nos da la expresión injo en s# misma+ pero sin par*ntesis.
Árbol AVL Los árboles $3L están siempre equilibrados de tal modo que para todos los nodos+ la altura de la rama izquierda no diere en más de una unidad de la altura de la rama derec!a. 4racias a esta forma de equilibrio o balanceo+ la complejidad de una b,squeda de estos árboles se mantiene siempre en orden de complejidad. Es un árbol binario de b,squeda -$55 que tiene como caracter#stica que siempre esta balanceado.
6peraciones que se le pueden realizar a este árbol%
78nsertar 7 Eliminar 7 5uscar
$l momento de insertar o eliminar+ se comprueba si el árbol esta desequilibrado+ en caso de estarlo se realiza el balanceo.
Rotaciones
Es el ,nico m*todo que se utiliza para balancear un árbol $3L. Este se desglosa en 9 variaciones+ las cuales pueden ser%
:otación simple a la derec!a -:&;
:otación simple a la izquierda-:&8
:otación doble a la derec!a -:;;
:otación doble a la izquierda -:;8
Factor de equilibrio
El algoritmo de este árbol toma en cuenta la altura de los nodos de un árbol para monitorear el peso que tiene un nodo respecto a sus sub7 arboles. $ esto se le denomina 2actor de Equilibrio. :eestructurar el árbol signica rotar los nodos del mismo.
altura subárbol izquierdo
7/ = argado a la izquierda
•
= Equilibrado
•
= argado a la derec!a
Aplicación de rotación dependiendo el caso Rotación simple a la derecha: &e tiene un factor de equilibro de 70 y su
nodo izquierdo no tiene un factor de equilibrio de /. :otación simple a la izquierda% &e tiene un factor de equilibrio de 0 y su nodo derec!o no tiene un factor de equilibrio de 7/. Rotación doble a la izquierda: &e tiene un factor de equilibrio de 0 y su
nodo derec!o tiene un factor de equilibrio de 7/. Rotación doble a la derecha: &e tiene un factor de equilibrio de 70 y su
nodo izquierdo tiene un factor de equilibrio de /.
1.2. Acciones semánticas de un analizador sintáctico ;enición de un analizador sintáctico% es la fase del analizador que se encarga de c!equear el texto de entrada en base a una gramática dada. ? en caso de que el programa de entrada sea válido+ suministra el árbol sintáctico que lo reconoce. En teor#a+ se supone que la salida del analizador sintáctico es alguna representación del árbol sintáctico que reconoce la secuencia de to@en suministrada por el analizador l*xico. En la práctica+ el analizador sintáctico tambi*n !ace% •
$cceder a la tabla de s#mbolos -para !acer parte del trabajo del analizador semántico.
• •
!equeo de tipos -del analizador
semántico. 4enerar código intermedio. 4enerar errores cuando se producen.
En denitiva+ realiza casi todas las operaciones de la compilación. Este m*todo de trabajo da lugar a los m*todos de compilación dirigidos por sintaxis.
;ependiendo del tipo de sentencias+ las acciones semánticas pueden agruparse en% o
o
o
&entencias de ;eclaración% completar la sección de tipos de la Aabla de mbolos. &entencias BejecutablesC% realizar comprobaciones de tipos entre los operandos implicados. 2unciones y procedimientos% comprobar el n,mero+ orden y tipo de los parámetros actuales en cada llamada a una función o
o
o o
o o
procedimiento. 8denticación de variables% comprobar si identicador !a sido declarado antes de utilizarlo. Etiquetas% comprobar si !ay etiquetas repetidas y validación. onstantes% comprobar que no se utilicen en la parte izquierda de una asignación. onversiones y equivalencias de tipo% vericación. &obrecarga de operadores y funciones% detectar y solventar.
Analizador sintáctico
1.7 Maneo de errores semánticos Es una de las misiones más importantes de un compilador+ aunque+ al mismo tiempo+ es lo que más diculta su realización. $ veces unos errores ocultan otros. $ veces un error provoca una avalanc!a de muc!os 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. Day+ pues+ dos criterios a seguir a la !ora de manejar errores%
Comprobación de tipos
$spectos generales
'n lenguaje con comprobación 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 detectarán siempre en tiempo de compilación. omo m#nimo+ ante un error+ un comprobador de tipos debe informar de la naturaleza y posición del error y recuperarse para continuar con la comprobación del resto del programa a analizar.
$lgunas de las operaciones a tener en cuenta en una comprobación de tipos% •
Con!ersión de tipos" $ veces es necesario transformar el tipo de una expresión para utilizar correctamente un operador o para
•
pasar de forma adecuada un parámetro a una función. Coerción" Es una conversión de tipos que realiza de forma impl#cita el propio compilador. &i es el programador el que realiza
•
la conversión se tratará entonces de una conversión expl#cita. #obrecar$a de operadores" La sobrecarga se resuelve determinando el tipo de cada una de las expresiones intervinientes
•
en la sobrecarga. %unciones polimór&cas" &on aquellas que trabajan con argumentos cuyo tipo puede cambiaren distintas llamadas a la función.
speci!cación de un comprobador de tipos b"sico
5ásicamente se deberán realizar dos tareas% a Asi$nación de tipos% en las declaraciones. b '!aluación ( comprobación de tipos% En las expresiones y en las funciones+ as# como en las sentencias. 6tras comprobaciones semánticas y recuperación de errores semánticos
;entro de las comprobaciones estáticas -en el momento de la compilación+ tenemos la detección e información de errores como%
•
#omprobaciones de tipos: operadores aplicados a operandos
incompatibles+ asignación de tipos incompatibles+ llamadas a •
funciones con tipos no adecuados+ etc. #omprobaciones de $u%o de control: las sentencias que !acen que el Fujo de control abandone una construcción debe tener alg,n lugar a donde transmitir el control.
•
estar dentro de una proposición G!ile+ for o sGitc! en . #omprobaciones de unicidad: situaciones en las que solo se puede denir un objeto una vez exactamente.
Re)erencias biblio$rá&cas $!o+ $lfred 3. -0HHI. ompiladores.
)oguel+ 6. -0H/1. $nálisis semántico. Enero 0H+ 0H/J+ de blogspot &itio Geb% !ttp%KKanalisissemantico.blogspot.mxK
-0H/9. 'nidad 8. enero 1H+ 0H/+ de !ttp%KKitpn.mxK &itio Geb% !ttp%KKitpn.mxKrecursosiscKsemestreKleguajesyautomatas0K'nidad M0H8.pdf
5eltrán 8. -0H//. )anejo de errores. 2ebrero+ 0H/+ de blogspot &itio Geb% !ttp%KKcompiladoresasignatura.blogspot.mxK0H//KHNKunidad7vii7 manejo7de7errores.!tml