Generacion de codigo

7
Escuela Politécnica Nacional Oscar Loor Sonia Jaguaco Compiladores y Lenguajes Laboratorio 2015-01-15 Generador de Código mediante análisis léxico y sintáctico, para sumas y restas Introducción Deseamos crear un programa capaz de reconocer errores léxicos y sintácticos de forma que nos permita generar automáticamente código ensamblador para sumas y restas ya sean con paréntesis o no. Definición de la gramática E -> NUMERO | E MAS E | E MENOS E | PAA E PAC Donde: E : Nodo Inicial Numero : es cualquier numero flotante | Nodo Terminal Mas : operador ‘+’ | Nodo Terminal Menos : operador ‘-’ | Nodo Terminal PAA : Paréntesis abierto | Nodo Terminal PAC : Paréntesis cerrado | Nodo Terminal Árbol Sintáctico para: (3+(5+7)+8) Tendrá la estructura (numero+(numero + numero) + numero) E PAA E E E MAS E PAA E E NUMERO MAS E NUMERO PAC MAS E NUMERO PAC

description

Generacion de codigo

Transcript of Generacion de codigo

Page 1: Generacion de codigo

Escuela Politécnica Nacional

Oscar Loor

Sonia Jaguaco

Compiladores y Lenguajes

Laboratorio

2015-01-15

Generador de Código mediante análisis léxico y sintáctico, para sumas y restas

Introducción Deseamos crear un programa capaz de reconocer errores léxicos y sintácticos de forma que

nos permita generar automáticamente código ensamblador para sumas y restas ya sean con

paréntesis o no.

Definición de la gramática E -> NUMERO | E MAS E | E MENOS E | PAA E PAC

Donde:

E : Nodo Inicial

Numero : es cualquier numero flotante | Nodo Terminal

Mas : operador ‘+’ | Nodo Terminal

Menos : operador ‘-’ | Nodo Terminal

PAA : Paréntesis abierto | Nodo Terminal

PAC : Paréntesis cerrado | Nodo Terminal

Árbol Sintáctico para: (3+(5+7)+8) Tendrá la estructura (numero+(numero + numero) + numero)

E

PAA E

E

E MAS E

PAA E

E

NUMERO

MAS E

NUMERO

PAC

MAS E

NUMERO

PAC

Page 2: Generacion de codigo

Árbol Sintáctico para: 7-3 Tendrá la estructura numero – numero

Lenguaje ensamblador para una Suma del tipo a +b li $a0 a sw $a0 0($sp) addiu $sp $sp -4 li $a0 b lw $t1 4($sp) add $a0 $a0 $t1 addiu $sp $sp 4

Lenguaje ensamblador para un Resta del tipo a - b li $a0 a sw $a0 0($sp) addiu $sp $sp -4 li $a0 b lw $t1 4($sp) sub $a0 $a0 $t1 addiu $sp $sp 4

**Utilizamos la operación sub para la resta

E

E

NUMERO

MENOS E

NUMERO

Page 3: Generacion de codigo

Análisis de los archivos:

Compilar.sh

Como utilizaremos estos comandos continuamente cada vez que necesitemos

modificar algún archivo, generamos un archivo automático que lo realice

Hay que tomar en cuenta el orden de los comandos en la última línea puesto que

puede originar errores porque no se reconocen en el momento que se necesitan

alguna librerías

Para ejecutar basta con poner ./analizador

Lexico.l

1) Incluimos las librerías básicas y se agrega una librería sintáctico.tab.h que se crea al

momento de ejecutar BISON

2) Creamos las expresiones regulares teniendo en cuenta:

Creo el token class DIGITO para utilizarla es {DIGITO}

Creo el token class NUMERO este puede ser un digito o digito.digito para utilizarla

es {NUMERO}

o + -> 1 a muchos

o ? -> 0 o 1

3) Creamos las reglas o lo que hará el archivo una vez identifique las token class

Page 4: Generacion de codigo

Token class {Que hace}

NOTAS PARA TOMAR EN CUENTA

Cada vez que se encuentra en el texto a analizar la token class yylex() devuelve un

token analizador sintáctico, si esta token class tenía un valor asociado se guarda este

valor en la variable yylval

Por tal motivo nos referimos a yylval.real donde .real significa que nos estamos

refiriendo a este dato que se encuentra en sintáctico.y de la siguiente forma

%union { float real; }

La función atof convierte un argumento string a un punto flotante

Yytex es una variable tipo puntero que apunta a char, cuando se reconocen

componentes léxicos muy largos el buffer no tendrá overflows porque flex va

asignando memoria dinámicamente , se puede utilizar yytext como un array en caso

de necesitarlo

El punto “.” Significa que lo analizado no coincide con alguna token class

Sintactico.y

La declaración extern sirve para que entienda que la variable se encontrará en algún

lugar como una variable global (Tanto yylex como yytext se encuentran en el archivo

léxico.l)

La variable del tipo FILE *yyin, contiene la descripción del fichero que contiene el

programa que está procesando el analizador léxico

Declaramos una función como lo exige C, en este caso yyerror será una función cuando

Bison detecta un error sintáctico

Especificamos los tipos de datos

Esto lo realizamos para poder utilizar diferentes tipos de datos en los terminales y no

terminales

Page 5: Generacion de codigo

Start: Indica la producción que inicia nuestra gramática

Token: Indica los terminales y se puede especificar el tipo de dato

Type: Indica los no terminales y se puede especificar el tipo de dato

%left indica que será asociativa a la izquierda

*Falta parte de la imagen al lado derecho, por motivo de tamaño no es posible incluirla

Ingresamos las reglas gramaticales con la estructura

E: Algo {que hace} | Algo2 {que hace} | …. ;

Page 6: Generacion de codigo

Con $$ asignamos el valor de la derecha a la izquierda, con la estructura:

A : B Numero C … | D E F …

$$ : $1 $2 $3 … | $1 $2 $3 ...

Esta función es la que se llama cuando encuentra un error sintáctico

*Falta parte de la imagen al lado derecho, por motivo de tamaño no es posible incluirla

Esta es la función principal del programa, yyparse() comienza el análisis pidiendo como entrada

lo que vamos a analizar

Resultados

Suma

Page 7: Generacion de codigo

Resta

CONCLUSIONES: Verificamos las etapas de análisis léxico y análisis sintáctico de una forma práctica para

esto utilizamos herramientas que nos ayudan con disminuir las líneas de programación

como los son FLEX y BISON, si bien al principio puede ser un poco complejo, podemos

practicarlo como en este caso lo utilizamos para realizar la generación de código de

manera automática

RECOMENDACIONES: Partir de una expresión regular de lo que se desea realizar en hoja.

Realizar el árbol sintáctico para una mejor comprensión.

Manejar las herramientas utilizadas.

BIBLIOGRAFÍA: Marina de la Cruz y Alfonso Ortega, Construcción de una calculadora con Lex/Flex y Yaac/Bison

[online] Disponible en:

http://astreo.ii.uam.es/~alfonso/web_compiladores_03/practicas/calculadora_03_04_web.pd

f

David, Ejemplo Flex y Bison [online] Disponible en:

http://inghobbit.blogspot.com/2011/04/ejemplo-flex-y-bison.html