Está en la página 1de 14

LENGUAJES Y AUTOMATAS ll

PROFESOR ING.JIMÉNEZ VÁZQUEZ MARIO

INVESTIGACION 1

ALUMNO
Gallegos Sotelo Ricardo Alexis 19320956

HORARIO 8:00 – 9:00

CICLO ESCOLAR AGOSTO– ENERO 2024


Tabla de contenido
Definición y descripción ............................................................................................................ 3
Pop....................................................................................................................................... 3
Bottom up .......................................................................................................................... 3
Top-down ........................................................................................................................... 4
Reglas semánticas............................................................................................................ 4
Compatibilidad de tipos ................................................................................................... 5
Características............................................................................................................... 5
Ventajas .......................................................................................................................... 6
Desventajas.................................................................................................................... 7
Ejemplos (Como trabaja la pila semántica con las expresiones)................................... 8
Ejemplo 1 ............................................................................................................................ 8
Ejemplo 2 ........................................................................................................................... 9
Ejemplo 3 ..........................................................................................................................13
Definición y descripción
Las pilas semánticas son estructuras de datos que se utilizan generalmente para
simplificar ciertas operaciones de programación. Estas estructuras pueden
implementarse mediante arrays o listas enlazadas. También podemos definirlas
como una colección de datos a los cuales se les puede acceder mediante un
extremo, que se conoce generalmente como tope.

Las pilas semánticas tienen dos operaciones básicas:

 Push (para introducir un elemento)


 Pop (para extraer un elemento)

Pop
(para extraer un elemento) La pila semántica en un analizador sintáctico juega un
papel fundamental en el desarrollo de cualquier analizador semántico. Dentro de
cada elemento de la pila se guardan los valores que pueden tener una expresión.
Como podemos entender un analizador sintáctico ascendente utiliza durante el
análisis una pila semántica. En esta va guardando datos que le permiten ir
haciéndolas operaciones de reducción que necesita. Para incorporar acciones
semánticas como lo es construir el árbol sintáctico, es necesario incorporar a la pila
del analizador sintáctico ascendente otra columna que guarde los atributos de los
símbolos que se van analizando.

Bottom up
Es un principio de muchos años del estilo de programación utilizado para realizar
una pila semántica. 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
fugitivos.
Top-down
Este método consiste en dividir los problemas en sus problemas 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.

Reglas semánticas
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 valoro
actualizar una variable global.
Compatibilidad de tipos
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 insertarle 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.

Características
Sus características fundamentales es que al extraer se obtiene siempre el último
elemento que acabe de insertarse. Por esta razón también se conoce como
estructuras de datos LIFO, una posible implementación mediante listas enlazadas
seria insertando y extrayendo siempre por el principio de la lista. Una pila semántica
ayuda al compilador a reconocer la estructura de una cadena de componentes
léxicos. Al decir pila semántica no se refiere a que hay varios tipos de pila, hace
referencia que se debe programar única y exclusivamente en un solo lenguaje, es
decir, no podemos mezclar código de C++ con Visual BASIC. Con el uso de las pilas
semánticas es posible 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.
Para incorporar acciones semánticas como lo es construir el árbol sintáctico, es
necesario incorporar a la pila del par otra columna que guarde los atributos delos
símbolos que se van analizando. En general una pila semántica hace posible al
analizador sintáctico: Acceder a la tabla de símbolos (para hacer parte del trabajo
del analizador semántico).

 Chequeo de tipos (del analizador semántico).


 Generar código intermedio.
 Generar errores cuando se producen
 En definitiva, 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.
Ventajas
Al utilizar una pila semántica en un analizador sintáctico podemos obtener los
siguientes beneficios:

 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.
 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
dela gramática.
 Permite agilizar la fase del análisis sintáctico 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.
 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.
 Las rutinas semánticas suelen hacer uso de una pila que contiene la
información semántica asociada a los operadores en forma de registros
semánticos.
 Permiten guardar el estado de las variables o tokens en el momento en que
se hace la llamada, para seguir ocupándolas al regresar del analizador.
 Su implementación suele ser relativamente fácil.
Desventajas
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 para
poder hacer la comparación.
Un grave error que puede ocurrir es tratar de eliminar un elemento de una
pila semántica vacía. Este tipo de error se le conoce como
subdesbordamiento ( underflow) y puede ocasionar que el analizador
sintáctico se detenga repentinamente y con ello se aborte este proceso.
El tamaño de la pila puede ser un problema, en caso de que esta crezca
hasta tal punto de sobrepasar la memoria disponible.
A veces un error provoca una avalancha de muchos errores que se
solucionan con el primero
Ejemplos (Como trabaja la pila semántica con las
expresiones)
.

Ejemplo 1 Sea la gramática simplificada que analiza las instrucciones de


asignación:

Se observará que hemos hecho uso de cuatro símbolos de acción

 #PId : PUSH a la pila semántica el registro asociado al identificador.


 #PCt : PUSH a la pila semántica el registro asociado a la constante.
 #RS : Realizar suma: POP los dos registros superiores de la pila; comprobar
que es posible sumarlos; realizar la suma (mediante una llamada al
generador de código) o generar representación intermedia (si es una
compilación en dos o más pasos); PUSH registro semántico del resultado en
la pila semántica.
 #Ras : Realizar asignación: POP los dos registros superiores de la pila;
comprobar que es posible realizar la asignación; realizarla (mediante una )
llamada al generador de código) o generar representación intermedia (si es
una compilación en dos o más pasos)
En los analizadores sintácticos top-down basados en gramáticas LL (1), la
introducción de los símbolos de acción en las rutinas correspondientes es trivial.
Enlos analizadores bottom-up basados en gramáticas SLR (1) es más delicado,
pues los estados del análisis se mueven simultáneamente sobre varias reglas.
Sólo en el momento de realizar una reducción sabemos exactamente dónde
estamos. Por ello, se suele introducir la restricción de que los símbolos de acción
deben estar situados únicamente al final de una regla. Cuando no se cumple
esto (como en el ejemplo anterior) es trivial conseguirlo, introduciendo símbolos
no terminales adicionales.

Poner un ejemplo del análisis sintáctico-semántico bottom-up de la instrucción A :=B


+ 1.

Otro ejemplo: instrucciones condicionales con las reglas.

Ejemplo 2 Sea la expresión


El árbol sintáctico es:

De la instrucción declarativa, la tabla de símbolos y el


analizador morfológico obtenemos los atributos de los operados.

Propagando los atributos obtenemos:

Si la expresión hubiera sido

El árbol sintáctico sería el mismo, sustituyendo 2 por -2. Sin embargo, la


propagación de atributos sería diferente.
En algún caso podría llegar a
producirse error (p.e. si / representara
sólo la división entera)

Si la expresión hubiera sido

El árbol sintáctico sería el mismo, sustituyendo 2 por d. Sin embargo, la propagación


de atributos sería incompleta:

El analizador semántico podría reducir los tipos inseguros al tipo máximo (real) o
utilizar un tipo interno nuevo (ej. arit={int,real}, una unión).Lo anterior es un ejemplo
de propagación bottom-up.

La propagación top-Down también es posible: lo que se transmite son las


restricciones y los tipos de las hojas sirven de comprobación.

Por ejemplo, si la división sólo puede ser entera, transmitimos hacia abajo la
restricción de que sus operados sólo pueden ser enteros. La implantación de todos
los casos posibles de operación con tipos mixtos podría ser excesivamente cara
.En su lugar, se parte de operaciones relativamente simples (ej. int+int, real+real)
yno se implementan las restantes (ej. int+real, real+int), añadiendo en su lugar
operaciones monádicas de cambio de tipo (ej. int->real).Esta decisión puede
introducir ambigüedades. Por ejemplo, sea el programa.

Existen dos conversiones posibles.

El problema es que no tenemos garantía de que los dos procedimientos sean


equivalentes. El segundo puede dar overflow de la pila, la primera pérdida de
precisión. La definición del lenguaje debe especificar estos casos. Las
transformaciones posibles se pueden representar mediante un grafo cuyos nodos
son los tipos de datos y cada arco indica una transformación. Dado un operando
de tipo A que se desea convertir al tipo B, se trata de encontrar una cadena de
arcos que pase de A a B en el grafo anterior. Podría haber varios grafos, cada uno
de los cuales se aplicará en diferentes condiciones, por ejemplo, uno páralas
asignaciones, otro para las expresiones, etc.
Ejemplo 3
Con la producción A!i:=E, se asocia una acción de agregar el valor de E a i.
Referencias

1. Alfred V. Aho, J. D. (2000). Compiladores Principios, técnicas y


herramientas. México: Addison Wesley.
2. Alfred V. Aho, M. S. (2008). Compiladores: principios, técnicas y
herramientas. México: Pearson Adisson Wesley.
3. N., E. W. (2006).Compiler Construction. New York: Addison Wesley.
4. Terry, P. (1997).Compilers and Compiler Generators: an introduction
withC++. Boston: International Thomson Computer Press

También podría gustarte