Está en la página 1de 16

Materia: Lenguaje y Autómatas I

Maestro: Gómez Ramírez Juan Carlos

Equipo “”: Núm. Control Núm. Lista


 Liberato Zavala Aurelio 21321078, 22
 Morales Sandoval Carlos Antonio 21321121, 30
 Mojica Cuevas Jahir Iván 21321106, 27
 Mendoza Carrillo Lennin Benjamín 21321100, 26
 Mateo Borja Mario Alejandro 21321095, 24
 Montero Ordeño Erick Alejandro 21321114

Fecha: 26/02/2024
Índice
1. Portada
2. Introducción
3. Desarrollo 1.1 Alfabeto
4. 1.1 Alfabeto
5. 1.2 cadenas
6. 1.2 cadenas
7. 1.3 Lenguajes, tipos y herramientas
8. 1.3 Lenguajes, tipos y herramientas
9. 1.4 Estructura de un traductor
10. 1.4 Estructura de un traductor
11. 1.4 Estructura de un traductor
12. 1.5Fases de un compilador
13. 1.5Fases de un compilador
14. Conclusión
15. Bibliografía
Introducción
La Teoría de Lenguajes Formales es un campo fascinante que se sumerge en la
estructura y la semántica de los lenguajes utilizados en la computación y la
comunicación. A medida que avanzamos en la era digital, donde la interacción
entre humanos y máquinas es omnipresente, la comprensión de los lenguajes
formales se vuelve cada vez más esencial.
En el corazón de esta disciplina se encuentran las gramáticas formales, que sirven
como reglas precisas para la construcción de frases y expresiones en un lenguaje
determinado. Estas gramáticas no solo se aplican a los idiomas que hablamos,
sino también a los lenguajes de programación que utilizamos para instruir a las
computadoras. La Teoría de Lenguajes Formales nos brinda las herramientas
necesarias para analizar y comprender la estructura de estos lenguajes,
permitiéndonos desarrollar software más robusto, eficiente y preciso.
Exploraremos cómo los autómatas, máquinas abstractas con estados y
transiciones, pueden utilizarse para reconocer patrones y cadenas de símbolos en
un lenguaje. Estudiaremos la jerarquía de los lenguajes formales, que se clasifican
en tipos según su complejidad y capacidad expresiva. Este conocimiento no solo
tiene aplicaciones prácticas en la programación y la ingeniería de software, sino
que también proporciona una base teórica sólida para abordar una variedad de
problemas en la intersección entre la teoría de la computación y la lingüística.
Desarrollo
1.1 Alfabeto
En el contexto de la Teoría de Lenguajes Formales, uno de los conceptos
fundamentales es el "alfabeto". Un alfabeto se define como un conjunto finito de
símbolos, y estos símbolos son los elementos básicos con los que se construyen
las cadenas o palabras de un lenguaje formal.
De manera más formal, un alfabeto se representa como Σ (sigma) y puede incluir
cualquier cosa, desde letras y números hasta símbolos especiales. Este conjunto
de símbolos constituye la base sobre la cual se forman las expresiones dentro del
lenguaje.
Por ejemplo, consideremos un alfabeto Σ que contiene las letras {a, b, c}. Con este
alfabeto, podemos formar cadenas como "abc", "ba", "ccc", y así sucesivamente.
Estas cadenas son las construcciones básicas que se utilizan para expresar
información en un lenguaje formal.
La comprensión del alfabeto es crucial porque sienta las bases para definir el
conjunto de reglas y estructuras que rigen la formación de las cadenas en un
lenguaje. A medida que profundizamos en la Teoría de Lenguajes Formales, el
alfabeto se convierte en el punto de partida para definir gramáticas formales y para
comprender cómo las máquinas abstractas, como los autómatas, procesan y
reconocen las cadenas construidas a partir de este conjunto de símbolos
fundamentales.
Ejemplos:
los alfabetos españoles, inglés, o alemán
Σ1={0,...,9}, 0∈Σ1
Σ2={x | x es un símbolo del código ASCII}
Σ3={(, )}
Σ4={1, A, 2, B}
Σ5={a, b, c, d}
Σ6={}
Σ7=ℵ
Definición (Palabra):
Sea un alfabeto Σ. Una palabra sobre Σ es una secuencia finita de las letras de
ese alfabeto.
La secuencia vacía representa la palabra vacía y la anotamos con λ.
Ejemplos: sobre Σ5 ={a,b,c,d}: λ, a, b, c, d, abc, aab, dcba, ... sobre Σ1 ={0,...,9}: λ,
0, 0000, 010, 9980, ... sobre Σ3 ={(,)} λ, (, ), (), (()()), )())), ...
Definición (Longitud de una palabra):
Se llama longitud de una palabra x, y se representa por |x|, al número de símbolos
que la componen.
Ejemplos: sobre Σ5 ={a,b,c,d}: |λ|=0, |a|=1, |abc|=3
Definición (Concatenación):
Sean dos palabras x e y definidas sobre el alfabeto Σ. La concatenación de x e y,
denominada “xy”, es una palabra que contiene todos los símbolos (de derecha a
izquierda) de x seguidos de los símbolos de y (de derecha a izquierda).
Sean x=A1A2...An e y=B1B2...Bm con Ai, Bi ∈ Σ: ⇒ xy= A1A2...AnB1B2...Bm
Ejemplos: x =abc, y =da, definidos sobre Σ={a,b,c,d} xy=abcda ; |xy|=|x|+|y|=5
Definición (Potencia):
Sea i un número natural, y x una palabra. La potencia i-ésima de x, denominada xi,
es la operación que consiste en concatenarla consigo misma i veces.
Ejemplos: x =abc ⇒ x1=abc x2=abcabc x3=abcabcabc
Definición (Palabra inversa):
Sea x=A1A2...An con Ai∈Σ una palabra sobre el alfabeto Σ. Se llama palabra
refleja o inversa de x, y se representa por x-1, a la palabra AnAn-1...A1. Si x=λ
entonces x-1=λ.
Ejemplos: x =abc ⇒ x-1=cba
Definición (Lenguaje universal):
Sea Σ un alfabeto. El lenguaje universal de Σ es el conjunto formado por todas las
palabras que se pueden formar con las letras de Σ. Representamos dicho lenguaje
con W(Σ).
Ejemplos:
Σ1 ={a} ⇒ W(Σ1)={λ, a, aa, aaa, ...}
Hay lenguajes finitos, infinitos y vacíos.
1.2 Cadenas
Las "cadenas" son elementos fundamentales en la Teoría de Lenguajes Formales,
donde se utilizan para representar información de manera estructurada. Estas
cadenas están compuestas por símbolos tomados de un alfabeto específico y son
cruciales para comprender la estructura y la sintaxis de los lenguajes formales.
Aplicaciones en Teoría de Lenguajes Formales:
Gramáticas Formales:
Las reglas que definen la estructura de las cadenas en un lenguaje formal se
expresan a través de gramáticas formales.
Autómatas:
Las cadenas son la entrada procesada por autómatas, que son máquinas
abstractas utilizadas para reconocer o generar lenguajes formales.
Compiladores:
En el diseño de compiladores, las cadenas son utilizadas para representar el
código fuente que debe ser analizado y transformado en código ejecutable.
Criptografía:
En criptografía, se manipulan y analizan cadenas para diseñar algoritmos seguros
de cifrado y descifrado.
Longitud de cadena.
La longitud de cadena es el número de símbolos que contiene. La notación
empleada es la que es la que se indica en el ejemplo:
Utilizamos las cadenas de los ejemplos:
I abcb I = 4,
I a + 2*b I = 5
I 000111 I = 6
I if a > b then a = b; I = 9
Cadena Vacía.
Una cadena vacía es la única cadena de caracteres de tamaño cero. Y la
podemos denotar usualmente con letras λ o Є (griegas).
Concatenación de cadenas.
La concatenación de dos cadenas u y v, escrita uv, es "pegar" las dos cadenas
para formar una nueva.
Ejemplo:
Sea u = ab
v = ca
w = bb.
Entonces
uv = abca
uw = cabb
(uv) w = abcabb
u(vw) = abcabb
El resultado de la concatenación de u, v y w es independiente del orden en que las
operaciones son ejecutadas. Matemáticamente esta propiedad es conocida como
asociatividad.
Universo del discurso.
Es un conjunto de todas las cadenas donde podemos formar con símbolos del
alfabeto V le denominamos universo del discurso de V y la representamos de la
siguiente manera W (V). Es evidente que W(V) es un conjunto infinito y que la
cadena vacía pertenece a W(V).
Ejemplo:
Un afabeto con una sola letra V = {a}, podemos decir que el universo del discurso
es: W(V) = {λ, a, aa, aaa, aaaa,} y asi contiene unas cadenas infinitas.
1.3 Lenguajes, tipos y herramientas
Un lenguaje es un conjunto de cadenas, todas ellas seleccionadas de un
subconjunto finito donde el conjunto es un determinado alfabeto. Es una forma de
representar información basada en un conjunto finito de signos o símbolos.
TIPOS DE LENGUAJES
Lenguajes de bajo nivel: Son lenguajes totalmente dependientes de la máquina,
es decir que el programa que se realiza con este tipo de lenguajes no se puede
migrar o utilizar en otras máquinas. Al estar prácticamente diseñados a medida del
hardware, aprovechan al máximo las características del mismo. Dentro de este
grupo se encuentran:
· El lenguaje maquina: este lenguaje ordena a la máquina las operaciones
fundamentales para su funcionamiento.
Su desventaja es que son bastantes difíciles de manejar y usar, además de tener
códigos fuente enormes donde encontrar un fallo es casi imposible.
· El lenguaje ensamblador: es un derivado del lenguaje máquina y está formado
por abreviaturas de letras y números llamadas mnemotécnicos.
Las desventajas de este lenguaje siguen siendo prácticamente las mismas que las
del lenguaje ensamblador, añadiendo la dificultad de tener que aprender un nuevo
lenguaje difícil de probar y mantener.
Lenguajes de alto nivel Son aquellos que se encuentran más cercanos al lenguaje
natural que al lenguaje máquina. Están dirigidos a solucionar problemas mediante
el uso de EDD's (Estructuras Dinámicas de Datos).
Son estructuras que pueden cambiar de tamaño durante la ejecución del
programa. Nos permiten crear estructuras de datos que se adapten a las
necesidades reales de un programa. Se tratan de lenguajes independientes de la
arquitectura del ordenador.
Lenguajes de Medio nivel Estos lenguajes se encuentran en un punto medio entre
los dos anteriores. Dentro de estos lenguajes podría situarse C ya que puede
acceder a los registros del sistema, trabajar con direcciones de memoria, todas
ellas características de lenguajes de bajo nivel y a la vez realizar operaciones de
alto nivel.
HERRAMIENTAS;
Editores de estructuras Un editor de estructuras toma como entrada una
secuencia de órdenes para construir un programa fuente. El editor de estructuras
no solo realiza las fuentes de creación y modificación de textos de un editor de
textos ordinarios, sino que también analiza el texto del programa, imponiendo al
programa fuente una estructura jerárquica apropiada. Ejemplos:
Editores de C, Pascal, Visual Studio (Fox Pro, Basic, etc.).
mpresoras estéticas Una impresora estética analiza un programa y lo imprime de
forma que la estructura del programa resulte claramente visible. Por ejemplo, los
comentarios pueden aparecer con un tipo de letra especial, y las proposiciones
pueden aparecer con una identificación proporcional a la profundidad de su
anidamiento en la organización jerárquica de las proposiciones. EJEMPLOS:
Word, Excel, Power Point, Photoshop, etc.
· Verificadores estáticos: Un verificador estático lee un programa, lo analiza e
intenta descubrir errores potenciales sin ejecutar el programa. Ejemplos: Editores
de C y Pascal. Verificadores estáticos de sintaxis (como lint) permiten detectar
muchos errores antes de la compilación. (Algo parecido a lo que se obtiene con la
opción -fsyntax- only del compilador de GNU).

· Intérpretes: Un intérprete realiza las operaciones que implica el programa fuente.


Para una proposición de asignación, por ejemplo, un intérprete podría construir un
árbol y después efectuar las operaciones de los nodos con forme “recorre” el
árbol. Ejemplos: Los intérpretes (para lenguajes como Lisp o Basic, o para
programas con sus propios lenguajes interpretados como Derive o Mathematica)
Shells de sistemas operativos o de alguna aplicación como un SMBD.
1.4 Estructura de un traductor
Un traductor es un programa que tiene como entrada un texto escrito en un
lenguaje (lenguaje fuente) y como salida produce un texto escrito en un lenguaje
(lenguaje objeto) que preserva el significado de origen. Ejemplos de traductores
son los ensambladores y los compiladores.

En el proceso de traducción se identifican dos fases principales:

Fase de análisis

Fase de síntesis
Ensamblador.
El programa ensamblador es el programa que realiza la traducción de un
programa escrito en ensamblador a lenguaje máquina. Esta traducción es directa
e inmediata, ya que las instrucciones en ensamblador no son más que
nemotécnicos de las instrucciones máquina que ejecuta directamente la CPU.
Tipos de ensambladores
Podemos distinguir entre tres tipos de ensambladores:
· Ensambladores básicos. Son de muy bajo nivel, y su tarea consiste
básicamente en ofrecer nombres simbólicos a las distintas instrucciones.
· Ensambladores modulares, o macro ensambladores. Descendientes de los
ensambladores básicos. Hacen todo lo que puede hacer un ensamblador, y
además proporcionan una serie de directivas para definir e invocar
macroinstrucciones.
· Ensambladores modulares 32-bits o de alto nivel. Son ensambladores que
aparecieron como respuesta a una nueva arquitectura de procesadores de 32 bits,
realizan la misma tarea que los anteriores, permitiendo también el uso de macros,
permiten utilizar estructuras de programación más complejas propias de los
lenguajes de alto nivel.
Compilador

Un compilador es un programa informático que traduce un programa escrito en un


lenguaje de programación a otro lenguaje de programación, es decir programa que
permite traducir el código fuente de un programa en lenguaje de alto nivel, a otro
lenguaje de nivel inferior (lenguaje máquina). Generando un programa equivalente
a capaz de interpretar.
Componentes en que se divide un compilador:
Análisis Léxico. En esta fase se lee los caracteres del programa fuente y se
agrupan en cadenas que representan los componentes léxicos. A la secuencia de
caracteres que representa un componente léxico se le llama lexema (o con su
nombre en inglés token).
Análisis Sintáctico. Los componentes léxicos se agrupan en frases gramaticales
que el compilador utiliza para sintetizar la salida.
Análisis Semántico. Intenta detectar instrucciones que tengan la estructura
sintáctica correcta, pero que no tengan significado para la operación implicada.
Generación de código Intermedio. Se puede considerar esta operación intermedia
como un subprograma para una máquina abstracta, a esta representación debe
tener dos propiedades importantes: debe ser fácil de producir y fácil de traducir al
programa objeto.
Optimización de Código. Se trata de mejorar el código intermedio, de modo que
resulte un código de máquina más rápido de ejecutar.
1.5 Fases de un compilador
Los compiladores son programas de computadora que traducen de un lenguaje a
otro. Un compilador toma como su entrada un programa escrito en lenguaje fuente
y produce un programa equivalente escrito en lenguaje objeto.
Un compilador se compone internamente de varias etapas, o fases, que realizan
operaciones lógicas. Es útil pensar en estas fases como piezas separadas dentro
del compilador, y pueden en realidad escribirse como operaciones codificadas
separadamente, aunque en la práctica a menudo se integran.
--Análisis Léxico
– Análisis Sintáctico
– Análisis Semántico
– Generación y Optimización de código intermedio
– Generación de código objeto
-tabla de símbolos
-gestor de errores
• Analizador léxico: lee la secuencia de caracteres de izquierda a derecha del
programa fuente y agrupa las secuencias de caracteres en unidades con
significado propio.
• Las palabras clave, identificadores, operadores, constantes numéricas, signos de
puntuación como separadores de sentencias, llaves, paréntesis, etc. , son diversas
clasificaciones de componentes léxicos.
• Análisis sintáctico: determina si la secuencia de componentes léxicos sigue la
sintaxis del lenguaje y obtiene la estructura jerárquica del programa en forma de
árbol, donde los nodos son las construcciones de alto nivel del lenguaje.
•Análisis semántico: realiza las comprobaciones necesarias sobre el árbol
sintáctico para determinar el correcto significado del programa.
• Generación y optimización de código intermedio: la optimización consiste en la
calibración del árbol sintáctico donde ya no aparecen construcciones de alto nivel.
Generando un código mejorado, ya no estructurado, más fácil de traducir
directamente a código ensamblador o máquina, compuesto de un código de tres
direcciones (cada instrucción tiene un operador, y la dirección de dos operándoos
y un lugar donde guardar el resultado), también conocida como código intermedio.
• Generación de código objeto: toma como entrada la representación intermedia y
genera el código objeto. La optimización depende de la máquina, es necesario
conocer el conjunto de instrucciones, la representación de los datos (número de
bytes), modos de direccionamiento, número y propósito de registros, jerarquía de
memoria, encauzamientos, etc.
• Tabla de Símbolos: es una estructura tipo diccionario con operaciones de
inserción, borrado y búsqueda, que almacena información sobre los símbolos que
van apareciendo a lo largo del programa como son: – los identificadores (variables
y funciones) – Etiquetas – tipos definidos por el usuario (arreglos, registros, etc.)
• Gestor de errores: detecta e informa de errores que se produzcan durante la fase
de análisis. Debe generar mensajes significativos y reanudar la traducción.
Conclusión
La Teoría de Lenguajes Formales es un campo clave en informática que se enfoca
en el estudio de cómo las cadenas, construidas a partir de un alfabeto específico,
pueden ser analizadas y procesadas. Comenzando con el concepto de alfabeto,
que es el conjunto fundamental de símbolos, avanzamos a la construcción de
cadenas, las cuales son secuencias finitas de símbolos que sirven como unidades
básicas en la representación de información estructurada.
Los lenguajes, que son conjuntos de cadenas definidos por reglas gramaticales,
se clasifican en diferentes tipos según su complejidad. En este contexto, las
herramientas como las gramáticas formales y los autómatas son fundamentales
para entender y trabajar con lenguajes formales. Estas herramientas encuentran
aplicación en la construcción de compiladores y traductores, que son esenciales
en el desarrollo de software.
La estructura de un traductor, por ejemplo, un compilador, abarca múltiples fases,
desde el análisis léxico y sintáctico hasta la generación de código objeto y la
optimización. Cada fase tiene su función específica en el proceso de traducción y
garantiza que el código fuente escrito en un lenguaje de programación sea
convertido de manera precisa y eficiente a un formato ejecutable.
Las fases de un compilador representan un conjunto ordenado de pasos que
transforman el código fuente en un programa ejecutable. Esto incluye el análisis
del código, la optimización para mejorar la eficiencia y la generación del código
objeto específico de la máquina objetivo. Cada fase contribuye al éxito del proceso
de compilación, permitiendo la creación de software funcional y eficiente.
En conjunto, estos conceptos y herramientas forman la base teórica y práctica
para el desarrollo de software y la comprensión profunda de cómo los lenguajes
de programación son analizados, interpretados y traducidos. Este conocimiento es
esencial para los programadores, ingenieros de software y aquellos que buscan
comprender los fundamentos de la informática teórica.
Bibliografía
 Autómatas, L. Y. (s. f.). Lenguajes y autómatas I.

https://lenguajesyautomatas1998.blogspot.com/2019/01/1.html

 Teoría de autómatas, lenguajes y computación (2.a ed., Vol. 3). (2007).

PEARSON EDUCACIÓN S.A.

http://xamanek.izt.uam.mx/map/cursos/Automatas-HMU08.pdf

 Unknown. (s. f.). Lenguajes y Autómatas i.

https://lenguajesyautomatasitsh.blogspot.com/

 Unknown. (2015, 11 febrero). 1.1 Alfabeto.

https://lenguajesyautomatasitsh.blogspot.com/2015/02/11-alfabeto.html

 Studocu. (s. f.). 1.2 Cadenas - Infografica - Cadenas Cadena vacía

Universo del Discurso Concatenación de Cadenas - Studocu.

https://www.studocu.com/es-mx/document/instituto-tecnologico-de-milpa-

alta/operaciones-unitarias-1/12-cadenas-infografica/13762938

También podría gustarte