JLex y JavaCup
description
Transcript of 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
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/
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
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/
Manual de Instalacion : JLex y Cup Page 5
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
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.
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.
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.
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.
Manual de Instalacion : JLex y Cup Page 11
Descomprimir
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!!
Manual de Instalacion : JLex y Cup Page 13
USANDO Jlex y CupJlex y Cup
por primera vez:
Una calculadora sencilla
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
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”
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”
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”
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
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: