Documentos de Académico
Documentos de Profesional
Documentos de Cultura
LYAUTÓMATAS II
ACTIVIDAD:
INTRODUCCIÓN ................................................................................................................3
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.
5|P ágina
3. Por último, nuestro tercer ejemplo, en el cual también podemos observar el
error semántico.
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
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.
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
11 | P á g i n a
5.-AGREGAR ACCIONES SEMÁNTICAS A LA
ESTRUCTURA DE LA GRAMÁTICA.
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.
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.
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
15 | P á g i n a
7.-INTEGRAR EQUIPOS DE TRABAJO PARA LA
CONSTRUCCIÓN DE UN ANALIZADOR SEMÁNTICO.
16 | P á g i n a
Hicimos llamadas en las cuales fuimos haciendo el analizador, para así recibir
sugerencias y tener ayuda mutua.
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
decisiones en los requisitos hasta adquirir experiencia con el sistema. Este modelo
18 | P á g i n a
denominado núcleo.
Cada incremento es solo una fracción del producto final del programa e implica una
19 | P á g i n a
Ventajas: :
⦁ Es un modelo flexible.
⦁ 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,
20 | P á g i n a
Es básicamente un enfoque metodológico que adapta las etapas del ciclo de vida
*Análisis de requerimientos
*Codificación
*Pruebas
*Implantación
*Mantenimiento
de información para una empresa, en donde deben estar involucradas todas las
pueden ir adelantando de forma paralela las etapas del ciclo de vida como análisis,
subproyecto.
*Variantes.
*Desventajas.
En la vida real, un proyecto rara vez sigue una secuencia lineal, esto crea una mala
creación del software tarda mucho tiempo ya que se debe de pasar por el proceso
21 | P á g i n a
Ventajas.
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.
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