Está en la página 1de 9

INSTITUTO TECNOLÓGICO SUPERIOR DE JEREZ

JEREZ DE GARCÍA SALINAS A 31 DE ENERO DEL 2020

NOMBRES:
ADRIANA DE JESÚS MÁRQUEZ MENDOZA
CRISTOFER CASAS MURILLO
RICARDO BENJAMÍN VIRAMONTES JUÁREZ
GUADALUPE VÁZQUEZ DE LA TORRE

NUMEROS DE CONTROL:
S17070161
S17070157
S17070162
S17070158

CORREO:
marquez98709@gmail.com, cristofer32513@gmail.com,
benja120599@gmail.com, guvadlt@Outlook.com

CARRERA:
INGENIERÍA EN SISTEMAS COMPUTACIONALES

NOMBRE DE LA MATERIA:
LENGUAJES Y AUTÓMATAS I

SEXTO SEMESTRE

TEMA 1: INTRODUCCIÓN A LA TEORÍA DE LENGUAJES


FORMALES

“Alfabetos y Lenguajes”

DOCENTE:
M.C.C. VANESSA SALDIVAR QUEZADA.
INTRODUCCIÓN

En 1946 se desarrolló el primer ordenador digital. Estas máquinas ejecutaban


instrucciones consistentes en códigos numéricos que señalan a los circuitos de la
máquina los estados correspondientes a cada operación. Esta expresión mediante
códigos numéricos se llamó Lenguaje Máquina, interpretado por un secuenciador
cableado o por una microprograma.

Los primeros usuarios de estos ordenadores descubrieron la ventaja de escribir sus


programas mediante claves más fáciles de recordar que esos códigos numéricos,
estas claves constituyen los llamados lenguajes ensambladores, que se
generalizaron en cuanto se dio el paso decisivo de hacer que las propias máquinas
realizaran el proceso mecánico de la traducción. Por ello los primeros ordenadores
personales iban siempre acompañados de un intérprete, lo cual un intérprete no
genera un programa equivalente, sino que toma una sentencia del programa fuente
en un lenguaje de alto nivel y la traduce al código equivalente y al mismo tiempo lo
ejecuta.

El programa compilador traduce las instrucciones en un lenguaje de alto nivel a


instrucciones que la computadora puede interpretar y ejecutar. Para cada lenguaje
de programación se requiere un compilador separado. El compilador traduce todo
el programa antes de ejecutarlo.

DESARROLLO

Tomando en cuenta el código fuente del lenguaje, el compilador pasa por un


proceso de “traducción”, estos pasos son:

• Análisis léxico: Este se encarga de leer el contenido del programa de


izquierda a derecha, agrupándolos en tokens (elementos básicos del
lenguaje, que identifica una entidad lógica dentro del lenguaje), pueden
incluir palabras reservadas, constantes, operadores, signos de puntuación e
identificadores; el token se reconoce por medio de un patrón saltando
espacios en blanco y comentarios, siendo a la vez un lexema el valor real del
token; en este punto pueden verificarse errores léxicos.
➢ Modo pánico: omite los siguientes caracteres de la entrada hasta
encontrar un token, este trata de arreglar el error borrando el carácter,
insertando el carácter perdido, remplazando el carácter incorrecto o
encontrar que cambio genera un número menor de errores sintácticos.
➢ Palabras reservadas: Palabras que significan algo en el lenguaje, la
solución es que las palabras reservadas no deben usarse como
identificadores.
➢ Manejo de Buffers: Al hacerse el buffer de entrada se define un
tamaño de bloque de disco, en este punto se usa un apuntador que
da inicio al lexema a analizar y un apuntador que marca el carácter
que está siendo analizado.
• Análisis sintáctico: Dado del lenguaje de programación se obtienen unas
reglas básicas de escritura sintáctica, en este punto el analizador sintáctico
se encarga de obtener una cadena de componentes pasados previamente
por el analizador léxico, entonces se comprueba si la cadena puede ser
generada por la gramática del lenguaje fuente. Este análisis puede usar
diferentes métodos:
➢ Descendentes: Construyen árboles de análisis sintáctico desde arriba
hasta abajo.
➢ Ascendentes: Construyen arboles de análisis sintáctico desde abajo
hasta arriba.

El manejo de errores desde este punto comúnmente está dado por


expresiones aritméticas con paréntesis desequilibrados o un operador
aplicando a un operando incompatible, así como recursividad excesiva.
Generalmente se basan en los métodos LL y LR para detectan un error lo
antes posible.

• Análisis semántico: Procesa la información adicional que sea útil para


procesar un lenguaje una vez pasando por el análisis sintáctico y que todo
este correcto, siendo la última dentro del proceso de síntesis de un lenguaje,
es en este punto cuando se validan las reglas específicas que se dieron para
obtener el significado de las sentencias; finalmente cuando el análisis
semántico valide la sintaxis deberá verificar que todos los identificadores que
aparecen en la expresión hayan sido declarados en el ámbito actual o previo,
y que la subexpresión de la izquierda también este validada semánticamente.

• Generación de código intermedio: Cuando el proceso llega a este punto del


modelo análisis-síntesis se traduce el programa de código fuente en una
representación de un código intermedio, los diferentes lenguajes intermedios
son:
➢ Arboles de sintaxis
➢ Código de tres direcciones: instrucciones con 3 o menos direcciones,
dos para operandos y una para el resultado, siendo los operandos y
el resultado nombres o variables temporales.

• Optimización: Como bien se dice es la forma de minimizar o maximizar


alguna variable de rendimiento siendo generalmente tiempo, espacio,
procesador, etc. Esta optimización se hace restructurando el código
generando uno nuevo con mayores beneficios.
➢ Local: Se hace sobre módulos del programa a través de funciones,
métodos, procedimientos o clases, estos tipos de optimizaciones solo
se reflejan en dichas secciones.
➢ Bucle: Si las acciones de ciclos están mal realizadas el problema de
optimización simplemente no funcionara, entonces se trata de
encontrar elementos que no deben repetirse en un ciclo.
➢ Globales: Se aplica con respecto del todo el código, es un poco más
lenta que las anteriores, pero mejora significativamente el rendimiento,
se decide si se mantienen variables globales para agilizar procesos.
➢ De mirilla: Trata de estructurar el flujo del programa sobre todo en
ciclos y saltos de rutina, teniendo estos más cerca de las llamadas de
cada uno, haciendo saltos de códigos pequeños.

• Generación de código objeto: En esta etapa el código escrito será traducido


a código maquina relocalizable o ensamblador.

RESULTADOS

El compilador trabaja en base a un abecedario que se utilizará para traducir el


código fuente a binario

A - 10111110

B - 10111101

C - 10111100

D - 10111011

E - 10111010

F - 10111001

G - 10111000

H - 10110111

I - 10110110

J - 10110101

K - 10110100

L - 10110011

M - 10110010

N - 10110001
Ñ - 1111111101011010

O - 10110000

P - 10101111

Q - 10101110

R - 10101101

S - 10101100

T - 10101011

U - 10101010

V - 10101001

W - 10101000

X - 10100111

Y - 10100110

Z – 10100101

a - 10011110

b - 10011101

c - 10011100

d - 10011011

e - 10011010

f - 10011001

g - 10011000

h - 10010111

i - 10010110

j - 10010101
k - 10010100

l - 10010011

m – 10010010

n - 10010001

ñ - 1111111101011011

o - 10010000

p - 10001111

q - 10001110

r - 10001101

s - 10001100

t - 10001011

u - 10001010

v - 10001001

w - 10001000

x - 10000111

y - 10000110

z - 10000101

Básicamente lo que aquí se está haciendo es tomar el complemento a1 de cada


una de las letras del alfabeto, lo mismo seria con los valores numéricos, caracteres
especiales, palabras reservadas y el resto de caracteres que aparecen en el código
ASCII; es solo que debido al tiempo con el que contábamos no nos fue posible
realizar la traducción de todos y cada uno de ellos.
CONCLUSIÓN

Al momento de comenzar con el desarrollo de un compilador, este documento será


de gran utilidad, ya que en él se detallan todas y cada una de las partes que
involucran a este. La función de un compilador es leer un programa escrito en un
lenguaje, y poder comunicarlo directamente al lenguaje máquina. Explicado de una
manera más compleja, es un proceso que va pasando por varias etapas
comprobando su sintaxis, su semántica y su léxico entre otras cosas. Por otro lado,
un compilador, requiere de una sintaxis y lenguajes específicos, ya que, al igual que
el lenguaje humano, si no se escribe correctamente el compilador no hará lo que se
supone que haga.

Para poder desarrollar un compilador se requiere estrictamente seguir todos los


pasos mencionados con anterioridad para lograr que el compilador funcione de
manera adecuada y pueda soportar algún lenguaje de programación.

Referencias
(s.f.). En A. I. : Garrido Alenda, Diseño de compiladores (pág.
https://publicaciones.ua.es/es/detalle.php?idet=769). 2002 (agosto).

(s.f.). Obtenido de Lenguajes grámaticas y automatas.

(s.f). Prof. Gloria Inés Alvarez V. Compiladores: Análisis Léxico, obtenido de:
http://cic.puj.edu.co/wiki/lib/exe/fetch.php?media=materias:comp:comp_sesion5_2008-1.pdf

(s.f) En E.A.P. de Ingeniería de Sistemas e Informática, Análisis sintáctico, obtenido de:


http://biblioteca.uns.edu.pe/saladocentes/archivoz/publicacionez/Analisis_Sintactico.pdf

(marzo 2004) Francisco Ortín Soler, Juan Manuel Cueva Lovelle, otros; Análisis Semántico en
Procesadores de Lenguaje, obtenido de:
http://di002.edv.uniovi.es/~cueva/publicaciones/monografias/38_semantico.pdf

(s.f). Prof. Gloria Inés Alvarez V.: Compiladores: Generación de Código Intermedio, obtenido de:
http://cic.puj.edu.co/wiki/lib/exe/fetch.php?media=materias:compi:comp_sesion21_2008-1.pdf

(s.f) M.C. Juan Carlos Olivares Rojas: Unidad VII Optimización, obtenido de:
http://dsc.itmorelia.edu.mx/~jcolivares/courses/ps207a/ps2_u7.pdf

(s.f) M. Luisa González Díaz: Introducción a la construcción de compiladores, obtenido de:


https://www.infor.uva.es/~mluisa/talf/docs/aula/A7.pdf

También podría gustarte