jlex y javacup

19
JLex y Cup Manual de Instalación 200512108 200512108 Fredy Josue Romero Musul Fredy Josue Romero Musul AC – Facultad de Ingeniería AC – Facultad de Ingeniería ganización de lenguajes y compiladores 1 – Sección C ganización de lenguajes y compiladores 1 – Sección C

Upload: fjrm01

Post on 07-Jun-2015

10.650 views

Category:

Documents


4 download

DESCRIPTION

Tarea3:OLC1 - Ingenieria USAC200512108 - FREDY JOSUE ROMERO MUSULMANUAL DE INSTALACION DE JLEX Y JCUP EN WINDOWS

TRANSCRIPT

Page 1: JLex y JavaCup

JLex y Cup

Manual de Instalación

200512108200512108Fredy Josue Romero MusulFredy Josue Romero Musul

USAC – Facultad de IngenieríaUSAC – Facultad de IngenieríaOrganización de lenguajes y compiladores 1 – Sección COrganización de lenguajes y compiladores 1 – Sección C

Page 2: JLex y JavaCup

Manual de Instalacion : JLex y Cup Page 2

¿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/

Page 3: JLex y JavaCup

Manual de Instalacion : JLex y Cup Page 3

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

Page 4: JLex y JavaCup

Manual de Instalacion : JLex y Cup Page 4

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/

Page 5: JLex y JavaCup

Manual de Instalacion : JLex y Cup Page 5

Page 6: JLex y JavaCup

Manual de Instalacion : JLex y Cup Page 6

Instalando Jlex (2)

Dentro de la carpe “Jlex”, se debe compilar el fichero Java con el siguiente comando:

javac Main.java

Page 7: JLex y JavaCup

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

Page 8: JLex y JavaCup

Manual de Instalacion : JLex y Cup Page 8

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.jlexjava Jlex.Main fichero.jlex

donde fichero.jlex es el nombre del fichero con la especificación del análisis sintáctico para tu lenguaje.

Page 9: JLex y JavaCup

Manual de Instalacion : JLex y Cup Page 9

¿Qué es Cup?

CUP es la herramienta que usaremos para generar el analizador sintáctico de nuestro lenguaje.

Page 10: JLex y JavaCup

Manual de Instalacion : JLex y Cup Page 10

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.

Page 11: JLex y JavaCup

Manual de Instalacion : JLex y Cup Page 11

Descomprimir

Page 12: JLex y JavaCup

Manual de Instalacion : JLex y Cup Page 12

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!!

Page 13: JLex y JavaCup

Manual de Instalacion : JLex y Cup Page 13

USANDO Jlex y CupJlex y Cup

por primera vez:

Una calculadora sencilla

Page 14: JLex y JavaCup

Manual de Instalacion : JLex y Cup Page 14

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

Page 15: JLex y JavaCup

Manual de Instalacion : JLex y Cup Page 15

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

import java_cup.runtime.Symbol;

%%

%cup

%%

";" { //RECONOCE EL SIMBOLO PUNTO Y COMA

return new Symbol(sym.SEMI); }

"+" { System.out.print("SIGNO DE SUMA ");//RECONOCE EL

SIMBOLO MAS

return new Symbol(sym.PLUS); }

"*" { System.out.print("SIGNO POR ");//RECONOCE EL

SIMBOLO POR

return new Symbol(sym.TIMES); }

"-" { System.out.print("SIGNO MENOS ");//RECONOCE EL

SIMBOLO MENOS

return new Symbol(sym.MENOS); }

"/" { System.out.print("SIGNO DIVIDIDO ");//RECONOCE EL

SIMBOLO DIVIDIDO

return new Symbol(sym.DIVI); }

"(" { return new Symbol(sym.LPAREN); } //RECONOCE EL

PARENTESIS DE APERTURA

")" { return new Symbol(sym.RPAREN); }//RECONOCE EL

SIMBOLO PARENTESIS DE CIERRE

[0-9]+ { System.out.print(" numero ");//RECONOCE LOS

NUMEROS

return new Symbol(sym.NUMBER, new

Integer(yytext())); }

[ \t\r\n\f] { /* ignore white space. */ }

. { System.err.println("Illegal character: "+yytext()); }

import java_cup.runtime.*;

action code {:

/*CODIGO DE JAVA*/

:}

parser code {:

public static void main(String args[]) throws Exception {

new parser(new Yylex(System.in)).parse();

}

:}

terminal SEMI, PLUS, TIMES, LPAREN, RPAREN;

terminal Integer NUMBER;

non terminal expr_list, expr_part;

non terminal Integer expr;

precedence left PLUS;

precedence left TIMES;

expr_list ::= expr_list expr_part | expr_part;

expr_part ::= expr:e {: System.out.println(" = "+e+";"); :} SEMI;

expr ::= NUMBER:n

{: RESULT=n; :}

| expr:l PLUS expr:r

{: RESULT=new Integer(l.intValue() + r.intValue()); :}

| expr:l TIMES expr:r

{: RESULT=new Integer(l.intValue() * r.intValue()); :}

| LPAREN expr:e RPAREN

{: RESULT=e; :}

;

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

Page 16: JLex y JavaCup

Manual de Instalacion : JLex y Cup Page 16

Usando JLex y Cup : Expresiones Aritméticas (2)

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.

El archivo “analex.jlex”El archivo “analex.jlex”

Page 17: JLex y JavaCup

Manual de Instalacion : JLex y Cup Page 17

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

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.

El archivo “parser.cup”El archivo “parser.cup”

Page 18: JLex y JavaCup

Manual de Instalacion : JLex y Cup Page 18

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

Ahora compilemos con los comandos:

java JLex.Main analex.lex

java java_cup.Main parser.cup

Page 19: JLex y JavaCup

Manual de Instalacion : JLex y Cup Page 19

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: