Você está na página 1de 24

Construcción de un

Compilador
PROCESOS DE UN COMPILADOR
➔ Análisis:
◆ En la que se analiza el programa fuente para
dividirlo en componentes y extraer de algún
modo el significado.

◆ Fases:
● Análisis léxico
● Análisis sintáctico
● Análisis semántico
PROCESOS DE UN COMPILADOR
➔ Síntesis:
◆ Se procede a generar grupos de los componentes que
conforman el programa, para generar una salida.
◆ En la que el significado obtenido se escribe en el
lenguaje objeto.

Generación de Optimización de Generación de


código código código
intermedio: (mejorar para que (código a ser
(mejorar el uso pueda ser más interpretado por
de la memoria) rápido la máquina.)
ejecutarlo.)
FASE I

ANÁLISIS LÉXICO
¿QUÉ ES?
◆ Es la herramienta de un compilador la cual ayuda a
leer los caracteres de entrada para formar
componentes y así poder identificarlos y pasar la
información al analizador sintáctico

◆ Representan:
● Palabras reservadas
● Identificadores
● Operadores
● Constantes numéricas
● Constantes de caracteres
¿CUÁL ES SU FUNCIÓN?
◆ Construir elementos léxicos llamados
patrones que serán utilizados posteriormente
por un analizador sintáctico.

¿CUÁL ES LA SALIDA DE ESTE ANALIZADOR?

◆ La salida es un conjunto de TOKENS

Paréntesis Reales
FLEX
● Flex es una herramienta para generar scanners:
● Flex lee los ficheros de entrada dados con la descripción de un escáner a
generar
● La descripción se encuentra en forma de parejas regulares y codigo C,
denominadas reglas.
● Flex genera como salida un fichero fuente en c, lexyy.c, que define una
rutina yylex().
● El fichero lexyy.c se compila y se alcanza con un programa principal muy
simple produciendo como salida una versión ejecutable del reconocedor.
FLEX
● Cuando se arranca el fichero ejecutable, este analiza su entrada en
busca de casos de las expresiones regulares. Siempre que encuentra
uno, ejecuta el código C correspondiente.
Especificación FLEX
● El fichero de entrada de flex está compuesto de tres
secciones, separadas por una línea donde aparece
únicamente un %% en esta.

■ Definiciones
■ %%
■ Reglas
■ %%
■ Código de usuario
Diseño del lenguaje
Objetivos de esta fase:

✓ Identificar tokens.
✓ Lexemas
✓ Expresiones regulares.
Tokens

Tokens que se tomaron en cuenta:

- Entero. - Operador lógico.


- Real. - Operador relacional.
- Palabra reservada. - Identificador.
- Operador matemático.
Lexemas
Lexema

“Secuencia de caracteres en el programa fuente que


coincide con el patrón de un token y es identificado por
el analizador léxico como una instancia de ese token. “

Ejemplos:
- Palabra reservada: “ cin, cout, if, else, do, while ”.
- Identificador: “ a, cadena, etc ”.
- Operador aritmético: “ +, -, *, / ”.
- Operador lógico: “ ||, &&, ! ”.
Patrón
Patrón

“Es la forma que pueden tomar los lexemas de un token“.

- Se hace uso de expresiones regulares para formar un


patrón.
- Se hace uso de algunas definiciones previas.

Por ejemplo:
- Definiciones: - Patrón del Entero
dígito [0-9] {signo}?{dígito}+
signo “+” | “-”
FASE II

ANÁLISIS
SINTÁCTICO
¿QUÉ ES?

Es la fase del analizador que se


encarga de chequear el texto de
entrada en base a una gramática libre
de contexto dada.
En caso de que el programa de entrada
sea válido, suministra el árbol
sintáctico que lo reconoce.
FUNCIÓN DEL ANALIZADOR SINTÁCTICO

El analizador sintáctico obtiene una cadena de tokens


del analizador léxico y verifica que la cadena de
nombres de los tokens pueda generarse mediante la
gramática para el lenguaje fuente.
BISON
 Bison es un generador de analizadores sintácticos de tipo
LALR(1).
 Se distribuye bajo la licencia GNU
 Genera código fuente en C a partir de una gramática
independiente del contexto.
BISON
 Es una gramática contextual que contendrá:
Declaraciones
%%
Reglas gramaticales
%%
Código de usuario
 Podemos poner código encerrado entre ‘%{‘ y
‘%}’, el cual representará código C que aparecerá,
tal cual se escribió, en el fichero de salida.
 Para comentar utilizando ‘/*’ y ‘*/’.
 Se declaran símbolos terminales (Tokens). Son los
mismos tokens que se habrá definido en el
analizador léxico.
Bison

a. Declaraciones
● En esta sección se definen los símbolos léxicos que se
van a utilizar en la parte sintáctica, normalmente son los
mismos token que definimos en la parte del analizador
léxico.

○ %token
<nombre_del_terminal>
Bison
 Declaraciones
%token ENTERO
%token FLOTANTE
%token PALABRA_RESERVADA
%token OPERADOR
%token OPERADOR_LOGICO
%token OPERADOR_RELACIONAL
%token IDENTIFICADOR
Bison
b. Reglas Bison
 Es la parte mas importante, aquí escribiremos reglas de producción
correspondientes a una gramática libre de contexto.
<Auxiliar> : <lado_derecho> {<acción>}
| <lado_derecho> {<acción>}
|…
;
● Los símbolos terminales de la gramática se suelen escribir en
mayuscula y nos lo tiene que devolver el analizador léxico y los
auxiliares suelen ir en minúscula.
● Por defecto la primera regla que escribamos corresponderá al símbolo
inicial de la gramática.
Bison
 Reglas Bison
instruccion: otraInstruccion
| otraInstruccion instruccion
;

otraInstruccion: asignacion
| declarar_funcion
| llama_funcion
| declaracion
| condicional
;

condicional: PALABRA_RESERVADA '(' IDENTIFICADOR ')' '{' instruccion '}'


| PALABRA_RESERVADA '(' operacion ')' '{' operacion '}'
Bison

c. Código de Usuario
 Simplemente se ponen código C que se volcará tal cual se escribió al fichero de salida.

int main() {
if ((yyin = fopen("entrada.txt", "rt")) == NULL) {
printf("El archivo no existe");
} else {
yyparse();
}
fclose(yyin);
return 0;
}
CONCLUSIONES
 La construcción de este proyecto a permitido saber
como construir un compilado, haciendo uso de sus
distintas etapas.
 Se pudo también conocer y tener en cuenta otras
herramientas las cuales ayudan y facilitan la
construcción de los analizadores, tales como, FLEX y
BISON
 Durante la realización de este proyecto saltaron a la
vista posibles formas de aplicación de este
copulador, desde hacer búsquedas de archivos,
ordenamientos de archivos y entre otras.

Você também pode gostar