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.
[Link]
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.
[Link]
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
[Link] que podrás descargar de la página web de Jlex.
[Link]
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 [Link]
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 [Link] [Link]
donde [Link] 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 [Link]
donde [Link] 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 “[Link]” Archivo “[Link]”
import java_cup.runtime.*;
import java_cup.[Link]; action code {:
%% /*CODIGO DE JAVA*/
%cup
:}
%%
";" { //RECONOCE EL SIMBOLO PUNTO Y COMA parser code {:
return new Symbol([Link]); } public static void main(String args[]) throws Exception {
"+" { [Link]("SIGNO DE SUMA ");//RECONOCE EL new parser(new Yylex([Link])).parse();
SIMBOLO MAS }
return new Symbol([Link]); } :}
"*" { [Link]("SIGNO POR ");//RECONOCE EL
terminal SEMI, PLUS, TIMES, LPAREN, RPAREN;
SIMBOLO POR
return new Symbol([Link]); } terminal Integer NUMBER;
"-" { [Link]("SIGNO MENOS ");//RECONOCE EL non terminal expr_list, expr_part;
SIMBOLO MENOS non terminal Integer expr;
return new Symbol([Link]); } precedence left PLUS;
"/" { [Link]("SIGNO DIVIDIDO ");//RECONOCE EL precedence left TIMES;
SIMBOLO DIVIDIDO
expr_list ::= expr_list expr_part | expr_part;
return new Symbol([Link]); }
expr_part ::= expr:e {: [Link](" = "+e+";"); :} SEMI;
"(" { return new Symbol([Link]); } //RECONOCE EL
PARENTESIS DE APERTURA expr ::= NUMBER:n
")" { return new Symbol([Link]); }//RECONOCE EL {: RESULT=n; :}
SIMBOLO PARENTESIS DE CIERRE | expr:l PLUS expr:r
[0-9]+ { [Link](" numero ");//RECONOCE LOS {: RESULT=new Integer([Link]() + [Link]()); :}
NUMEROS
| expr:l TIMES expr:r
return new Symbol([Link], new
{: RESULT=new Integer([Link]() * [Link]()); :}
Integer(yytext())); }
[ \t\r\n\f] { /* ignore white space. */ } | LPAREN expr:e RPAREN
. { [Link]("Illegal character: "+yytext()); } {: RESULT=e; :}
Manual de Instalacion : JLex y Cup
;
Page 15
Usando JLex y Cup : Expresiones Aritméticas (2)
El archivo “[Link]”
El import java_cup.[Link] 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 [Link] 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([Link]); 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([Link], 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.
. { [Link]("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 “[Link]”
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 [Link] [Link]
java java_cup.Main [Link]
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 . [Link] [Link] [Link]
Por medio de un archivo de texto tenemos que escribir lo siguiente
java [Link] 0<D:\\[Link]
Y sí en nuestro archivo de entrada D:\\[Link] tenemos lo siguiente
5+2*3;
5+4+3;
Y la salida es:
Manual de Instalacion : JLex y Cup
Page 19