Está en la página 1de 24

TECNOLÓGICO NACIONAL DE MÉXICO

INSTITUTO TECNOLÓGICO DE ACAPULCO

CARRERA: ING. EN SISTEMAS COMPUTACIONALES.

LYAUTÓMATAS II

MAESTRO: SILVESTRE BEDOLLA SOLANO.

ACTIVIDAD:

T1. REPORTE DE PRÁCTICAS/ACTIVIDADES DE APRENDIZAJE


DEL TEMA 1.

1. Oswaldo Salmerón Hernández 19321087


2. Neftali Vladimir Baños Olea 19320896
3. José Ángel Quiñonez Ortega 19321064
4. Yoselin Paredes Astudillo 19321052
5. Yosselin Rodríguez Alonso 19321074

HORARIO: 1:00 P.M- 2:00 P.M.

AULA: R710 GRUPO: IS1

CICLO ESCOLAR AGOSTO-DICIEMBRE 2022

ACAPULCO, GRO. 8 DE SEPTIEMBRE 2022


INDICE

INTRODUCCIÓN ................................................................................................................3

1.-DETECTAR ERRORES SEMÁNTICOS .........................................................................4

2.-DISEÑAR Y SELECCIONAR INFORMACIÓN SOBRE LA CONSTRUCCIÓN DE UN


ANALIZADOR SEMÁNTICO ..............................................................................................6

3.-RECONOCER EL MANEJO DE TIPOS EN LAS EXPRESIONES Y EL USO DE


OPERADORES ..................................................................................................................7

4.-ESTABLECER LAS REGLAS PARA LA CONVERSIÓN DE TIPOS (CASTING) EN


EXPRESIONES ..................................................................................................................8

5.-AGREGAR ACCIONES SEMÁNTICAS A LA ESTRUCTURA DE LA GRAMÁTICA. . 12

6.-MANIPULAR LA TABLA DE CONVERSIÓN DE SÍMBOLOS Y DE ERRORES Y


DIRECCIONES ................................................................................................................. 13

7.-INTEGRAR EQUIPOS DE TRABAJO PARA LA CONSTRUCCIÓN DE UN


ANALIZADOR SEMÁNTICO ............................................................................................ 16

CONCLUSIÓN.................................................................................................................. 23

BIBLIOGRAFÍA ................................................................................................................ 24

2|P ágina
INTRODUCCIÓN

La semántica nos sirve para dar un mejor entendimiento de las palabras, que se
pueda comprender e interactuar con los conceptos de las diferentes áreas del saber.
Es importante porque nos sirve para comprender el significado de una palabra que
puede usarse de distinta manera. Explica los distintos tipos de significados que
existen dentro de un lenguaje, otorgando una visión sobre cómo se construye la
habilidad y comprensión de dicho lenguaje.
En la fase de análisis semántico de un procesador de lenguaje se computa la
información adicional necesaria para el procedimiento de un lenguaje, una vez que
la estructura sintáctica de un programa haya sido obtenida. Es por tanto la fase
posterior al análisis sintáctico y la última dentro del proceso de síntesis de un
lenguaje de programación. Como parte del código intermedio, después del análisis
sintáctico viene el análisis semántico en el cual se busca el significado que tiene
cada palabra que se forma en cada oración de nuestro lenguaje.
El analizador semántico utiliza el árbol sintáctico y la información en la tabla de
símbolos para comprobar la consistencia semántica del programa fuente con la
definición del lenguaje. También recopila información sobre el tipo y la guarda, ya
sea en el árbol sintáctico o en la tabla de símbolos, para usarla más tarde durante
la generación de código intermedio.
Mientras que la sintaxis de un lenguaje de programación es el conjunto de reglas
formales que especifican la estructura de los programas pertenecientes a dicho
lenguaje, la semántica del lenguaje de programación es el conjunto de reglas que
especifica el significado de cualquier sentencia sintácticamente válida.

3|P ágina
1.-DETECTAR ERRORES SEMÁNTICOS.

 Análisis semántico
El 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.
Es mucho más difícil introducir métodos formales para la recuperación de errores
semánticos que para la recuperación de errores sintácticos, ya que a menudo la
recuperación de errores semánticos es ad hoc. No obstante, puede requerirse que,
por lo menos, el error semántico sea informado al programador, que se le ignore y
que, por tanto, se suprimirá la generación de código.
Sin embargo, la mayoría de los errores semánticos pueden ser detectados mediante
la revisión de la tabla de símbolos, suponiendo un tipo que se base en el contexto
donde ocurra o un tipo universal que permita al identificador ser un operando de
cualquier operador del lenguaje. Al hacerlo, evitamos la producción de un mensaje
de error cada vez que se use la variable no definida. Si el tipo de un operando no
concuerda con los requisitos de tipo del operador, también es conveniente
reemplazar el operando con una variable ficticia de tipo universal.
En cierto modo, este tipo de error es el más difícil de depurar, ya que ni el compilador
ni el sistema proporcionan información sobre qué está fallando. Lo único cierto es
que el programa no se está comportando como debería. Un error semántico se
produce cuando la sintaxis del código es correcta, pero la semántica o significado
no es el que se pretendía. La construcción obedece las reglas del lenguaje, y por
ello el compilador o intérprete no detectan los errores semánticos. Los compiladores
e intérpretes sólo se ocupan de la estructura del código que se escribe, y no de su
significado.

4|P ágina
EJEMPLOS.
1. En este primer ejemplo podemos observar el error semántico, ya que se
declara a X como entera y se le agrega un valor incorrecto.

2. Podemos observar nuestro segundo error semántico, no reconoce el valor


asignado

5|P ágina
3. Por último, nuestro tercer ejemplo, en el cual también podemos observar el
error semántico.

2.-DISEÑAR Y SELECCIONAR INFORMACIÓN SOBRE LA


CONSTRUCCIÓN DE UN ANALIZADOR SEMÁNTICO.
 Definición de un analizador semántico
Es la fase del analizador que se encarga de chequear el texto de entrada en base
a una gramática dada. Y 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 Token
suministrada por el analizador léxico
En la práctica, el analizador sintáctico también hace:

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

6|P ágina
 Manejo de errores
El manejo de errores de sintaxis es el más complicado desde el punto de vista de la
creación de compiladores. Nos interesa que cuando el compilador encuentre un
error, se recupere y siga buscando errores. Por lo tanto, el manejador de errores de
un analizador sintáctico tiene como objetivos:
 Indicar los errores de forma clara y precisa. Aclarar el tipo de error y su
localización.
 Recuperarse del error, para poder seguir examinando la entrada.
 No ralentizar significativamente la compilación

Nosotros nos centraremos en el análisis sintáctico para lenguajes basados en


gramáticas formales, ya que de otra forma se hace muy difícil la comprensión del
compilador, y se pueden corregir, quizás más fácilmente, errores de muy difícil
localización, como es la ambigüedad en el reconocimiento de ciertas sentencias.
La gramática que acepta el analizador sintáctico es una gramática de contexto libre:
Gramática: G (N, T, P, S)
N = No terminales.
T = Terminales.
P = Reglas de Producción.
S = Axioma Inicial.

3.-RECONOCER EL MANEJO DE TIPOS EN LAS


EXPRESIONES Y EL USO DE OPERADORES.

Es una de las misiones más importantes de un compilador, aunque, al mismo


tiempo, es lo que más dificulta su realización. 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:
 Pararse al detectar el primer error.
 Detectar todos los errores de una pasada.

7|P ágina
El análisis semántico es posterior al sintáctico y mucho más difícil 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 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. En el caso de los operadores polimórficos (un único
símbolo con varios significados), el análisis semántico determina cuál es el
aplicable.

4.-ESTABLECER LAS REGLAS PARA LA CONVERSIÓN


DE TIPOS (CASTING) EN EXPRESIONES.

 Conversión de tipos
Cuando se construyen las expresiones utilizando operandos de distintos tipos, pero
compatibles, las conversiones de tipo se realizan para determinar el tipo de la
expresión resultante. Las reglas de D para las conversiones de tipo son las mismas
que las reglas de conversión aritmética para los números enteros en ANSI-C. Estas
reglas se denominan en ocasiones como conversiones aritméticas habituales.
Una manera sencilla de describir las reglas de conversión es la siguiente: cada tipo
de número entero se clasifica en el orden char, short, int, long, long long, con los
tipos sin signo correspondientes asignados un puesto por encima de su equivalente

8|P ágina
con signo, pero debajo del siguiente tipo de número entero. Cuando construye una
expresión utilizando dos operandos de número entero como x + y y los operandos
son de tipos de números enteros distintos, se utiliza el tipo de operando con el
puesto más alto como el tipo de resultado.
Si se requiere una conversión, el operando de puesto menor es primero
promocionado al tipo superior. Esta promoción no cambia el valor del operando:
simplemente amplía el valor a un contenedor mayor en función de su signo. Si se
promociona un operando sin signo, los bits de orden superior sin utilizar del número
entero resultante se rellenan con ceros. Si un operando con signo se promociona,
los bits de orden superior sin utilizar se rellenan mediante una extensión del signo.
Si un tipo con signo se convierte a un tipo sin signo, primero se amplía el signo del
primero y luego se le asigna el nuevo tipo sin signo determinado por la conversión.
Los números enteros y otros tipos también se pueden convertir de un tipo a otro. En
D, los punteros y números enteros se pueden convertir a cualquier tipo de número
entero o puntero, pero no a otros tipos. Las reglas para convertir y promocionar
cadenas y matrices de caracteres se analizan en el Capítulo 6Cadenas. Una
conversión de número entero o puntero se forma utilizando una:
y = (int)x;
donde el tipo de destino se coloca entre paréntesis y se utiliza como prefijo de la
expresión de origen. Los números enteros se convierten a tipos de puesto superior
realizando una promoción. Los números enteros se convierten a tipos de puesto
inferior utilizando ceros en los bits de orden superior libres del número entero.
Debido a que D no permite la aritmética de coma flotante, no se permite ninguna
conversión o fusión de operando de coma flotante y no se define ninguna regla para
la conversión implícita de la coma flotante.

 Comprobación de tipos

9|P ágina
La labor de comprobación de tipos consiste en conferir a las construcciones
sintácticas del lenguaje la semántica de tipificación y en realizar todo tipo de
comprobaciones de dicha índole. Por su naturaleza, sin embargo, ésta se encuentra
repartida entre la fase de análisis semántico y la generación de código intermedio.
 Comprobaciones estáticas
Las comprobaciones estáticas recogen el compendio de todas aquellas tareas de
carácter semántico que, por su naturaleza, pueden ser realizadas directamente
durante la fase de compilación mediante el uso de los artefactos y mecanismos
propios de dicha fase. Este tipo de comprobaciones son beneficiosas puesto que
confieren seguridad a la ejecución del programa.
 Comprobaciones dinámicas
Las comprobaciones dinámicas son aquellas que no se realizan durante la fase de
compilación y se delegan al momento de la ejecución del programa. Ello requiere
generar código ejecutable específicamente diseñado para realizar tales
comprobaciones. Los lenguajes con una carga excesiva de comprobaciones
dinámicas generan programas más largos, lentos e inseguros en ejecución
 Variación de tipos
Comprueba la compatibilidad de tipos de todas las expresiones del código fuente
recuperando la información durante la gestión de declaraciones. Además, se
asegura de que no existe en el programa ninguna referencia a ningún símbolo no
declarado.
 Inferencia de tipos
En lenguajes sin tipificación 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 expresión resultante en función del contexto de evaluación.
Algunos ejemplos se muestran a continuación:
EJEMPLO:
1. Como nuestro primer ejemplo podemos ver los operadores que se
encuentran aquí.

10 | P á g i n a
2. Ejemplo 2 que muestra los operadores que se le indican al analizador

3. Se puede ver en este tercer ejemplo como en efecto el analizador reconoce


los operadores asignados.

11 | P á g i n a
5.-AGREGAR ACCIONES SEMÁNTICAS A LA
ESTRUCTURA DE LA GRAMÁTICA.

Un esquema de traducción es una gramática independiente de contexto en la que


se asocian atributos con los símbolos gramaticales y se insertan acciones
semánticas encerradas entre llaves { } dentro de los lados derechos de las
producciones. Los esquemas de traducción pueden tener tantos atributos
sintetizados como heredados.

Cuando se diseña un esquema de traducción, se deben respetar algunas


limitaciones para asegurarse de que el valor de un atributo esté disponible cuando
una acción se refiera a él. Estas limitaciones, motivadas por las definiciones con
atributos por la izquierda, garantizan que las acciones no hagan referencia a un
atributo que aún no haya sido calculado. El ejemplo más sencillo ocurre cuando sólo
se necesitan atributos sintetizados, en este caso, se puede construir el esquema de
traducción creando una acción que conste de una asignación para cada regla
semántica y colocando esta acción al final del lado derecho de la producción
asociada.

 Traducción descendente
Se trabaja con esquema de traducción en lugar de hacerlo con definiciones dirigidas
por sintaxis, así que se puede ser explícito en cuanto al orden en que tienen que
lugar las acciones y las evaluaciones de los atributos.

 Eliminación de la recursividad izquierda de un esquema de traducción

12 | P á g i n a
Como la mayoría de los operadores aritméticos son asociativos por la izquierda, es
natural utilizar gramáticas recursivas por la izquierda para las expresiones. La
transformación se aplica a esquemas de traducción con atributos sintetizados. Para
el análisis sintáctico descendente, se supone que una acción se ejecuta en el mismo
momento en que se expandiría un símbolo en la misma posición. Un atributo
heredado de un símbolo debe ser calculado por una acción que aparezca antes que
el símbolo, y un atributo sintetizado del no terminal de la izquierda se debe calcular
después de que hayan sido calculados todos los atributos de los que depende.

6.-MANIPULAR LA TABLA DE CONVERSIÓN DE


SÍMBOLOS Y DE ERRORES Y DIRECCIONES.

Las tablas de símbolos (también llamadas tablas de identificadores y tablas de


nombres), realizan dos importantes funciones en el proceso de traducción: verificar
que la semántica sea correcta y ayudar en la generación apropiada de código.
Ambas funciones se realizan insertando o recuperando desde la tabla de símbolos
los atributos de las variables usadas en el programa fuente. Estos atributos, tales
como: el nombre, tipo, dirección de almacenamiento y dimensión de una variable,
usualmente se encuentran explícitamente en las declaraciones o más
implícitamente a través del contexto en que aparecen los nombres de variables en
el programa.
Una de las estructuras de datos que se encuentran relacionadas con las fases del
proceso de compilación es la tabla de símbolos, la cual tiene como propósito
registrar información que se comparte entre varias etapas y que permite administrar
los recursos asociados a las entidades que manipulará el programa.
La tabla de símbolos tiene típicamente la siguiente estructura:

13 | P á g i n a
Una tabla de símbolos 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
símbolos dependen en algún grado de la naturaleza del lenguaje de programación
para el cual se escribe el compilador.

EJEMPLOS:
1. Aquí podemos observar el valor de tipo casting explicitos

14 | P á g i n a
2. En este segundo ejemplo podemos darnos cuenta que el analizador
reconoce los valores casting

3. En este último ejemplo podemos observar como no es posible realizar casting


entre una variable primitiva booleana y cualquier otra variable primitiva. Pero
sí es posible realizar casting entre una variable primitiva char y una variable
primitiva que almacene enteros:

15 | P á g i n a
7.-INTEGRAR EQUIPOS DE TRABAJO PARA LA
CONSTRUCCIÓN DE UN ANALIZADOR SEMÁNTICO.

Para poder realizar el trabajo primero nos organizamos en el salón de clases y en


nuestros ratos libres investigábamos sobre el tema para comentar la metodología que
sería elegida.

Después de discutir un rato sobre lo que se podría hacer llegamos a un acuerdo y


se llegó a la conclusión de reutilizar el analizador que se realizó en autómatas l.

16 | P á g i n a
Hicimos llamadas en las cuales fuimos haciendo el analizador, para así recibir
sugerencias y tener ayuda mutua.

Para poder terminar el compilador también se hicieron llamadas.

Al final el trabajo quedo de esa forma, todos los integrantes aportaron y fueron
partedel proceso de realización.

17 | P á g i n a
Por último, vamos a analizar un poco de la metodología que elegimos:
Metodología incremental

⦁ Metodología incremental:

El modelo incremental fue propuesto por Harlan Mills en el año 1980. Surgió el

enfoque incremental de desarrollo como una forma de reducir la repetición del

trabajo en el proceso de desarrollo y dar oportunidad de retrasar la toma de

decisiones en los requisitos hasta adquirir experiencia con el sistema. Este modelo

se conoce también bajo las siguientes denominaciones:

⦁ Método de las comparaciones limitadas sucesivas.

⦁ Ciencia de salir del paso.

⦁ Método de atacar el problema por ramas.

El Modelo Incremental combina elementos del Modelo Lineal Secuencial con la

filosofía interactiva de Construcción de Prototipos. Como se muestra en la Figura 1,

el modelo incremental aplica secuencias lineales de forma escalonada mientras

progresa el tiempo en el calendario. Cada secuencia lineal produce un incremento

del software. El primer incremento generalmente es un producto esencial

18 | P á g i n a
denominado núcleo.

Como su nombre lo indica esta metodología consta de ir aumentando las

funcionalidades de un programa a medida que se hace iteraciones o surgen nuevas

necesidades del programa.

Cada incremento es solo una fracción del producto final del programa e implica una

entrega del proyecto cada vez que se hace un incremento.

19 | P á g i n a
Ventajas: :

⦁ Se generan software operativo de manera rápida.

⦁ Es un modelo flexible.

⦁ Reduce costos en el cambio y alcance de requisitos.

⦁ Es fácil de probar por sus iteraciones pequeñas.

⦁ Es fácil de administrar los riesgos.

⦁ Cada iteración es significativa para el resultado final y es fácil de administrar.


Desventajas:

⦁ Se requiere experiencia para definir los incrementos.

⦁ Cada iteración es rígida y no se cruza con alguna otra.

⦁ Todos los problemas a futuro tiene que ser previamente definidos.

⦁ Pueden surgir problemas de que no todos los requisitos hayan sido establecidos.

Se entiende como una variación sobre el ciclo de vida en Cascada del software,

denominada Cascada con Subproyectos, porque permite la ejecución de algunas

de las tareas de la cascada en paralelo.

20 | P á g i n a
Es básicamente un enfoque metodológico que adapta las etapas del ciclo de vida

del software de manera ordenada, siguiendo estos principales pasos:

*Análisis de requerimientos

*Diseño del sistema

*Diseño del programa

*Codificación

*Pruebas

*Implantación
*Mantenimiento

Un ejemplo de aplicación de esta metodología podría ser el desarrollo de un sistema

de información para una empresa, en donde deben estar involucradas todas las

áreas de la misma porque siempre están compartiendo información. Para ello se

pueden ir adelantando de forma paralela las etapas del ciclo de vida como análisis,

diseño, desarrollo y pruebas de forma independiente para cada área de la

organización y hacia el final se realiza la integración de los resultados de cada

subproyecto.

*Variantes.

Existen variantes de este modelo; Específicamente destacamos la que hace uso de

prototipos y en la que se establece un ciclo antes de llegar a la fase de

mantenimiento, verificando que el sistema final esté libre de fallos.

*Desventajas.

En la vida real, un proyecto rara vez sigue una secuencia lineal, esto crea una mala

implementación del modelo, lo cual hace que lo lleve al fracaso. El proceso de

creación del software tarda mucho tiempo ya que se debe de pasar por el proceso

de prueba y hasta que el software no esté completo no se opera. Esto es la base

para que funcione bien.

21 | P á g i n a
Ventajas.

Cualquier error de diseño detectado en la etapa de prueba conduce necesariamente

al rediseño y nueva programación del código afectado, aumentando los costos del

desarrollo.

22 | P á g i n a
CONCLUSIÓN

El análisis semántico pretende ante todo estudiar las relaciones entre las palabras
tratadas en un texto u oración. Para ello se han de definir ciertos patrones, técnicas
y reglas de relaciones que se toman en cuenta, como el manejo y reconocimiento
de las expresiones, el uso de operadores, esquemas de traducciones, árboles
sintácticos y tablas de símbolos.
Es necesario proporcionar dichas técnicas a nuestro lenguaje de programación para
que sea posible captar todo aquello que se requiera expresar con nuestro programa.

Si pretendemos que nuestro programa funcione de manera correcta debemos saber


que este tipo de técnicas para el analizador semántico son técnicas indispensables
para que realice su tarea de forma eficiente y muy correcta.
Al final del análisis semántico es importante hacer las comprobaciones necesarias
y detectar posibles errores, ya que tiene una gran importancia como parte del
compilador y básicamente asegura toda la coherencia de este.
En pocas palabras la importancia de la semántica en un compilador es algo que no
podemos pasar por alto, con los pasos correctos a seguir e implementando de
buena manera las palabras podemos obtener un compilador con un excelente
análisis de la semántica.

23 | P á g i n a
BIBLIOGRAFÍA
 Hopcroft, J. E., Motwani, R.D. (2008). Teoría de autómatas, lenguajes y
computación. Addison Wesley.
 Kelley, D., & Platas, M. L. D. (1995). Teoría de autómatas y lenguajes
formales (Vol. 22). Prentice Hall.
 Viñuela, P. I. (1997). Lenguajes, gramáticas y autómatas. Pearson
Educación.
 Colaboradores de Wikipedia. (2020, 7 septiembre). Lenguaje formal.
Wikipedia, la enciclopedia libre. https://es.wikipedia.org/wiki/Lenguaje_formal
 EcuRed. (s. f.-a). Autómata finito. https://www.ecured.cu/Autómata_finito
 Análisis Léxico, Sintáctico y Semántico. (2021, 23 mayo). [Vídeo]. YouTube.
https://www.youtube.com/watch?v=ejJuV0Q1oyM
 ANALIZADOR SEMÁNTICO. (2020, 29 abril). [Vídeo]. YouTube.
https://www.youtube.com/watch?v=v5x3bIh8RJA

24 | P á g i n a

También podría gustarte