SlideShare una empresa de Scribd logo
1 de 16
Descargar para leer sin conexión
CIS-IXB-003
UNIVERSIDAD
NACIONAL
DE LOJA
´Area de la Energ´ıa las Industrias y los Recursos Naturales No Renovables
Carrera de Ingenier´ıa en Sistemas
Compiladores
Convertidor de Divisas
Tarea- Extra Clase
Noveno B
Autor:
• Henry David Quishpe
Docente: Ing. Henry-Paz,
Loja-Ecuador
2015
1
Contents
A Problema 3
B Aut´omata del Compilador 3
1 An´alisis L´exico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1 .1 C´odigo de Usuario . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1 .2 Opciones y Declaraciones . . . . . . . . . . . . . . . . . . . . . . . . 4
1 .3 Reglas Lexicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2 An´alisis Sint´actico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2 .1 Importaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2 .2 Componentes de C´odigo de Usuario . . . . . . . . . . . . . . . . . . 7
2 .3 Declaraci´on de la lista de S´ımbolos de la Gram´atica . . . . . . . . . 11
2 .4 Predencia y Asociacion de los Terminales . . . . . . . . . . . . . . . 11
2 .5 Gram´atica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
C Resultados 13
D BIBLIOGRAFIA 16
A Problema
Para poder realizar el compilador hay que basarse en un lenguaje, para ello he cre´ıdo con-
veniente crear mi propio lenguaje a partir de un alfabeto con el objetivo de crear palabras
claves, identificadores, caracteres($, E, P y S) y n´umeros. Se har´a uso de la librer´ıa JFlex,
ya que esta nos facilita la construcci´on del analizador l´exico, para la programaci´on del
analizador sint´actico se utiliza la librer´ıa Cup, se har´a una integraci´on de las dos librer´ıas
para la creaci´on del compilador.
El compilador que se realiz´o es un convertidor de divisas, lo que se pretende es saber
a qu´e valor equivale una divisa conocida a otra desconocida, para ello este compilador
tiene una entrada en donde se debe especificar el valor y las 2 divisas respectivamente para
finalizar una l´ınea se tendr´a que poner un ; hay que recalcar que las divisas aceptadas son
Dolar ($), Peso Mexicano (P), Sol Peruano (S) y Euro (E). A futuro se puede adicionar
divisas m´as conocidas para tener un compilador m´as completo.
El compilador se lo realiz´o en 2 etapas las cuales son:
1) An´alisis L´exico
2) An´alisis Sint´actico
B Aut´omata del Compilador
Para la creaci´on del aut´omata se har´a uso de la herramienta JFlap, la misma que cuenta
con una interfaz de f´acil uso para la creaci´on de aut´omatas y para hacer pruebas de
funcionamiento y otras funciones mas de importante uso.
Figure 1: Aut´omata del Compilador Conversor de Divisas
3
1 An´alisis L´exico
El Analizador l´exico lee una secuencia de caracteres de izquierda a derecha del programa
fuente y agrupa las secuencias de caracteres en unidades con significado propio (compo-
nentes l´exicos). Las palabras claves, identificadores, operadores, constantes num´ericas,
signos de puntuaci´on como separadores de sentencias, llaves, par´entesis, etc.
El analizador l´exico de este compilador se encuentra divido en 3 secciones:
1 .1 C´odigo de Usuario
En la primera secci´on se realiza lo que es el c´odigo de usuario, aqu´ı es donde se especifica
el paquete al cual va a pertenecer el archivo java e importaciones de algunas librer´ıas que
se van a necesitar.
A continuaci´on se explica cada linea de codigo del archivo .flex: En la siguiente linea
se especifica el paquete al cual la clase va a pertenecer.
/**
* Especificacion del paquete
*/
package analizador;
Se importa toda la librer´ıa cup de la clase runtime.
/**
* Libreria Cup
*/
import java_cup.runtime.*;
Para separar cada secci´on del archivo l´exico o para indicar el inicio se lo har´a con el
s´ımbolo %%.
1 .2 Opciones y Declaraciones
En la siguiente l´ınea se especifica el nombre de la clase java que se crea cuando se ejecute
el archivo .flex.
/**
* nombre de la clase
*/
%class AnalizadorLexico
A continuaci´on se activa el contador de linea y columnas con los comandos %line y %col-
umn respectivamente.
// activar el contador de lineas, variable yyline
%line
// activar el contador de columnas, variable yycolumn
%column
4
Con el comando %cup se activa la compatibilidad con java cup para los analizadores
sint´acticos (parser).
// activar la compatibilidad con java cup
%cup
Se crea un m´etodo de tipo Symbol para guardar el tipo de token encontrado, para lo
cual recibe como par´ametros un entero, este m´etodo nos retorna un Symbol con el tipo,
la linea y la columna.
private Symbol symbol(int type){
return new Symbol(type, yyline, yycolumn);
}
Se crea un m´etodo de tipo Symbol para guardar el tipo de token encontrado junto con su
valor, para lo cual recibe como par´ametros un entero y Objeto el cual va a ser el valor, este
m´etodo nos retorna un Symbol con el tipo, la linea, la columna y el valor correspondiente.
private Symbol symbol(int type, Object value){
return new Symbol(type, yyline, yycolumn, value);
}
En esta parte se realizan las declaraciones de las expresiones regulares, las mismas que
ser´an utilizadas en las reglas l´exicas. En la siguiente l´ınea de c´odigo declaramos la variable
Salto a la cual le asignamos un retorno de carro o un salto de l´ınea o ambos a la vez.
// un salto de linea es un n, r o rn
Salto = r|n|rn
Creamos la variable Espacio a la cual le asignamos la variable Salto declarada anterior-
mente o le asignamos un espacio en blanco, tabulador o avance de p´agina.
// Espacio en blanco, tabulador t avance de pagina f
Espacio = {Salto}| [ tf]
Declaramos la variable Entero a la cual le asignamos uno o varios n´umeros de del 0 al 9
seguido de un punto y repetimos la primera parte, lo cual nos genera en si un n´umero
decimal como por ejemplo 10.23.
// numero decimal
Entero = [0-9]+ . [0-9]+
1 .3 Reglas Lexicas
Esta secci´on contiene expresiones regulares y acciones, las acciones son c´odigo en java que
se ejecuta cuando se encuentre una entrada v´alida para la expresi´on regular correspondi-
ente. YYINITIAL es el estado inicial del analizador l´exico al escanear. Las expresiones
regulares s´olo ser´an comparadas si se encuentra en ese estado inicial. Es decir, cada vez
que se encuentra una coincidencia el scanner vuelve al estado inicial. Por lo cual se ignoran
estados intermedios.
5
// Estado inicial del analizador lexico
<YYINITIAL> {}
El c´odigo siguiente debe estar dentro de YYINITIAL para que una vez encontrada
una entrada v´alida se vuelva analizar desde el inicio, es decir ignorando las siguientes
expresiones regulares.
Cuando se encuentra el ; en la entrada se regresa el token FINLINEA el cual est´a declarado
en la clase sym.
// Regresa el token FINLINEA declarado en la clase sym
";" {return symbol(sym.FINLINEA);}
Al igual cuando se encuentre el s´ımbolo de D´olar $ en la cadena de entrada se retornar´a
el token D´OLAR.
// Regresa el token $ DOLAR declarado en la clase sym
"$" {return symbol(sym.DOLAR);}
Cuando se encuentra la E nos retorna el token Euro.
// Regresa el token EURO declarado en la clase sym
"E" {return symbol(sym.EURO);}
Tambi´en si se encuentra la P nos retorna el token Peso.
// Regresa el token PESO declarado en la clase sym
"P" {return symbol(sym.PESO);}
Y as´ı mismo con S se retorna el token Sol.
// Regresa el token SOL declarado en la clase sym
"S" {return symbol(sym.SOL);}
La siguiente expresi´on indica que cuando se encuentre un n´umero Decimal, se retorna el
token VALOR y el valor.
// Regresa el token VALOR declarado en la clase sym
{Entero}+ { return symbol(sym.VALOR, new Double(yytext()));}
La siguiente expresi´on regular es para ignorar la variable Espacio, la misma que est´a
compuesta por un tabulador, salto de p´agina, retorno de carro, avance de p´agina o un
espacio en blanco.
{Espacio} {/* ignora el espacio */ }
Dentro del mismo m´etodo YYINITIAL especificamos una l´ınea para que nos imprima un
error con el valor, la l´ınea y columna, este error se presenta cuando se encuentre en la
entrada un car´acter que no est´e declarado en el m´etodo YYINITIAL.
. {System.out.println("Caracter Ilegal <" + yytext()
+ ">, En la linea: "+ (yyline+1) + " Y en la columna: "
+ (yycolumn+1)) ;}
6
2 An´alisis Sint´actico
El An´alisis sint´actico determina si la secuencia de componentes l´exicos sigue la sintaxis
del lenguaje y obtiene la estructura jer´arquica del programa en forma de ´arbol.
El archivo .cup esta compuesto por 5 secciones las cuales se explican a continuacion:
2 .1 Importaciones
En la primera secci´on se realiza lo que son las declaraciones de package donde se especifica
el paquete al cual va a pertenecer el archivo java e importaciones de algunas librer´ıas que
se van a necesitar.
En la siguiente linea se especifica el paquete al cual la clase va a pertenecer.
/**
* Especificacion del paquete
*/
package analizador;
Se importa toda la librer´ıa cup de la clase runtime.
/**
* Libreria Cup
*/
import java_cup.runtime.*;
Tambi´en se importa la librer´ıa Reader, esta se utiliza para poder leer un archivo .txt el
cual ser´a nuestra entrada.
/**
* Libreria Filereader
*/
import java.io.FileReader;
2 .2 Componentes de C´odigo de Usuario
Creamos un m´etodo para reportar los errores el mismo que recibe dos par´ametros un
mensaje de tipo String y una informaci´on (Symbol) de tipo Object.
public void report_error(String message, Object info) {
}
En la siguiente l´ınea creamos una variable m de tipo StringBuffer a la cual le asignamos
la cadena Error, esta variable es la que se le va adicionar la l´ınea y columna en donde se
encuentra el error.
StringBuffer m = new StringBuffer("Error");
Mediante un if comprobamos que la informaci´on que recibimos sea un instancia de la clase
Symbol.
7
if(info instanceof java_cup.runtime.Symbol) {
}
Creamos el objeto s al cual le asignamos la informaci´on recibida, aqu´ı se guardar´a el valor
entero asignado en la clase sym.
java_cup.runtime.Symbol s=((java_cup.runtime.Symbol)info);
A continuaci´on con el if comprobamos que la l´ınea sea mayor o igual a cero.
if(s.left >= 0) {
}
Si la condici´on anterior se cumple a la variable m declarada anteriormente le asignamos
la cadena “En la linea ” mas el numero de linea aumentado en 1, ya que se empieza a
contar desde cero.
m.append(" En la linea....."+(s.left+1));
Utilizamos otro if dentro del if anterior pero en este caso para comprobar que la columna
sea mayor o igual a cero.
if (s.right >= 0){
}
Si la condici´on llegase a cumplirse le a˜nadimos a la variable m la cadena “y en la columna”
m´as el n´umero de columna aumenta en uno por la misma raz´on del conteo de l´ıneas.
m.append(", y en la columna...... "+(s.right+1));
En este compilador le hemos a˜nadido algo adicional, esto es el control de errores, es decir
identificar porque se ha producido el error e informar al usuario. Para esto utilizamos la
variable s que es de tipo Symbol declarada anteriormente, para obtener el valor entero del
token utilizamos el sym, el cual nos regresa el valor un valor entero, con esto comprobamos
con los valores de cada uno de los valores de los tokens de la clase sym. Entonces mediante
un if comprobamos la igualdad, cuando el valor entero sea igual a cero le asignamos a la
variable mensaje que recibimos como par´ametro la cadena “Falta un ;”.
if (s.sym == 0){
message = "Falta ; o la expresion esta inncompleta";
}
En caso de no cumplirse la condici´on anterior comprobamos si existe una igualdad entre
5, 3, 6, o 4.
if (s.sym == 5 || s.sym == 3 || s.sym == 6 || s.sym == 4){
}
Para saber si el error es de un ; comprobamos si la columna es igual a cero y la l´ınea
es igual o mayor a 1, esto es porque en el compilador se ignora el salto de l´ınea. En
caso de que se cumpla la condici´on a la variable mensaje le asignamos “Falta un ; en la
expresi´on”.
8
if(s.right == 0 && s.left >= 1){
message = "Falta un ; en la expresion";
}
Si no se cumple entonces le asignamos a mensaje “El valor de la divisa es incorrecto”.
else {
message = "El valor de la divisa es incorrecto ";
}
En caso de no cumplirse la condici´on que comprobamos con 5, 3, 6 o 4 pasamos a compro-
bar si el valor entero es igual a 2 o igual 7. En caso de cumplirse le asignamos a mensaje
la cadena “Usted debe ingresar una divisa puede ser ($, P, S o E)”.
else if(s.sym == 2 || s.sym ==7){
message = "Usted dede ingresar una divisa";
}
Para terminar con el m´etodo para reportar los errores a la variable m le asignamos la
cadena “:” m´as el mensaje recibido como par´ametro y modificado en caso que haya entrado
en alguna condici´on anteriormente.
m.append(" : "+message);
Y por ´ultimo imprimimos los errores que se llegasen a encontrar.
System.err.println(m);
Para poder hacer la conversi´on de divisas creamos un m´etodo el cual recibe tres par´ametros
la primera divisa de tipo String, la segunda divisa la cual es a la que se va a convertir
igual de tipo String y por ´ultimo el valor de tipo double.
public void conversion(String a, String b, double n){
}
Dentro del m´etodo creamos una variable de tipo double en la cual se va almacenar la
equivalencia de cada moneda con respecto a la otra.
double equivalencia=0;
Mediante un if comprobamos la primera divisa. En caso de que sea igual a $ se comprueba
la segunda divisa.
Si la segunda divisa es igual a $ a la variable equivalencia le asignamos 1.00 Si no se
cumple comprobamos si es igual a P (Pesos) y a la variable equivalencia le asignamos
14.66, si no se cumple comprobamos si es igual E (Euros) y a la variable equivalencia le
asignamos 0.846645, si no se cumple comprobamos si es igual a S (Soles) y a la variable
equivalencia le asignamos 2.98170.
Continuamos con el primer if pero en esta ocasi´on comprobamos la primera divisa con E
(Euros).
Si la primera divisa es igual a E comprobamos la si la segunda divisa es igual a $ D´olar) y
9
a la variable equivalencia le asignamos 1.18113, si no se cumple comprobamos si es igual
a P (Peso) y a la variable equivalencia le asignamos 17.20, si no se cumple comprobamos
si es igual a E (Euro) y a la variable equivalencia le asignamos 1.00, si no se cumple
comprobamos si es igual a S (Soles) y a la variable equivalencia le asignamos 3.52.
En caso de que la primera divisa no sea igual E comprobamos con P.
Si la primera divisa es igual a P entonces comprobamos si la segunda divisa es igual a $
y a la variable equivalencia le asignamos 0.068, si no se cumple comprobamos si es igual
a P (Peso) y a la variable equivalencia le asignamos 1.00, si no se cumple comprobamos
si es igual a E (Euro) y a la variable equivalencia le asignamos 0.5813, si no se cumple
comprobamos si es igual a S (Sol) y a la variable equivalencia le asignamos 0.20332.
Y por ´ultimo si la primera divisa no es igual a P comprobamos con S (Soles) En caso de
que la primera divisa sea igual a S, empezamos a comprobar si la segunda divisa es igual
a $ y si lo es le asignamos a la variable equivalencia 0.34, si no se cumple comprobamos
si es igual a P (Peso) y a la variable equivalencia le asignamos 4.92 Si no se cumple
comprobamos si es igual a E (Euro) y a la variable equivalencia le asignamos 0.285, si
no se cumple comprobamos si es igual a S (Sol) y a la variable equivalencia le asignamos
1.00.
if (a=="$"){
System.out.print("Dolares");
if (b=="$"){equivalencia=1.00;}
else if (b=="P"){equivalencia=14.66;}
else if (b=="E"){equivalencia=0.846645;}
else if (b=="S"){equivalencia= 2.98170;} }
else if (a=="E"){
System.out.print("Euros");
if (b=="$"){equivalencia=1.18113;}
else if (b=="P"){equivalencia=17.20;}
else if (b=="E"){equivalencia=1.00;}
else if (b=="S"){equivalencia=3.52;}
}
else if (a=="P"){
System.out.print("Pesos");
if (b=="$"){equivalencia=0.068;}
else if (b=="P"){equivalencia=1.00;}
else if (b=="E"){equivalencia=0.05813;}
else if (b=="S"){equivalencia=0.20332;}
}
else if (a=="S"){
System.out.print("Soles");
if (b=="$"){equivalencia=0.34 ;}
else if (b=="P"){equivalencia=4.92;}
else if (b=="E"){equivalencia=0.285;}
else if (b=="S"){equivalencia=1.00;}
}
10
Al final del m´etodo convertir se imprime los resultados.
System.out.print(" Son ======> "+ n*equivalencia + " ");
Para la ejecuci´on del compilador creamos el m´etodo main en el cual debemos crear un
objeto de la misma clase y creamos un variable resultado a la cual le asignamos el m´etodo
parse al cual se puede llamar con el objeto creado anteriormente.
public static void main(String[] argumento){
try {
AnalizadorSintactico asin = new AnalizadorSintactico(
new AnalizadorLexico(new FileReader(argumento[0])));
Object resultado = asin.parse().value;
} catch (Exception ex){
ex.printStackTrace();
}
}
2 .3 Declaraci´on de la lista de S´ımbolos de la Gram´atica
A continuaci´on declaramos los s´ımbolos terminales y no terminales. Los terminales son
los tokens obtenidos por el analizador l´exico. Primero se declaran los terminales que no
tienen un valor.
terminal FINLINEA, DOLAR, PESO, SOL, EURO;
Luego se declaran los terminales los cuales tienen un valor en este caso entero.
terminal Double VALOR;
Tambi´en se declaran los no terminales los cuales van a ser usados en la secci´on de la
gram´atica.
En nuestro caso declaramos no terminales de tipo Object, ya que este nos indica que no
tienen tipo, es decir pueden ser entero o String.
non terminal Object programa, linea, divisa;
2 .4 Predencia y Asociacion de los Terminales
La precedencia de los no terminales, no sirve con s´ımbolos terminales es por eso que no
la usamos. Adem´as indica si se asocia a izquierda o derecha.
2 .5 Gram´atica
Por ´ultimo realizamos la gram´atica de nuestro analizador la cual puede contener tanto un
terminal con un no terminal. La expresi´on programa es la ra´ız de la gram´atica esta puede
ser una expresi´on programa seguida de una expresi´on l´ınea o puede ser una l´ınea.
programa ::= programa linea | linea;
11
La expresi´on l´ınea se compone de una expresi´on medida seguida del terminal VALOR
otra vez la expresi´on medida por ´ultimo el terminal FINLINEA, de esa forma se realiza
la conversi´on de la divisas para ello llamamos al m´etodo convertir usando el parser y le
enviamos las 2 divisas y el valor.
Tambi´en utilizamos el token error de la clase sym para llamar al m´etodo de reporte de
errores.
linea ::= error {:parser.report_error("Revise la sintaxis",null);:}|
divisa:m1 VALOR:n divisa:m2 FINLINEA {
parser.conversion(m1.toString(),m2.toString(),n);
System.out.println(m2); :};
La expresi´on medida esta compuesta por el terminal D´OLAR en RESULT se almacena el
valor de las acciones. O puede estar compuesta por el terminal PESO de igual manera en
RESULT se almacena el valor de la acciones, tambi´en puede estar compuesta por EURO
o SOL.
divisa ::= DOLAR {: RESULT="$"; :} | PESO {: RESULT="P"; :} |
SOL {: RESULT="S"; :} | EURO {: RESULT="E"; :};
12
C Resultados
A continuaci´on se ilustra los resultados obtenidos del compilador, para ello ejecutamos la
clase Ejecutor.java, esta clase necesita un archivo txt el cual es nuestra entrada.
Figure 2: Valores de Entrada
Si nuestros valores de entrada son los de la figura 2 al compilar la clase Ejecutor obten-
dremos los siguientes resultados:
Figure 3: Resultado del Compilador
Si ingresamos un car´acter que no este declarado en las reglas l´exicas del archivo analizador
l´exico como por ejemplo:
Figure 4: Entrada con caracter erroneo
13
Con la entrada de la figura 4 el compilador nos indica el error junto conl car´acter, la
linea y columna en la que se encuentra, el compilador ignora este car´acter para seguir
compilando, como lo podemos ver en la figura 5.
Figure 5: Resultado de Error L´exico
Adem´as se controlan los errores sint´acticos, se indica de porque el error y en donde se
encuentra.
Figure 6: Entrada con errores sint´acticos
Cuando se tenga la entrada de la figura 6 el compilador nos informar´a que existe un error
el mismo que se especifica el porqu´e del error junto con la l´ınea y columna.
Figure 7: Errores de Sintaxis
14
Cuando no se ingrese el ; que en nuestro compilador es el fin de l´ınea el compilador
nos informa del error inmediatamente.
Figure 8: Entrada Sin Fin de Linea de Sintaxis
Si no se ha ingresado el ; y al ejecutar nuestro compilador este nos devolver´a lo siguiente:
Figure 9: Error de Sintaxis ;
15
D BIBLIOGRAFIA
References
[1] L.C. Kenneth. Construcci´on de Compiladores. Principios y pr´actica. M´exico: Thom-
son editores, 2004. pp. 31.
[2] A.V. Aho, R. Sethi y J.D. Ullman. Compiladores: Principios, t´ecnicas y herramientas.
Wilmington, Delaware: Addison- Wesley Iberoamericana S. A., 1990. pp. 1 - 5.
[3] Gloria In´es Alvarez V. Compiladores: An´alisis Sint´actico, 2008 En l´ınea. Disponible
en: http://cic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias
[4] Enlace para descargar el codigo del compilador. Disponible en: https://code.
google.com/p/compiladores-h/
16

Más contenido relacionado

La actualidad más candente

Estructuras de los lenguajes de programacion
Estructuras de los lenguajes de programacionEstructuras de los lenguajes de programacion
Estructuras de los lenguajes de programacionManuelDorante65
 
Analizador de una matriz utilizando compiladores
Analizador de una matriz utilizando compiladoresAnalizador de una matriz utilizando compiladores
Analizador de una matriz utilizando compiladoresChristian Lara
 
Cap4
Cap4Cap4
Cap4CJAO
 
Elementos basicos c++
Elementos basicos c++Elementos basicos c++
Elementos basicos c++Tensor
 
Estructura de un compilador 2
Estructura de un compilador 2Estructura de un compilador 2
Estructura de un compilador 2perlallamas
 
Sintaxis de lenguaje de programacion
Sintaxis de lenguaje de programacionSintaxis de lenguaje de programacion
Sintaxis de lenguaje de programacionluismart05
 
Unidad 3
Unidad 3Unidad 3
Unidad 3tf94
 
Estructura sintactica de los lenguajes de programacion
Estructura sintactica de los lenguajes de programacionEstructura sintactica de los lenguajes de programacion
Estructura sintactica de los lenguajes de programacionandreinagracielarojasadam
 
Sintaxis en java
Sintaxis en javaSintaxis en java
Sintaxis en javapbcanessa
 
Estructura sintactica de los lenguajes de programacion
Estructura sintactica de los lenguajes de programacionEstructura sintactica de los lenguajes de programacion
Estructura sintactica de los lenguajes de programacionkatiuska27
 
Programacinenshell linux
Programacinenshell linuxProgramacinenshell linux
Programacinenshell linuxusupr2014
 
Manual Instalación JLex & CUP
Manual Instalación JLex & CUPManual Instalación JLex & CUP
Manual Instalación JLex & CUPrubeniii
 
Complementos
ComplementosComplementos
ComplementosTensor
 
Estructura sintactica de los lenguajes de programacion y bases de datos
Estructura sintactica de los lenguajes de programacion y bases de datosEstructura sintactica de los lenguajes de programacion y bases de datos
Estructura sintactica de los lenguajes de programacion y bases de datosspedy93
 

La actualidad más candente (20)

Flex y bison
Flex y bisonFlex y bison
Flex y bison
 
Estructuras de los lenguajes de programacion
Estructuras de los lenguajes de programacionEstructuras de los lenguajes de programacion
Estructuras de los lenguajes de programacion
 
Analizador de una matriz utilizando compiladores
Analizador de una matriz utilizando compiladoresAnalizador de una matriz utilizando compiladores
Analizador de una matriz utilizando compiladores
 
Cap4
Cap4Cap4
Cap4
 
Elementos basicos c++
Elementos basicos c++Elementos basicos c++
Elementos basicos c++
 
Estructura de un compilador 2
Estructura de un compilador 2Estructura de un compilador 2
Estructura de un compilador 2
 
Sintaxis de lenguaje de programacion
Sintaxis de lenguaje de programacionSintaxis de lenguaje de programacion
Sintaxis de lenguaje de programacion
 
Ikgi
IkgiIkgi
Ikgi
 
Sintaxis del lenguaje c++
Sintaxis del lenguaje c++Sintaxis del lenguaje c++
Sintaxis del lenguaje c++
 
Unidad 3
Unidad 3Unidad 3
Unidad 3
 
Estructura sintactica de los lenguajes de programacion
Estructura sintactica de los lenguajes de programacionEstructura sintactica de los lenguajes de programacion
Estructura sintactica de los lenguajes de programacion
 
Flex bison
Flex bisonFlex bison
Flex bison
 
Fun consola guia_01
Fun consola guia_01Fun consola guia_01
Fun consola guia_01
 
Sintaxis en java
Sintaxis en javaSintaxis en java
Sintaxis en java
 
Estructura sintactica de los lenguajes de programacion
Estructura sintactica de los lenguajes de programacionEstructura sintactica de los lenguajes de programacion
Estructura sintactica de los lenguajes de programacion
 
Elementos basicos c
Elementos basicos cElementos basicos c
Elementos basicos c
 
Programacinenshell linux
Programacinenshell linuxProgramacinenshell linux
Programacinenshell linux
 
Manual Instalación JLex & CUP
Manual Instalación JLex & CUPManual Instalación JLex & CUP
Manual Instalación JLex & CUP
 
Complementos
ComplementosComplementos
Complementos
 
Estructura sintactica de los lenguajes de programacion y bases de datos
Estructura sintactica de los lenguajes de programacion y bases de datosEstructura sintactica de los lenguajes de programacion y bases de datos
Estructura sintactica de los lenguajes de programacion y bases de datos
 

Similar a Compilador Convertidor de Divisas

Compiladores informe final
Compiladores informe finalCompiladores informe final
Compiladores informe finalPriscila Morocho
 
Raúl A Gómez A -> Compilador Cambia de Color a una palabra ingresada
Raúl  A Gómez A -> Compilador Cambia de Color  a una palabra ingresadaRaúl  A Gómez A -> Compilador Cambia de Color  a una palabra ingresada
Raúl A Gómez A -> Compilador Cambia de Color a una palabra ingresadaRaul
 
Ejercicio compiladores
Ejercicio compiladoresEjercicio compiladores
Ejercicio compiladoresSheyli Patiño
 
Compilador concatenacion
Compilador concatenacionCompilador concatenacion
Compilador concatenacionjessy Cueva
 
Informe compilador divisor
Informe compilador divisorInforme compilador divisor
Informe compilador divisorSoraya Lara
 
Manual de Compiladores Léxico y Sintáctico.pdf
Manual de Compiladores Léxico y Sintáctico.pdfManual de Compiladores Léxico y Sintáctico.pdf
Manual de Compiladores Léxico y Sintáctico.pdfDavidErnestoT
 
Compilador sobre conversión de unidades
Compilador sobre conversión de unidadesCompilador sobre conversión de unidades
Compilador sobre conversión de unidadesDiego Guaman
 
Compilador para calcular el área de figuras Triangulo, Cuadrado y Rectángulo.
Compilador para calcular el área de figuras Triangulo, Cuadrado y Rectángulo.Compilador para calcular el área de figuras Triangulo, Cuadrado y Rectángulo.
Compilador para calcular el área de figuras Triangulo, Cuadrado y Rectángulo.Paola Morocho Arévalo
 
Cap3
Cap3Cap3
Cap3CJAO
 
Flex y Bison
Flex y BisonFlex y Bison
Flex y BisonGuiru Xd
 
Informe tecnico u4 final
Informe tecnico u4 finalInforme tecnico u4 final
Informe tecnico u4 finalIrving Che
 
Ensayo Compilador Suma y Resta
Ensayo Compilador Suma y RestaEnsayo Compilador Suma y Resta
Ensayo Compilador Suma y Restahepavien
 
OOP - Lab 1 - Variables y Asignacion.pdf
OOP - Lab 1 - Variables y Asignacion.pdfOOP - Lab 1 - Variables y Asignacion.pdf
OOP - Lab 1 - Variables y Asignacion.pdfMariaJose48908
 
Cap4 compiladores
Cap4 compiladoresCap4 compiladores
Cap4 compiladoresCJAO
 
Corporacion universitaria remington compiladores deisy
Corporacion universitaria remington compiladores deisyCorporacion universitaria remington compiladores deisy
Corporacion universitaria remington compiladores deisyDeisy Nereida Lozada Ortiz
 
La programación informática o programación algorítmica, acortada
La programación informática o programación algorítmica, acortadaLa programación informática o programación algorítmica, acortada
La programación informática o programación algorítmica, acortadaAeChm-MgMs-NnNm-OpSe
 

Similar a Compilador Convertidor de Divisas (20)

Compiladores informe final
Compiladores informe finalCompiladores informe final
Compiladores informe final
 
Raúl A Gómez A -> Compilador Cambia de Color a una palabra ingresada
Raúl  A Gómez A -> Compilador Cambia de Color  a una palabra ingresadaRaúl  A Gómez A -> Compilador Cambia de Color  a una palabra ingresada
Raúl A Gómez A -> Compilador Cambia de Color a una palabra ingresada
 
Ejercicio compiladores
Ejercicio compiladoresEjercicio compiladores
Ejercicio compiladores
 
Compilador concatenacion
Compilador concatenacionCompilador concatenacion
Compilador concatenacion
 
Informe compilador divisor
Informe compilador divisorInforme compilador divisor
Informe compilador divisor
 
Manual de Compiladores Léxico y Sintáctico.pdf
Manual de Compiladores Léxico y Sintáctico.pdfManual de Compiladores Léxico y Sintáctico.pdf
Manual de Compiladores Léxico y Sintáctico.pdf
 
Compilador sobre conversión de unidades
Compilador sobre conversión de unidadesCompilador sobre conversión de unidades
Compilador sobre conversión de unidades
 
Compilador para calcular el área de figuras Triangulo, Cuadrado y Rectángulo.
Compilador para calcular el área de figuras Triangulo, Cuadrado y Rectángulo.Compilador para calcular el área de figuras Triangulo, Cuadrado y Rectángulo.
Compilador para calcular el área de figuras Triangulo, Cuadrado y Rectángulo.
 
Cap3
Cap3Cap3
Cap3
 
Flex y Bison
Flex y BisonFlex y Bison
Flex y Bison
 
Informe tecnico u4 final
Informe tecnico u4 finalInforme tecnico u4 final
Informe tecnico u4 final
 
Ensayo Compilador Suma y Resta
Ensayo Compilador Suma y RestaEnsayo Compilador Suma y Resta
Ensayo Compilador Suma y Resta
 
OOP - Lab 1 - Variables y Asignacion.pdf
OOP - Lab 1 - Variables y Asignacion.pdfOOP - Lab 1 - Variables y Asignacion.pdf
OOP - Lab 1 - Variables y Asignacion.pdf
 
Introducción a Python
Introducción a PythonIntroducción a Python
Introducción a Python
 
Visual basic
Visual basicVisual basic
Visual basic
 
P01 secuencial
P01 secuencialP01 secuencial
P01 secuencial
 
Flex y Bison
Flex y BisonFlex y Bison
Flex y Bison
 
Cap4 compiladores
Cap4 compiladoresCap4 compiladores
Cap4 compiladores
 
Corporacion universitaria remington compiladores deisy
Corporacion universitaria remington compiladores deisyCorporacion universitaria remington compiladores deisy
Corporacion universitaria remington compiladores deisy
 
La programación informática o programación algorítmica, acortada
La programación informática o programación algorítmica, acortadaLa programación informática o programación algorítmica, acortada
La programación informática o programación algorítmica, acortada
 

Último

PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLO
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLOPARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLO
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLOSelenaCoronadoHuaman
 
Segmentacion Segmantica_Modelos UNET and DEEPLABV3
Segmentacion Segmantica_Modelos UNET and DEEPLABV3Segmentacion Segmantica_Modelos UNET and DEEPLABV3
Segmentacion Segmantica_Modelos UNET and DEEPLABV3AlexysCaytanoMelndez1
 
Introducción a Funciones LENGUAJE DART FLUTTER
Introducción a Funciones LENGUAJE DART FLUTTERIntroducción a Funciones LENGUAJE DART FLUTTER
Introducción a Funciones LENGUAJE DART FLUTTEREMMAFLORESCARMONA
 
Caso de éxito de Hervian con el ERP Sage 200
Caso de éxito de Hervian con el ERP Sage 200Caso de éxito de Hervian con el ERP Sage 200
Caso de éxito de Hervian con el ERP Sage 200Opentix
 
Unidad_3_T1_AutomatasFinitos presentacion
Unidad_3_T1_AutomatasFinitos presentacionUnidad_3_T1_AutomatasFinitos presentacion
Unidad_3_T1_AutomatasFinitos presentacionarmando_cardenas
 
Manual de Usuario APPs_AppInventor-2023.pdf
Manual de Usuario APPs_AppInventor-2023.pdfManual de Usuario APPs_AppInventor-2023.pdf
Manual de Usuario APPs_AppInventor-2023.pdfmasogeis
 
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...ITeC Instituto Tecnología Construcción
 

Último (7)

PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLO
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLOPARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLO
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLO
 
Segmentacion Segmantica_Modelos UNET and DEEPLABV3
Segmentacion Segmantica_Modelos UNET and DEEPLABV3Segmentacion Segmantica_Modelos UNET and DEEPLABV3
Segmentacion Segmantica_Modelos UNET and DEEPLABV3
 
Introducción a Funciones LENGUAJE DART FLUTTER
Introducción a Funciones LENGUAJE DART FLUTTERIntroducción a Funciones LENGUAJE DART FLUTTER
Introducción a Funciones LENGUAJE DART FLUTTER
 
Caso de éxito de Hervian con el ERP Sage 200
Caso de éxito de Hervian con el ERP Sage 200Caso de éxito de Hervian con el ERP Sage 200
Caso de éxito de Hervian con el ERP Sage 200
 
Unidad_3_T1_AutomatasFinitos presentacion
Unidad_3_T1_AutomatasFinitos presentacionUnidad_3_T1_AutomatasFinitos presentacion
Unidad_3_T1_AutomatasFinitos presentacion
 
Manual de Usuario APPs_AppInventor-2023.pdf
Manual de Usuario APPs_AppInventor-2023.pdfManual de Usuario APPs_AppInventor-2023.pdf
Manual de Usuario APPs_AppInventor-2023.pdf
 
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...
 

Compilador Convertidor de Divisas

  • 1. CIS-IXB-003 UNIVERSIDAD NACIONAL DE LOJA ´Area de la Energ´ıa las Industrias y los Recursos Naturales No Renovables Carrera de Ingenier´ıa en Sistemas Compiladores Convertidor de Divisas Tarea- Extra Clase Noveno B Autor: • Henry David Quishpe Docente: Ing. Henry-Paz, Loja-Ecuador 2015 1
  • 2. Contents A Problema 3 B Aut´omata del Compilador 3 1 An´alisis L´exico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1 .1 C´odigo de Usuario . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1 .2 Opciones y Declaraciones . . . . . . . . . . . . . . . . . . . . . . . . 4 1 .3 Reglas Lexicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2 An´alisis Sint´actico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2 .1 Importaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2 .2 Componentes de C´odigo de Usuario . . . . . . . . . . . . . . . . . . 7 2 .3 Declaraci´on de la lista de S´ımbolos de la Gram´atica . . . . . . . . . 11 2 .4 Predencia y Asociacion de los Terminales . . . . . . . . . . . . . . . 11 2 .5 Gram´atica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 C Resultados 13 D BIBLIOGRAFIA 16
  • 3. A Problema Para poder realizar el compilador hay que basarse en un lenguaje, para ello he cre´ıdo con- veniente crear mi propio lenguaje a partir de un alfabeto con el objetivo de crear palabras claves, identificadores, caracteres($, E, P y S) y n´umeros. Se har´a uso de la librer´ıa JFlex, ya que esta nos facilita la construcci´on del analizador l´exico, para la programaci´on del analizador sint´actico se utiliza la librer´ıa Cup, se har´a una integraci´on de las dos librer´ıas para la creaci´on del compilador. El compilador que se realiz´o es un convertidor de divisas, lo que se pretende es saber a qu´e valor equivale una divisa conocida a otra desconocida, para ello este compilador tiene una entrada en donde se debe especificar el valor y las 2 divisas respectivamente para finalizar una l´ınea se tendr´a que poner un ; hay que recalcar que las divisas aceptadas son Dolar ($), Peso Mexicano (P), Sol Peruano (S) y Euro (E). A futuro se puede adicionar divisas m´as conocidas para tener un compilador m´as completo. El compilador se lo realiz´o en 2 etapas las cuales son: 1) An´alisis L´exico 2) An´alisis Sint´actico B Aut´omata del Compilador Para la creaci´on del aut´omata se har´a uso de la herramienta JFlap, la misma que cuenta con una interfaz de f´acil uso para la creaci´on de aut´omatas y para hacer pruebas de funcionamiento y otras funciones mas de importante uso. Figure 1: Aut´omata del Compilador Conversor de Divisas 3
  • 4. 1 An´alisis L´exico El Analizador l´exico lee una secuencia de caracteres de izquierda a derecha del programa fuente y agrupa las secuencias de caracteres en unidades con significado propio (compo- nentes l´exicos). Las palabras claves, identificadores, operadores, constantes num´ericas, signos de puntuaci´on como separadores de sentencias, llaves, par´entesis, etc. El analizador l´exico de este compilador se encuentra divido en 3 secciones: 1 .1 C´odigo de Usuario En la primera secci´on se realiza lo que es el c´odigo de usuario, aqu´ı es donde se especifica el paquete al cual va a pertenecer el archivo java e importaciones de algunas librer´ıas que se van a necesitar. A continuaci´on se explica cada linea de codigo del archivo .flex: En la siguiente linea se especifica el paquete al cual la clase va a pertenecer. /** * Especificacion del paquete */ package analizador; Se importa toda la librer´ıa cup de la clase runtime. /** * Libreria Cup */ import java_cup.runtime.*; Para separar cada secci´on del archivo l´exico o para indicar el inicio se lo har´a con el s´ımbolo %%. 1 .2 Opciones y Declaraciones En la siguiente l´ınea se especifica el nombre de la clase java que se crea cuando se ejecute el archivo .flex. /** * nombre de la clase */ %class AnalizadorLexico A continuaci´on se activa el contador de linea y columnas con los comandos %line y %col- umn respectivamente. // activar el contador de lineas, variable yyline %line // activar el contador de columnas, variable yycolumn %column 4
  • 5. Con el comando %cup se activa la compatibilidad con java cup para los analizadores sint´acticos (parser). // activar la compatibilidad con java cup %cup Se crea un m´etodo de tipo Symbol para guardar el tipo de token encontrado, para lo cual recibe como par´ametros un entero, este m´etodo nos retorna un Symbol con el tipo, la linea y la columna. private Symbol symbol(int type){ return new Symbol(type, yyline, yycolumn); } Se crea un m´etodo de tipo Symbol para guardar el tipo de token encontrado junto con su valor, para lo cual recibe como par´ametros un entero y Objeto el cual va a ser el valor, este m´etodo nos retorna un Symbol con el tipo, la linea, la columna y el valor correspondiente. private Symbol symbol(int type, Object value){ return new Symbol(type, yyline, yycolumn, value); } En esta parte se realizan las declaraciones de las expresiones regulares, las mismas que ser´an utilizadas en las reglas l´exicas. En la siguiente l´ınea de c´odigo declaramos la variable Salto a la cual le asignamos un retorno de carro o un salto de l´ınea o ambos a la vez. // un salto de linea es un n, r o rn Salto = r|n|rn Creamos la variable Espacio a la cual le asignamos la variable Salto declarada anterior- mente o le asignamos un espacio en blanco, tabulador o avance de p´agina. // Espacio en blanco, tabulador t avance de pagina f Espacio = {Salto}| [ tf] Declaramos la variable Entero a la cual le asignamos uno o varios n´umeros de del 0 al 9 seguido de un punto y repetimos la primera parte, lo cual nos genera en si un n´umero decimal como por ejemplo 10.23. // numero decimal Entero = [0-9]+ . [0-9]+ 1 .3 Reglas Lexicas Esta secci´on contiene expresiones regulares y acciones, las acciones son c´odigo en java que se ejecuta cuando se encuentre una entrada v´alida para la expresi´on regular correspondi- ente. YYINITIAL es el estado inicial del analizador l´exico al escanear. Las expresiones regulares s´olo ser´an comparadas si se encuentra en ese estado inicial. Es decir, cada vez que se encuentra una coincidencia el scanner vuelve al estado inicial. Por lo cual se ignoran estados intermedios. 5
  • 6. // Estado inicial del analizador lexico <YYINITIAL> {} El c´odigo siguiente debe estar dentro de YYINITIAL para que una vez encontrada una entrada v´alida se vuelva analizar desde el inicio, es decir ignorando las siguientes expresiones regulares. Cuando se encuentra el ; en la entrada se regresa el token FINLINEA el cual est´a declarado en la clase sym. // Regresa el token FINLINEA declarado en la clase sym ";" {return symbol(sym.FINLINEA);} Al igual cuando se encuentre el s´ımbolo de D´olar $ en la cadena de entrada se retornar´a el token D´OLAR. // Regresa el token $ DOLAR declarado en la clase sym "$" {return symbol(sym.DOLAR);} Cuando se encuentra la E nos retorna el token Euro. // Regresa el token EURO declarado en la clase sym "E" {return symbol(sym.EURO);} Tambi´en si se encuentra la P nos retorna el token Peso. // Regresa el token PESO declarado en la clase sym "P" {return symbol(sym.PESO);} Y as´ı mismo con S se retorna el token Sol. // Regresa el token SOL declarado en la clase sym "S" {return symbol(sym.SOL);} La siguiente expresi´on indica que cuando se encuentre un n´umero Decimal, se retorna el token VALOR y el valor. // Regresa el token VALOR declarado en la clase sym {Entero}+ { return symbol(sym.VALOR, new Double(yytext()));} La siguiente expresi´on regular es para ignorar la variable Espacio, la misma que est´a compuesta por un tabulador, salto de p´agina, retorno de carro, avance de p´agina o un espacio en blanco. {Espacio} {/* ignora el espacio */ } Dentro del mismo m´etodo YYINITIAL especificamos una l´ınea para que nos imprima un error con el valor, la l´ınea y columna, este error se presenta cuando se encuentre en la entrada un car´acter que no est´e declarado en el m´etodo YYINITIAL. . {System.out.println("Caracter Ilegal <" + yytext() + ">, En la linea: "+ (yyline+1) + " Y en la columna: " + (yycolumn+1)) ;} 6
  • 7. 2 An´alisis Sint´actico El An´alisis sint´actico determina si la secuencia de componentes l´exicos sigue la sintaxis del lenguaje y obtiene la estructura jer´arquica del programa en forma de ´arbol. El archivo .cup esta compuesto por 5 secciones las cuales se explican a continuacion: 2 .1 Importaciones En la primera secci´on se realiza lo que son las declaraciones de package donde se especifica el paquete al cual va a pertenecer el archivo java e importaciones de algunas librer´ıas que se van a necesitar. En la siguiente linea se especifica el paquete al cual la clase va a pertenecer. /** * Especificacion del paquete */ package analizador; Se importa toda la librer´ıa cup de la clase runtime. /** * Libreria Cup */ import java_cup.runtime.*; Tambi´en se importa la librer´ıa Reader, esta se utiliza para poder leer un archivo .txt el cual ser´a nuestra entrada. /** * Libreria Filereader */ import java.io.FileReader; 2 .2 Componentes de C´odigo de Usuario Creamos un m´etodo para reportar los errores el mismo que recibe dos par´ametros un mensaje de tipo String y una informaci´on (Symbol) de tipo Object. public void report_error(String message, Object info) { } En la siguiente l´ınea creamos una variable m de tipo StringBuffer a la cual le asignamos la cadena Error, esta variable es la que se le va adicionar la l´ınea y columna en donde se encuentra el error. StringBuffer m = new StringBuffer("Error"); Mediante un if comprobamos que la informaci´on que recibimos sea un instancia de la clase Symbol. 7
  • 8. if(info instanceof java_cup.runtime.Symbol) { } Creamos el objeto s al cual le asignamos la informaci´on recibida, aqu´ı se guardar´a el valor entero asignado en la clase sym. java_cup.runtime.Symbol s=((java_cup.runtime.Symbol)info); A continuaci´on con el if comprobamos que la l´ınea sea mayor o igual a cero. if(s.left >= 0) { } Si la condici´on anterior se cumple a la variable m declarada anteriormente le asignamos la cadena “En la linea ” mas el numero de linea aumentado en 1, ya que se empieza a contar desde cero. m.append(" En la linea....."+(s.left+1)); Utilizamos otro if dentro del if anterior pero en este caso para comprobar que la columna sea mayor o igual a cero. if (s.right >= 0){ } Si la condici´on llegase a cumplirse le a˜nadimos a la variable m la cadena “y en la columna” m´as el n´umero de columna aumenta en uno por la misma raz´on del conteo de l´ıneas. m.append(", y en la columna...... "+(s.right+1)); En este compilador le hemos a˜nadido algo adicional, esto es el control de errores, es decir identificar porque se ha producido el error e informar al usuario. Para esto utilizamos la variable s que es de tipo Symbol declarada anteriormente, para obtener el valor entero del token utilizamos el sym, el cual nos regresa el valor un valor entero, con esto comprobamos con los valores de cada uno de los valores de los tokens de la clase sym. Entonces mediante un if comprobamos la igualdad, cuando el valor entero sea igual a cero le asignamos a la variable mensaje que recibimos como par´ametro la cadena “Falta un ;”. if (s.sym == 0){ message = "Falta ; o la expresion esta inncompleta"; } En caso de no cumplirse la condici´on anterior comprobamos si existe una igualdad entre 5, 3, 6, o 4. if (s.sym == 5 || s.sym == 3 || s.sym == 6 || s.sym == 4){ } Para saber si el error es de un ; comprobamos si la columna es igual a cero y la l´ınea es igual o mayor a 1, esto es porque en el compilador se ignora el salto de l´ınea. En caso de que se cumpla la condici´on a la variable mensaje le asignamos “Falta un ; en la expresi´on”. 8
  • 9. if(s.right == 0 && s.left >= 1){ message = "Falta un ; en la expresion"; } Si no se cumple entonces le asignamos a mensaje “El valor de la divisa es incorrecto”. else { message = "El valor de la divisa es incorrecto "; } En caso de no cumplirse la condici´on que comprobamos con 5, 3, 6 o 4 pasamos a compro- bar si el valor entero es igual a 2 o igual 7. En caso de cumplirse le asignamos a mensaje la cadena “Usted debe ingresar una divisa puede ser ($, P, S o E)”. else if(s.sym == 2 || s.sym ==7){ message = "Usted dede ingresar una divisa"; } Para terminar con el m´etodo para reportar los errores a la variable m le asignamos la cadena “:” m´as el mensaje recibido como par´ametro y modificado en caso que haya entrado en alguna condici´on anteriormente. m.append(" : "+message); Y por ´ultimo imprimimos los errores que se llegasen a encontrar. System.err.println(m); Para poder hacer la conversi´on de divisas creamos un m´etodo el cual recibe tres par´ametros la primera divisa de tipo String, la segunda divisa la cual es a la que se va a convertir igual de tipo String y por ´ultimo el valor de tipo double. public void conversion(String a, String b, double n){ } Dentro del m´etodo creamos una variable de tipo double en la cual se va almacenar la equivalencia de cada moneda con respecto a la otra. double equivalencia=0; Mediante un if comprobamos la primera divisa. En caso de que sea igual a $ se comprueba la segunda divisa. Si la segunda divisa es igual a $ a la variable equivalencia le asignamos 1.00 Si no se cumple comprobamos si es igual a P (Pesos) y a la variable equivalencia le asignamos 14.66, si no se cumple comprobamos si es igual E (Euros) y a la variable equivalencia le asignamos 0.846645, si no se cumple comprobamos si es igual a S (Soles) y a la variable equivalencia le asignamos 2.98170. Continuamos con el primer if pero en esta ocasi´on comprobamos la primera divisa con E (Euros). Si la primera divisa es igual a E comprobamos la si la segunda divisa es igual a $ D´olar) y 9
  • 10. a la variable equivalencia le asignamos 1.18113, si no se cumple comprobamos si es igual a P (Peso) y a la variable equivalencia le asignamos 17.20, si no se cumple comprobamos si es igual a E (Euro) y a la variable equivalencia le asignamos 1.00, si no se cumple comprobamos si es igual a S (Soles) y a la variable equivalencia le asignamos 3.52. En caso de que la primera divisa no sea igual E comprobamos con P. Si la primera divisa es igual a P entonces comprobamos si la segunda divisa es igual a $ y a la variable equivalencia le asignamos 0.068, si no se cumple comprobamos si es igual a P (Peso) y a la variable equivalencia le asignamos 1.00, si no se cumple comprobamos si es igual a E (Euro) y a la variable equivalencia le asignamos 0.5813, si no se cumple comprobamos si es igual a S (Sol) y a la variable equivalencia le asignamos 0.20332. Y por ´ultimo si la primera divisa no es igual a P comprobamos con S (Soles) En caso de que la primera divisa sea igual a S, empezamos a comprobar si la segunda divisa es igual a $ y si lo es le asignamos a la variable equivalencia 0.34, si no se cumple comprobamos si es igual a P (Peso) y a la variable equivalencia le asignamos 4.92 Si no se cumple comprobamos si es igual a E (Euro) y a la variable equivalencia le asignamos 0.285, si no se cumple comprobamos si es igual a S (Sol) y a la variable equivalencia le asignamos 1.00. if (a=="$"){ System.out.print("Dolares"); if (b=="$"){equivalencia=1.00;} else if (b=="P"){equivalencia=14.66;} else if (b=="E"){equivalencia=0.846645;} else if (b=="S"){equivalencia= 2.98170;} } else if (a=="E"){ System.out.print("Euros"); if (b=="$"){equivalencia=1.18113;} else if (b=="P"){equivalencia=17.20;} else if (b=="E"){equivalencia=1.00;} else if (b=="S"){equivalencia=3.52;} } else if (a=="P"){ System.out.print("Pesos"); if (b=="$"){equivalencia=0.068;} else if (b=="P"){equivalencia=1.00;} else if (b=="E"){equivalencia=0.05813;} else if (b=="S"){equivalencia=0.20332;} } else if (a=="S"){ System.out.print("Soles"); if (b=="$"){equivalencia=0.34 ;} else if (b=="P"){equivalencia=4.92;} else if (b=="E"){equivalencia=0.285;} else if (b=="S"){equivalencia=1.00;} } 10
  • 11. Al final del m´etodo convertir se imprime los resultados. System.out.print(" Son ======> "+ n*equivalencia + " "); Para la ejecuci´on del compilador creamos el m´etodo main en el cual debemos crear un objeto de la misma clase y creamos un variable resultado a la cual le asignamos el m´etodo parse al cual se puede llamar con el objeto creado anteriormente. public static void main(String[] argumento){ try { AnalizadorSintactico asin = new AnalizadorSintactico( new AnalizadorLexico(new FileReader(argumento[0]))); Object resultado = asin.parse().value; } catch (Exception ex){ ex.printStackTrace(); } } 2 .3 Declaraci´on de la lista de S´ımbolos de la Gram´atica A continuaci´on declaramos los s´ımbolos terminales y no terminales. Los terminales son los tokens obtenidos por el analizador l´exico. Primero se declaran los terminales que no tienen un valor. terminal FINLINEA, DOLAR, PESO, SOL, EURO; Luego se declaran los terminales los cuales tienen un valor en este caso entero. terminal Double VALOR; Tambi´en se declaran los no terminales los cuales van a ser usados en la secci´on de la gram´atica. En nuestro caso declaramos no terminales de tipo Object, ya que este nos indica que no tienen tipo, es decir pueden ser entero o String. non terminal Object programa, linea, divisa; 2 .4 Predencia y Asociacion de los Terminales La precedencia de los no terminales, no sirve con s´ımbolos terminales es por eso que no la usamos. Adem´as indica si se asocia a izquierda o derecha. 2 .5 Gram´atica Por ´ultimo realizamos la gram´atica de nuestro analizador la cual puede contener tanto un terminal con un no terminal. La expresi´on programa es la ra´ız de la gram´atica esta puede ser una expresi´on programa seguida de una expresi´on l´ınea o puede ser una l´ınea. programa ::= programa linea | linea; 11
  • 12. La expresi´on l´ınea se compone de una expresi´on medida seguida del terminal VALOR otra vez la expresi´on medida por ´ultimo el terminal FINLINEA, de esa forma se realiza la conversi´on de la divisas para ello llamamos al m´etodo convertir usando el parser y le enviamos las 2 divisas y el valor. Tambi´en utilizamos el token error de la clase sym para llamar al m´etodo de reporte de errores. linea ::= error {:parser.report_error("Revise la sintaxis",null);:}| divisa:m1 VALOR:n divisa:m2 FINLINEA { parser.conversion(m1.toString(),m2.toString(),n); System.out.println(m2); :}; La expresi´on medida esta compuesta por el terminal D´OLAR en RESULT se almacena el valor de las acciones. O puede estar compuesta por el terminal PESO de igual manera en RESULT se almacena el valor de la acciones, tambi´en puede estar compuesta por EURO o SOL. divisa ::= DOLAR {: RESULT="$"; :} | PESO {: RESULT="P"; :} | SOL {: RESULT="S"; :} | EURO {: RESULT="E"; :}; 12
  • 13. C Resultados A continuaci´on se ilustra los resultados obtenidos del compilador, para ello ejecutamos la clase Ejecutor.java, esta clase necesita un archivo txt el cual es nuestra entrada. Figure 2: Valores de Entrada Si nuestros valores de entrada son los de la figura 2 al compilar la clase Ejecutor obten- dremos los siguientes resultados: Figure 3: Resultado del Compilador Si ingresamos un car´acter que no este declarado en las reglas l´exicas del archivo analizador l´exico como por ejemplo: Figure 4: Entrada con caracter erroneo 13
  • 14. Con la entrada de la figura 4 el compilador nos indica el error junto conl car´acter, la linea y columna en la que se encuentra, el compilador ignora este car´acter para seguir compilando, como lo podemos ver en la figura 5. Figure 5: Resultado de Error L´exico Adem´as se controlan los errores sint´acticos, se indica de porque el error y en donde se encuentra. Figure 6: Entrada con errores sint´acticos Cuando se tenga la entrada de la figura 6 el compilador nos informar´a que existe un error el mismo que se especifica el porqu´e del error junto con la l´ınea y columna. Figure 7: Errores de Sintaxis 14
  • 15. Cuando no se ingrese el ; que en nuestro compilador es el fin de l´ınea el compilador nos informa del error inmediatamente. Figure 8: Entrada Sin Fin de Linea de Sintaxis Si no se ha ingresado el ; y al ejecutar nuestro compilador este nos devolver´a lo siguiente: Figure 9: Error de Sintaxis ; 15
  • 16. D BIBLIOGRAFIA References [1] L.C. Kenneth. Construcci´on de Compiladores. Principios y pr´actica. M´exico: Thom- son editores, 2004. pp. 31. [2] A.V. Aho, R. Sethi y J.D. Ullman. Compiladores: Principios, t´ecnicas y herramientas. Wilmington, Delaware: Addison- Wesley Iberoamericana S. A., 1990. pp. 1 - 5. [3] Gloria In´es Alvarez V. Compiladores: An´alisis Sint´actico, 2008 En l´ınea. Disponible en: http://cic.javerianacali.edu.co/wiki/lib/exe/fetch.php?media=materias [4] Enlace para descargar el codigo del compilador. Disponible en: https://code. google.com/p/compiladores-h/ 16