Вы находитесь на странице: 1из 19

JLex y Cup

Manual de Instalación

200512108
Fredy Josue Romero Musul
USAC – Facultad de Ingeniería
Organización de lenguajes y compiladores 1 – Sección C
¿Qué es Jlex?

 Jlex es una herramienta desarrollada en Java que usaremos para realizar


el analizador léxico de nuestro compilador.

 http://www.cs.princeton.edu/~appel/modern/java/JLex/

Manual de Instalacion : JLex y Cup 


Page 2
Requisitos minimos : Java

 Lo primero que debemos instalar es el JDK (no basta con el JRE), que es
el entorno necesario para compilar y ejecutar clases Java.

 El SDK para J2SE (Java 2 Standard Edition) podrás descargarse de la


página web de Sun.

 http://java.sun.com/j2se/1.6.9/download.html

Manual de Instalacion : JLex y Cup 


Page 3
Instalando Jlex (1)

 Para empezar se debe crear un directorio nuevo (lo nombraremos “jdir”) que esté
en tu CLASSPATH (también puedes usar un directorio que ya exista).
 Sino existe en el CLASSPATH, se debe agregar.
 Crea un directorio llamado jdir/JLex (o jdir\JLex en Windows), y copia en el fichero
Main.java que podrás descargar de la página web de Jlex.
 http://www.cs.princeton.edu/~appel/modern/java/JLex/

Manual de Instalacion : JLex y Cup 


Page 4
Manual de Instalacion : JLex y Cup 
Page 5
Instalando Jlex (2)

 Dentro de la carpe “Jlex”, se debe compilar el fichero Java con el


siguiente comando:
javac Main.java

Manual de Instalacion : JLex y Cup 


Page 6
Manual de Instalacion : JLex y Cup 
Page 7 Así queda el directorio “Jlex”, después de la compilación.
Instalando Jlex (3)

 Se habrán creado las clases Java que componen la distribución de Jlex .


 Ahora ya podrás usar el Jlex mediante este comando:
java Jlex.Main fichero.jlex
donde fichero.jlex es el nombre del fichero con la especificación del
análisis sintáctico para tu lenguaje.

Manual de Instalacion : JLex y Cup 


Page 8
¿Qué es Cup?

 CUP es la herramienta que usaremos para generar el analizador


sintáctico de nuestro lenguaje.

Manual de Instalacion : JLex y Cup 


Page 9
Instalando Cup (1)

 Descarga el código fuente de CUP desde su página web a un directorio


de tu sistema que esté en el CLASSPATH.
 Aquí se usara la misma carperta: “jdir”
 Descomprime el paquete una vez lo hayas descargado.

Manual de Instalacion : JLex y Cup 


Page 10
Descomprimir

Manual de Instalacion : JLex y Cup 


Page 11
Instalando Cup (2)

 Ahora compilaremos el código fuente de CUP.


 Para ello, desde el directorio donde descargamos la distribución, ejecutaremos el
siguiente comando:
javac java_cup/*.java java_cup/runtime/*.java
 Ahora podrás ejecutar CUP mediante el siguiente comando:
java java_cup.Main fichero.cup
donde fichero.cup es el fichero con la especificación del analizador sintáctico de
nuestro lenguaje.
 Y ya está hecho!!
Manual de Instalacion : JLex y Cup 
Page 12
USANDO
Jlex y Cup
por primera vez:

Una calculadora sencilla

Manual de Instalacion : JLex y Cup 


Page 13
Usando JLex y Cup : Expresiones Aritméticas (1)

 Crearemos un carpeta para nuestro proyecto (en esta caso la


llamaremos “EJEMPLO” en la cual crearemos los archivos .lex y .cup

Manual de Instalacion : JLex y Cup 


Page 14
Usando JLex y Cup : Expresiones Aritméticas (1)

Archivo “analex.jlex” Archivo “parser.cup”


import java_cup.runtime.*;
import java_cup.runtime.Symbol; action code {:
%% /*CODIGO DE JAVA*/
%cup
:}
%%
";" { //RECONOCE EL SIMBOLO PUNTO Y COMA parser code {:
return new Symbol(sym.SEMI); } public static void main(String args[]) throws Exception {
"+" { System.out.print("SIGNO DE SUMA ");//RECONOCE EL new parser(new Yylex(System.in)).parse();
SIMBOLO MAS }
return new Symbol(sym.PLUS); } :}
"*" { System.out.print("SIGNO POR ");//RECONOCE EL
terminal SEMI, PLUS, TIMES, LPAREN, RPAREN;
SIMBOLO POR
return new Symbol(sym.TIMES); } terminal Integer NUMBER;
"-" { System.out.print("SIGNO MENOS ");//RECONOCE EL non terminal expr_list, expr_part;
SIMBOLO MENOS non terminal Integer expr;
return new Symbol(sym.MENOS); } precedence left PLUS;
"/" { System.out.print("SIGNO DIVIDIDO ");//RECONOCE EL precedence left TIMES;
SIMBOLO DIVIDIDO
expr_list ::= expr_list expr_part | expr_part;
return new Symbol(sym.DIVI); }
expr_part ::= expr:e {: System.out.println(" = "+e+";"); :} SEMI;
"(" { return new Symbol(sym.LPAREN); } //RECONOCE EL
PARENTESIS DE APERTURA expr ::= NUMBER:n
")" { return new Symbol(sym.RPAREN); }//RECONOCE EL {: RESULT=n; :}
SIMBOLO PARENTESIS DE CIERRE | expr:l PLUS expr:r
[0-9]+ { System.out.print(" numero ");//RECONOCE LOS {: RESULT=new Integer(l.intValue() + r.intValue()); :}
NUMEROS
| expr:l TIMES expr:r
return new Symbol(sym.NUMBER, new
{: RESULT=new Integer(l.intValue() * r.intValue()); :}
Integer(yytext())); }
[ \t\r\n\f] { /* ignore white space. */ } | LPAREN expr:e RPAREN
. { System.err.println("Illegal character: "+yytext()); } {: RESULT=e; :}
Manual de Instalacion : JLex y Cup 
;
Page 15
Usando JLex y Cup : Expresiones Aritméticas (2)

El archivo “analex.jlex”
 El import java_cup.runtime.Symbol se utiliza para importar los símbolos que se declararán
en CUP, por tanto, cuando compilemos este archivo debemos tener el archivo de CUP ya
creado también. Los signos como punto y coma, mas, menos, por, dividido, paréntesis;son
los signos que la gramática reconocerá; el System.out.print lo escribimos para quecuando
los encuentre nos muestre en la consola la palabra que tenemos escrita entrecomillas,
como en el caso de suma nos desplegará en pantalla "SIGNO DE SUMA", y el nombre con
el que lo guardará es con PLUS, que es para lo que se utiliza la instrucción return new
symbol(sym.PLUS); es decir, esta instrucción agrega a la tabla de símbolos el signo mas
con el nombre de PLUS, en el caso de los números podemos observar que tenemos la
siguiente instrucción return new Symbol(sym.NUMBER, new Integer(yytext())); que nos
permitirá utilizar los números como texto, no solo como símbolos, por esto podemos utilizar
ciertos atributos que nos permitirán manipularlos de cierta manera.
 El código [\t\r\n\f] { /* ignore white space. */ } lo utilizamos para que ignore espacios en
blanco, cambios de línea, tabulaciones, etc.
 . { System.err.println("Illegal character: "+yytext()); } este código lo utilizamos en el caso
que no encuentre el carácter que le decimos como cadena de entrada nos indique que hay
un error, y pueda continuar con el análisis recuperando errores.

Manual de Instalacion : JLex y Cup 


Page 16
Usando JLex y Cup : Expresiones Aritméticas (3)

El archivo “parser.cup”

 Primero se importa la librería runtime de la carpeta de java_cup; en esta


sección podemos colocar las librerías que necesitamos para poder
compilar código de java; ya que en action code, podemos escribir código
de java que necesitemos utilizar en nuestra acciones de la gramática.
Donde se encuentran definidos los terminales, podemos ver que son los
que definimos como símbolos en el archivo de Jlex, solo el Número que
está declarado de tipo Integer para poder utilizarlo con los atributos de un
número. En el caso que fuera una cadena, debemos declararlo de tipo
String.

 Los no terminales son los que utilizaremos en la gramática. Y después


podemos declarar la precedencia si es necesario.

Manual de Instalacion : JLex y Cup 


Page 17
Usando JLex y Cup : Expresiones Aritméticas (4)

 Ahora compilemos con los comandos:


java JLex.Main analex.lex
java java_cup.Main parser.cup

Manual de Instalacion : JLex y Cup 


Page 18
Usando JLex y Cup : Expresiones Aritméticas (5)

 Los archivos generados se compilan con el comando


javac -d . parser.java sym.java analex.lex.java

 Por medio de un archivo de texto tenemos que escribir lo siguiente


java Example.parser 0<D:\\operar.txt
 Y sí en nuestro archivo de entrada D:\\operar.txt tenemos lo siguiente
5+2*3;
5+4+3;
 Y la salida es:

Manual de Instalacion : JLex y Cup 


Page 19