Pila Semántica en un Analizador Sintáctico
Se compone de un
conjunto de rutinas independientes, llamadas por los analizadores morfológico y
sintáctico. El análisis semántico utiliza como entrada el árbol sintáctico
detectado por el análisis sintáctico para comprobar restricciones de tipo y
otras limitaciones semánticas y preparar la generación de código.
Análisis Semántico: Detecta la validez semántica de
las sentencias aceptadas por el analizador sintáctico. El analizador semántico
suele trabajar simultáneamente al analizador sintáctico y en estrecha
cooperación. Se entiende por semántica como el conjunto de reglas que
especifican el significado de cualquier sentencia sintácticamente correcta y
escrita en un determinado lenguaje.
En definitiva, comprobará que el significado de lo
que se va leyendo es válido. La salida “teórica” de la fase de análisis
semántico sería un árbol semántico. Consiste en un árbol sintáctico en el que
cada una de sus ramas ha adquirido el significado que debe tener.
Las rutinas semánticas suelen hacer uso de una pila
(la pila semántica) que contiene la información semántica asociada a los
operandos (y a veces a los operadores) en forma de registros semánticos.
Pila: Una
colección de datos a los cuales se les puede acceder mediante un extremo, que
se conoce generalmente como tope.
1. Colas simples:
Se inserta por un sitio y se saca por otro, en el
caso de la cola simple se inserta por el final y se saca por el principio. Para
gestionar este tipo de cola hay que recordar siempre cual es el siguiente
elemento que se va a leer y cuál es el último elemento que se ha introducido.
Las Pilas tienen dos operaciones básicas:
- ü Push (para insertar un elemento)
- ü Pop (para extraer un elemento).
En general, El analizador sintáctico: Inicializa el
compilador y para cada símbolo de entrada llama al analizador morfológico y
proporciona el siguiente símbolo de entrada.
Gracias a las pilas es posible el uso de la
recursividad. La variable que llama al mismo procedimiento en el que está,
habrá que guardarla así como el resto de variables de la nueva llamada, para a
la vuelta de la recursividad ir sacándolas, esto es posible a la implementación
de pilas.
Analizadores
descendentes:
Parten del axioma
inicial de la gramática, se va descendiendo utilizando las derivaciones
izquierdas, hasta llegar a construir la cadena analizada.
Operaciones con pilas
Las rutinas
semánticas deben realizar la evaluación de los atributos de las gramáticas
siguiendo las reglas semánticas asociadas a cada producción de la gramática.
El análisis
sintáctico es la fase en la que 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.
Al decir, Pila Semántica no se refiere a que hay
varios tipos de Pila; hace referencia a que se debe programar única y
exclusivamente en un solo lenguaje, es decir, no podemos mezclar código de C++
con Visual Basic; ya que se trabaja con los mismos comandos.
Ventajas:
Las pilas se
utilizan en muchas aplicaciones que utilizamos con frecuencia. Por ejemplo, la
gestión de ventanas en Windows (cuando cerramos una ventana siempre recuperamos
la que teníamos detrás).
Las Colas también
son llamadas FIFO (First In First Out), que quiere decir “el primero que entra
es el primero que sale”.
Las pilas y colas son estructuras de datos que se
utilizan generalmente para simplificar ciertas operaciones de programación.
Estas estructuras pueden implementarse mediante arrays o listas enlazadas.
Analiza el
símbolo, la pila y el estado del autómata, el Analizador Sintáctico produce las
estructuras necesarias para la siguiente etapa y en el caso de compilación
dirigida por la sintaxis invoca llamadas directas al analizador semántico y al
generador de código. Escribe mensajes de errores y trata de limitar el efecto
de estos errores.
Bottom up. Es un principio de muchos años del
estilo de programación que los elementos funcionales de un programa no deben
ser demasiado grandes. Si un cierto componente de un programa crece más allá de
la etapa donde está fácilmente comprensible, se convierte en una masa de la
complejidad que encubre errores tan fácilmente como una ciudad grande encubre a
fugitivos.
Las pilas y colas son estructuras de datos que se
utilizan generalmente para simplificar ciertas operaciones de programación.
Estas estructuras pueden implementarse mediante arrays o listas enlazadas.
Analizador
Sintáctico: es un Autómata de pila que reconoce la estructura de una cadena de
componentes léxicos.
Definiciones: Pilas y Colas
Técnica top-down.
Este método consiste en dividir los problemas en subproblemas más sencillos
para conseguir una solución más rápida. El diseño descendente es un método para
resolver el problema que posteriormente se traducirá a un lenguaje comprensible
por la computadora.
• Los problemas de integración entre los
subsistemas son sumamente costosos y muchos de ellos no se solucionan hasta que
la programación alcanza la fecha límite para la integración total del sistema.
• Se necesita una memoria auxiliar que nos permita
guardar los datos intermedios para poder hacer la comparación.
Compatibilidad de
tipos:
2. Colas
circulares:
En las colas
circulares se considera que después del último elemento se accede de nuevo al
primero. De esta forma se reutilizan las posiciones extraídas, el final de la
cola es a su vez el principio, creándose un circuito cerrado.
Su característica
fundamental es que al extraer se obtiene siempre el último elemento que acaba
de insertarse. Por esta razón también se conocen como estructuras de datos LIFO
(del inglés Last In First Out). Una posible implementación mediante listas
enlazadas sería insertando y extrayendo siempre por el principio de la lista.
El objetivo
teórico es construir un árbol de análisis sintáctico, este raramente se
construye como tal, sino que las rutinas semánticas integradas van generando el
árbol de
Sintaxis
abstracta. Se especifica mediante una gramática libre de contexto.
Al utilizar
arreglos para implementar pilas se tiene la limitación de que se debe reservar
el espacio en memoria con anticipación. Una vez dado un máximo de capacidad a
la pila no es posible insertar un número de elementos mayor que el máximo
establecido.
Reglas semánticas:
Si esto ocurre, en otras palabras si la pila está
llena y se intenta insertar un nuevo elemento, se producirá un error conocido
como desbordamiento –overflow.
Una posible solución a este tipo de inconvenientes
consiste en definir pilas de gran tamaño, pero esto resultará ineficiente y
costoso. No siempre es viable saber con exactitud el número de elementos a
tratar, y siempre existe la posibilidad de que ocurra un error de
desbordamiento.
1.4
Pila Semántica en un Analizador Sintáctico
Durante la fase de análisis semántico, el
compilador debe verificar que los tipos y valores asociados a los objetos de un
programa se utilizan de acuerdo con la especificación del lenguaje.
Además debe detectar conversiones implícitas de
tipos para efectuarlas o insertar el código apropiado para efectuarlas así como
almacenar información relativa a los tipos de los objetos y aplicar las reglas
de verificación de tipos.
Son el conjunto de normas y especificaciones que definen
al lenguaje de programación y están dadas por la sintaxis del lenguaje, las
reglas semánticas asignan un significado lógico a ciertas expresiones definidas
en la sintaxis del lenguaje.
La evaluación de las reglas semánticas define los
valores de los atributos en los nodos del árbol de análisis sintáctico para la
cadena de entrada. Una regla semántica también puede tener efectos colaterales,
por ejemplo, imprimir un valor o actualizar una variable global
Ø
Analizadores ascendentes
Se va construyendo el árbol desde sus nodos
terminales. Es decir, se construye desde los símbolos de la cadena hasta llegar
al axioma de la gramática.
3. Colas con prioridad: Las colas con prioridad se
implementan mediante listas o arrays Ordenados. No nos interesa en este caso
que salgan en el orden de entrada sino con una prioridad que le asignemos.
Puede darse el caso que existan varios elementos con la misma prioridad, en
este caso saldrá primero aquel que primero llego (FIFO).
- Insertar un elemento- push
- Eliminar - pop
- Pila_vacía
- Pila_llena
No hay comentarios:
Publicar un comentario