Está en la página 1de 6

TALLER DE COMPILADORES

1. Definir los siguientes términos:

 Compilador:
Es un Software que traduce un programa escrito en un lenguaje de programación de alto
nivel (C / C ++, COBOL, etc.) en lenguaje de máquina. Que genera lenguaje ensamblador
primero y luego traduce el lenguaje ensamblador al lenguaje máquina. Una utilidad
conocida como «enlazador» combina todos los módulos de lenguaje de máquina necesarios
en un programa ejecutable que se puede ejecutar en la computadora.

 Token:
Un token es una cadena de caracteres que tiene un significado coherente en cierto lenguaje
de programación. Ejemplos de tokens, podrían ser palabras clave (if, while, int,...),
identificadores, números, signos, o un operador de varios caracteres, (por ejemplo, :=).
Son los elementos más básicos sobre los cuales se desarrolla toda traducción de un
programa, surgen en la primera fase, llamada análisis léxico, sin embargo, se siguen
utilizando en las siguientes fases (análisis sintáctico y análisis semántico) antes de perderse
en la fase de síntesis.

 Análisis descendente:
Analizador sintáctico descendente. (Top-Down-Parser): un analizador puede empezar con
el símbolo inicial e intentar transformarlo en la entrada, intuitivamente esto sería ir
dividiendo la entrada progresivamente en partes cada vez más pequeñas.
Para trabajar el análisis sintáctico descendente se debe realizar primeramente algunas
operaciones para que la gramática sea LL1 las cuales son:
 ELIMINAR AMBIGUEDAD: Para eliminar la ambigüedad se debe reescribir la
gramática.
 ELIMINAR RECURSIVIDAD POR LA IZQUIERDA: Una gramática es recursiva
por la izquierda si tiene un nodo Terminal a tal que existe una derivación A->Aα
para alguna cadena. Es decir, por simple observación podemos identificar.
 Análisis ascendente:
Analizador sintáctico ascendente. (Bottom-Up-Parser). Un analizador puede empezar con la
entrada e intentar llegar hasta el símbolo inicial, intuitivamente el analizador intenta
encontrar los símbolos más pequeños y progresivamente construir la jerarquía de símbolos
hasta el inicial.

Cualquier mecanismo de análisis ascendente consiste en partir de una configuración inicial


e ir aplicando operaciones, cada una de las cuales permite pasar de una configuración
origen a otro destino. El proceso finalizará cuando la configuración destino llegue a ser tal
que α represente al árbol sintáctico completo y en β se hayan consumido todos los tokens.
Las operaciones disponibles son las siguientes:

 ACEPTAR: se acepta la cadena: β ≡ EOF y α ≡ S (axioma inicial).

 RECHAZAR: la cadena de entrada no es valida.

 REDUCIR: consiste en aplicar una regla de produccion hacia atras a algunos


elementos situados en el extremo derecho de α.

 DESPLAZAR: consiste unicamente en quitar el terminal mas a la izquierda de β y


ponerlo a la derecha de α.

 Autómatas finitos:

Autómata finito (máquina de estado finito). Es un modelo computacional que realiza


cómputos en forma automática sobre una entrada para producir una salida.
Este modelo está conformado por un alfabeto, un conjunto de estados y un conjunto de
transiciones entre dichos estados. Su funcionamiento se basa en una función de transición,
que recibe a partir de un estado inicial una cadena de caracteres pertenecientes al alfabeto
(la entrada), y que va leyendo dicha cadena a medida que el autómata se desplaza de un
estado a otro, para finalmente detenerse en un estado final o de aceptación, que representa
la salida.
La finalidad de los autómatas finitos es la de reconocer lenguajes regulares, que
corresponden a los lenguajes formales más simples según la Jerarquía de Chomsky.
2. Explicar las fases de un compilador:

1.-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 conocidos como
tokens.
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.

2.-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.
Se determinan las relaciones estructurales entre los componentes léxicos, esto es
semejante a realizar el análisis gramatical sobre una frase en lenguaje natural. La
estructura sintáctica la definiremos mediante las gramáticas independientes del
contexto.

3.-Análisis semántico:
Realiza las comprobaciones necesarias sobre el árbol sintáctico para determinar el
correcto significado del programa.
Las tareas básicas para realizar son: La verificación e inferencia de tipos en
asignaciones y expresiones, la declaración del tipo de variables y funciones antes de
su uso, el correcto uso de operadores, el ámbito de las variables y la correcta
llamada a funciones.

4.-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.
5.-Generador 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.
Suelen implementarse a mano, y son complejos porque la generación de un buen
código objeto requiere la consideración de muchos casos particulares.

6.-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 como (arreglos, registros, etc.)
Además, almacena el tipo de dato, método de paso de parámetros, tipo de retorno y
de argumentos de una función, el ámbito de referencia de identificadores y la
dirección de memoria. Interacciona tanto con el analizador léxico, sintáctico y
semántico que introducen información conforme se procesa la entrada.

7.-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.
Encuentra errores: – En tiempo de compilación: errores léxicos (ortográficos),
sintácticos (construcciones incorrectas) y semánticos (p.ej. errores de tipo) – En
tiempo de ejecución: direccionamiento de vectores fuera de rango, divisiones por
cero, etc. – De especificación/diseño: compilan correctamente pero no realizan lo
que el programador desea.
3. Explique qué es y realice un ejemplo de cómo funciona un árbol sintáctico

Es una representación de árbol de la estructura sintáctica simplificada del código fuente


escrito en cierto lenguaje de programación. La sintaxis es abstracta en el sentido que no
representa cada detalle que aparezca en la sintaxis verdadera. Por ejemplo, el agrupamiento
de los paréntesis está implícito en la estructura arborescente, y una construcción sintáctica
tal como IF condición THEN puede ser denotada por un solo nodo con dos ramas.

Esto hace a los árboles de sintaxis abstracta diferentes de los árboles de sintaxis concreta,
llamados tradicionalmente árboles de parser, que son a menudo construidos por la parte
parser de la traducción del código fuente y el proceso de compilación (a pesar quizás de un
nombramiento no intuitivo).
Ejemplo:

En un árbol podemos ver la notación polaca para evaluar una operación.

Bibliografia:

 https://www.google.com/search?
q=arbol+de+sintaxis+abstracta+ejemplo&hl=es&source=lnms&tbm=isch&sa=X&ved=2ahU
KEwi1xZuKpLzpAhWlmuAKHST3BJoQ_AUoAXoECAwQAw&biw=1517&bih=640#imgrc=Ax6
P7L20URRhUM
 https://www.google.com/search?
q=que+es+un+token+programacion&oq=&aqs=chrome.7.69i59l8.1621867j0j7&sourceid=c
hrome&ie=UTF-8
 https://www.ecured.cu/Aut%C3%B3mata_finito
 https://www.ecured.cu/Analizador_sint%C3%A1ctico_ascendente
 https://sites.google.com/site/teoriadelenguajesformaless/1-7-fases-de-un-compilador
 https://www.dlsi.ua.es/asignaturas/pl/downloads/1516/tema3-1x2.pdf

También podría gustarte