Generacion de codigo
-
Upload
oscar-loor -
Category
Documents
-
view
6 -
download
0
description
Transcript of 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
Á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
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
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
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} | …. ;
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
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