instalación jlex & cup

22
Guía de Instalación y Ejemplos USAC Facultad de Ingeniería Manuel Elias Muhún Esquit 200018480

Upload: memees

Post on 07-Jun-2015

6.580 views

Category:

Documents


0 download

DESCRIPTION

Paso para instalar JLex & Cup en Windows

TRANSCRIPT

Page 1: Instalación JLex & CUP

Guía de Instalación y Ejemplos

USACFacultad de IngenieríaManuel Elias Muhún Esquit200018480

Page 2: Instalación JLex & CUP

Jlex es una herramienta desarrollada en Java el cual puede recibir un archivo de entrada (archivo .lex) dentro del cual se declaran expresiones regulares y tokens válidos para un lenguaje que deseamos reconocer. Dicho de otro modo Jlex es una herramienta para generar analizadores léxicos.

CUP es un generador de parsers para gramáticas tipo LALR(1), dentro del código del archivo de entrada (archivo .cup) deben existir declaraciones de producciones y asociación de fragmentos de código Java. Cuando una producción es reconocida, se genera un archivo fuente Java, parser.java que contiene una clase parser, con un método Symbol parser(), el cual es utilizado para analizar un archivo de entrada que contiene instrucciones validas para el lenguaje que hemos creado con Jlex & CUP.

Las extensiones de archivos de entrada pueden ser de cualquier tipo, al final y al cabo son archivos planos.

Page 3: Instalación JLex & CUP

1. Instalación del JDK de Java (entorno necesario para compilar y ejecutar clases java) y modificación del CLASSPATH

2. Descarga e instalación de Jlex3. Descarga e instalación de CUP4. Ejemplo5. Funcionamiento

Page 4: Instalación JLex & CUP

Para poder utilizar Jlex & CUP uno de los primeros pasos requeridos es la instalación del JDK, el cual es el entorno necesario para compilar y ejecutar clases Java.

El instalador del JDK se puede descargar desde la página de SUN (http://java.sun.com/j2se/1.4.2/download.html).

El procedimiento para instalar el JDK en el entorno Windows es el tradicional doble clic sobre el archivo ejecutable y luego el botón siguiente hasta llegar al final de la instalación.

Para este ejemplo nos hemos descargado el jdk1.6.0, sin realizar modificaciones a la carpeta de instalación que aparece por default aunque es posible instalarla en cualquier ubicación de nuestro disco duro.

Page 5: Instalación JLex & CUP

Clic derecho sobre My Computer (Mi PC), escoger Properties (Propiedades) y luego en System Properties (Propiedades del Sistema) se debe escoger la pestaña Advanced.

Presionare el botón Environment Varialbes (Variables de Entorno)

Page 6: Instalación JLex & CUP

Nos posicionamos sobre la variable de entorno CLASSPATH, y presionamos el botón Edit (Editar).

Si la variable de entorno no existe, entonces debe ser creada presionando el botón New (Nuevo) y agregar los datos correspondientes.

Page 7: Instalación JLex & CUP

Nos ubicamos al final de la cadena dentro de Variable Value (Valor de la Variable) y agregamos punto y coma, seguido del Path de ubicación de la carpeta bin de la instalación del JDK, en ejemplo se agrega la cadena: “;C:\Program Files\Java\jdk1.6.0\bin” sin las comillas.

Presionamos el botón Ok y agregamos la misma cadena a la variable Path.

Page 8: Instalación JLex & CUP

Realizamos los pasos anteriores para agregar la cadena “;C:\Program Files\Java\jdk1.6.0\bin” a la variable Path. Si la variable Path no existe debe ser creada utilizando el botón New (Nuevo) e ingresar los datos.

Después de las anteriores modificaciones al CLASSPATH y al Path ya podemos utilizar los comandos de Java (java, javac, appletviewer, jar, etc.) desde cualquier carpeta dentro de nuestro disco duro.

Page 9: Instalación JLex & CUP

Jlex es una herramienta creada en y para el lenguaje Java que sirve para crear analizadores léxicos, a continuación describimos los pasos de su instalación:

1.Descargar el archivo de instalación de Jlex (http://www.cs.princeton.edu/~appel/modern/java/JLex/), el cual consiste en un archivo java (Main.java).2.Ubicar el Main.java en cualquier carpeta de nuestro disco duro, en este caso creamos la carpeta jlex dentro del bin del JDK: C:\Program Files\Java\jdk1.6.0\bin\jlex.3.Abrimos una ventana del D.O.S. dentro de la carpeta jlex y compilamos el Main.java con la instrucción: javac Main.java, después de lo cual podemos ver los archivos .class creados dentro de la carpeta jlex.

Page 10: Instalación JLex & CUP

C:\Program Files\Java\jdk1.6.0\bin\jlex>javac Main.java

Page 11: Instalación JLex & CUP

Como se hiso mención en la intro CUP es un generador de parsers, a continuación describimos los paso para su instalación.

1.Descargar el archivo de instalación de CUP (http://www.cs.princeton.edu/~appel/modern/java/CUP/), el cual consiste en un archivo .zip.2.Descomprimimos el archivo y podemos ver varios archivos y carpetas. La carpeta que no interesa es java_cup la cual podemos ubicar en cualquier lugar de nuestro disco duro, en este caso lo ubicamos en la carpeta bin de instalación del JDK similar a como lo hicimos con el Main.java de Jlex.3.En este caso no es necesario compilar el contenido de la carpeta ya que estos archivos han sido previamente compilados, podemos notarlo por las clases que se encuentran dentro de la carpeta.

Page 12: Instalación JLex & CUP

Ejemplo del Archivo JLex:Guardamos el archivo con el nombre lexico.lex en cualquier carpeta de nuestro disco duro, en este caso en: C:\prueba.

/*Definición del paquete al que pertenece y otros paquetes que puede utilizar*/

package Ejemplo;

import java_cup.runtime.Symbol;

/*DIRECTIVAS PARA EL ARCHIVO LEX

Para que sea compatible con cup %cup Hace la clase publica %public Agrega todos los caracteres, para que este disponible la ñ %full Para utilizar el atributo line %line Para utilizar el atributo char %char Coloca el case insensitive, es decir no hace diferencia entre mayusculas y minusculas %ignorecase Esto genera el simbolo de final de archivo %eofval*/

Page 13: Instalación JLex & CUP

/*los nombre que aparecen despues de sym. son los nombre que se le dan a los TERMINALES, despues se debe de especificar el tipo que se devolvera, regularmente String, pero puede ser cualquier otro tipo y despues convertirlo*/

/*Nota: Jlex no acepta comentarios debajo de este símbolo de doble porcentaje.*/

%%

%{ //declaración de variables y código que va ha ser copiado al escaner public static int linea=1; public static int pos=0;

/*Nota: En este bloque se pueden escribir comentarios. */%}

%cup%full%line%char%ignorecase%eofval{ return new Symbol(sym.EOF,new String("Fin de Archivo"));%eofval}

%%";" {/*aqui puede ir cualqier otro código: algún calculo o asignación*/

return new Symbol(sym.SEMI, new String(yytext()));}"+" {return new Symbol(sym.PLUS,new String(yytext()));}"-" {return new Symbol(sym.MINUS,new String(yytext()));}"/" {return new Symbol(sym.DIVI,new String(yytext()));}"*" {return new Symbol(sym.TIMES,new String(yytext()));}"(" {return new Symbol(sym.LPAREN,new String(yytext()));}")" {return new Symbol(sym.RPAREN,new String(yytext()));}

Page 14: Instalación JLex & CUP

[0-9]+ {return new Symbol(sym.NUMBER, new Integer(yytext()));}[ \t\r\n\f] {/* Ignora espacios en blanco, tabuladores, retornos de carro, etc.*/}"." {return new Symbol(sym.PUNTO);

/*al estar encerrado entre comillas devuelve el token PUNTO cuando leaun punto de la entrada. Notese la diferencia con la siguiente instrucciondonde el punto aparece sin comillas. Cuando se coloca un punto sin comillas junto a sus acciones estas acciones serán ejecutadas cada vez que el analizadorlexico encuentre algun lexema que no concuerde con cualquiera de los componentes lexicos especificados. Por ejemplo, al encontrar un simbolocomo la @ estre imprimira en la shell "Caracter Ilegal: @". la funciónyytext() devuelve el ultimo lexema levantado por el analizador lexico.*/}

. {System.out.println("Caracter Ilegal: "+yytext());}

El código esta comentado para un mejor entendimiento de cada parte o bloque que lo compone.

Page 15: Instalación JLex & CUP

Abrimos una ventana de D.O.S. en la carpeta C:\prueba y ejecutamos la instrucción:

java JLex.Main lexico.lex

Page 16: Instalación JLex & CUP

Ejemplo del Archivo CUP:Guardamos el archivo con el nombre sintactico.cup en la misma carpeta donde guardamos el archivo lex: C:\prueba.

/*Aqui se incluye el nombre del paquete al que va a pertenecer la clase parser.java y todos los paquetes que se vayan a utilizar dentro del proyecto. Por ejemplo si se fuera a utilizar la clase ArrayList se debe agregar la linea import Java.util.ArrayList; */package Ejemplo;

import java.io.*;import java_cup.runtime.*; //Clase que incluye las instrucciones de CUP

/*el bloque que siguie es codigo que se copia a la clase parser.java, que puede ser utilizado dentro de las acciones semánticas este código se copia exactamente igual sin revisar errores.*/parser code {: public static void main(String args[]) throws Exception{

//new parser(new Yylex(new FileInputStream(args[0]))).parse();new parser(new Yylex(System.in)).parse();

}

//este método sirve para el manejo de errores provisto por CUP public void syntax_error(Symbol s){

report_error("Error de sintaxis Linea:"+Integer.toString(Yylex.linea+1)+" Columna:"+Integer.toString(Yylex.pos+1)+" En \""+s.value+"\"",null); }:}

Page 17: Instalación JLex & CUP

//Sección donde se pueden declarar variables, constantes, etcaction code{: //mis variables

int integer = 1;:}

/* Declaración de terminales y los tipos que pueden declararse */

//declaración de terminales y sus tiposterminal String SEMI, PLUS, MINUS, DIVI, TIMES, LPAREN, RPAREN;terminal Integer NUMBER;terminal PUNTO;

//Declaracion de no terminales y sus tiposnon terminal expr_list, expr_part;non terminal Integer expr;

//presedencia de operadoresprecedence left PLUS, MINUS;precedence left TIMES, DIVI;

/* Gramática: el lado izquierdo es reemplazado por su correspondiente producción si es un no terminal. las acciones semánticas se colocan entre llaves y dos puntos {::} Un terminal o no terminal seguido de dos puntos y una letra sirve como un alias del terminal o no terminal para poder utilizarlo como una variable del tipo que le fue asignado en los blouqes anteriores.*/

Page 18: Instalación JLex & CUP

expr_list ::= expr_list expr_part |expr_part

;

expr_part ::= expr:e SEMI {: System.out.println("Operacion Exitosa. Resulatado="+e.intValue()); :} |PUNTO {: System.out.println("Archivo Parseado Exitosamente."); :}

;

expr ::= NUMBER:n {: RESULT=n; :} |expr:l PLUS expr:r {: RESULT=new Integer(l.intValue() + r.intValue()); :} |expr:l MINUS expr:r {: RESULT=new Integer(l.intValue() - r.intValue()); :} |expr:l DIVI expr:r {: if (r.intValue() != 0) {

RESULT=new Integer(l.intValue() / r.intValue()); } else{ System.out.println("Error Semantico División por Cero."); }

:} |expr:l TIMES expr:r {: RESULT=new Integer(l.intValue() * r.intValue()); :} |LPAREN expr:e RPAREN {: RESULT=e; :}

|error SEMI {:System.out.println("Error de Sintaxis");:} ;

Al igual que el archivo lex, el archivo cup esta comentado para una mejor comprensión.

Page 19: Instalación JLex & CUP

Abrimos una ventana de D.O.S. en la carpeta C:\prueba y ejecutamos la instrucción:

java java_cup.Main sintactico.cup

Page 20: Instalación JLex & CUP

Para unir los archivos generados por el Jlex & CUP y obtener el analizador final ejecutamos la instrucción:

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

Page 21: Instalación JLex & CUP

El analizador que acabamos de crear reconoce expresiones aritméticas básicas: suma, resta, multiplicación y división. Los datos de entrada pueden escribirse en un archivo :

Java Ejemplo.parser < entrada.txt

5+3*6;5+3-4;(5+10)*2;8/2-10;

Page 22: Instalación JLex & CUP

También podemos ingresar expresiones desde consola:

java Ejemplo.parser

E ingresando:

5*5-10+2*5; 1/1-1;10+3-5; 10/5+13-3;