Vous êtes sur la page 1sur 9

Manual Jflex con Cup

Compiladores 1
Sección A

EN WINDOWS

Universidad De San Carlos


Facultad de Ingeniería
Escuela de Ciencias y Sistemas
Compiladores 1
Ing. José Rodolfo Calvo Villagrán
Aux. Aura Luz Cifuentes Reyes

Jflex es una herramienta desarrollada en Java, la cual genera un programa en Java a partir de una
especificación en el que se indican los tokens permitidos por nuestro lenguaje con la ayuda
JAVACUP es un analizador sintáctico o sea un parser
parser-generador
generador vamos a gestionar jflex.
Manual Jflex con Cup
Compiladores 1
Sección A
Instalación:

Paso 1: Descarga de Libreras


Descargamos las fuentes de JFlex en la página: http://jflex.de/download.html
Descargamos las fuentes de Cup en la página: http://www2.cs.tum.edu/projects/cup/

Paso 2: Creación de Carpeta contenedora de fuentes


Creamos la Carpeta “Fuentes” dentro de la unidad C:
Descomprimimos el contenido de la carpeta anteriormente descargado: jflex-1.4.3 dentro de la
carpeta de Fuentes.
Descomprimimos el contenido de la carpeta anteriormente descargado: java_cup_v10k y
copiamos el archivo java_cup en la carpeta fuentes.

Paso 3: Creación de Archivo de Configuración Lexico.bat


Cambiamos la dirección de JAVA_HOME por la dirección de nuestra actual JDK.
Agregamos la dirección de nuestro actual proyecto.
Fichero: Lexico.bat

SET JAVA_HOME="C:\Program Files (x86)\Java\jdk1.6.0_17\bin"


SET PATH=%JAVA_HOME%;%PATH%
SET CLASSPATH=%JAVA_HOME%;
SET JFLEX_HOME= C:\Fuentes\jflex-1.4.3

cd C:\Users\lucita\Documents\NetBeansProjects\MiScaner\src\miscaner
java -jar %JFLEX_HOME%\lib\JFlex.jar Scanner.jflex
pause

Cambiamos la dirección del JDK, y cambiamos la dirección de nuestro proyecto.

Fichero: Sintactico.bat

SET JAVA_HOME="C:\Program Files (x86)\Java\jdk1.6.0_17\bin"


SET PATH=%JAVA_HOME%;%PATH%
SET CLASSPATH=%JAVA_HOME%;

cd C:\Users\lucita\Documents\NetBeansProjects\MiScaner\src\miscaner
java -classpath C:\Fuentes\ java_cup.Main -parser sintactico -symbols simbolo Parser.cup
pause

Paso 4: Creación de un proyecto de Netbeans


- File -> New Project -> Java Application
Manual Jflex con Cup
Compiladores 1
Sección A
Project Name: miscaner

- Dentro de la carpeta del proyecto, agregamos una carpeta “lib”.


- Copiamos la librería: java-cup-11a-runtime.jar dentro de la carpeta lib.
- Clic secundario en Librerías, y le damos Agregar nuevo JAR/FOLDER.

Paso 5: Creación Scanner.jflex


Scanner.jflex:

package miscaner;
Manual Jflex con Cup
Compiladores 1
Sección A
import java_cup.runtime.Symbol;
%%

Comentario ="/"[*] [^*]+ [*]"/" | "/"[*] [*]+ "/"


Comentario2 =[/][/] ([^\r\n])* \r|\n
tstring =[\"] [^\"\n]+ [\"\n]
numero =[0-9]+ "."? [0-9]*
letra =[a-zA-ZÑñ]+
iden ={letra}({letra}|{numero}|"_")*

%state A

%cupsym simbolo
%class gramatilex
%cup
%public
%unicode
%public
%line
%char
%ignorecase
%%

"IF" {return new Symbol(simbolo.tif, yychar,yyline); }


"WHILE" {return new Symbol(simbolo.twhile, yychar,yyline); }
"FOR" {return new Symbol(simbolo.tfor, yychar,yyline); }
[<][!]"inicio" {yybegin(A); return new Symbol(simbolo.tstart, yychar,yyline); }

/* OPERADOR */
"=" {return new Symbol(simbolo.igual, yychar,yyline); }
"+" {return new Symbol(simbolo.mas, yychar,yyline); }
"-" {return new Symbol(simbolo.menos, yychar,yyline); }
";" {return new Symbol(simbolo.coma, yychar,yyline); }

/* String */
{tstring} {return new Symbol(simbolo.tstring, yychar,yyline,new String(yytext()));}
{numero} {return new Symbol(simbolo.numero, yychar,yyline,new String(yytext()));}
{iden} {return new Symbol(simbolo.iden, yychar,yyline,new String(yytext()));}

/* COMENTARIOS */
{Comentario} { /* Se ignoran */}
{Comentario2} { /* Se ignoran */}

/* BLANCOS */
[ \t\r\f\n]+ { /* Se ignoran */}
Manual Jflex con Cup
Compiladores 1
Sección A
<A>{
{numero} {return new Symbol(simbolo.numero, yychar,yyline,new String(yytext()));}
";" {return new Symbol(simbolo.coma, yychar,yyline); }
[!][>] {yybegin(YYINITIAL); return new Symbol(simbolo2.tend, yychar,yyline);}
[ \t\r\f\n]+ { /* Se ignoran */}
. { System.out.println("Error lexico dentro de <!inicio: "+yytext()); }
}

/* Cualquier Otro */
. { System.out.println("Error lexico: "+yytext()); }

Paso 6: Creación Parser.cup


Fichero: Parser.cup

package miscaner;
import java_cup.runtime.*;
parser code
{:
/**Metodo al que se llama automáticamente ante algún error sintactico.*/
public void syntax_error(Symbol s){
System.out.println("Error en la Línea " + (s.right+1) +" Columna "+s.left+ ". Identificador "
+s.value + " no reconocido." );
}
/**Metodo al que se llama en el momento en que ya no es posible una recuperación de
errores.*/
public void unrecovered_syntax_error(Symbol s) throws java.lang.Exception{
System.out.println("Error en la Línea " + (s.right+1)+ "Columna "+s.left+". Identificador " +
s.value + " no reconocido.");
}

:}
action code
{:

:}
terminal tif , twhile, tfor, igual, mas, menos;
terminal tstart, coma, tend;
terminal String tstring, numero, iden;
non terminal INICIA,L, TIPOS;

start with INICIA;

INICIA::= L;
L::=L TIPOS
|TIPOS;
Manual Jflex con Cup
Compiladores 1
Sección A

TIPOS ::= tif {: System.out.println("IF"); :}


| twhile {: System.out.println("WHILE"); :}
| tfor {: System.out.println("FOR"); :}
| igual {: System.out.println("IGUAL"); :}
| mas {: System.out.println("MAS"); :}
| menos {: System.out.println("MENOS"); :}
| tstring {: System.out.println("STRING"); :}
| numero {: System.out.println("NUMERO"); :}
| iden {: System.out.println("IDENTIFICADOR"); :}
| tstart {: System.out.println("<!INICIO"); :}
| tend {: System.out.println("!>"); :}
| coma {: System.out.println("COMA"); :}
| error;

Paso 7: Creación Main.java


Fichero: Main.java

package miscaner;
import java.io.FileInputStream;
public class Main {
public static void main(String[] args) throws Exception {

System.out.println("-------------------------------");
new sintactico(new gramatilex(new FileInputStream("prueba.txt"))).parse();

}
}

Paso 8: Compilar
Le damos doble clic a los ficheros léxico.bat y sintáctico.bat y luego compilamos el proyecto de
netbeans.

Archivo de Entrada:

/* Este es un comentario */
Variable = 2.33333 ;
for <!inicio 3; 2; 1; 4; !>
var = " Cadena ";
numero = 2222;
// Comentario 2
/* Comentario 4 */
while <!Inicio
6; 7; 8; 9;
Manual Jflex con Cup
Compiladores 1
Sección A
!>
4+3=7

//end
/* Fin */

JFlex:
Jflex es una herramienta desarrollada en Java, la cual genera un programa en Java a partir de una
especificación en el que se indican los tokens permitidos por nuestro lenguaje con la ayuda
JAVACUP es un analizador sintáctico o sea un parser
parser-generador
generador vamos a gestionar jflex.

Archivo.jflex

JFLEX

Archivo.java

javac

Archivo.class
Un archivo de especificación para Jfle
Jflexx está organizado en tres secciones, separadas por: “%%", y
tiene el siguiente formato:

Código de usuario
%%
Directivas Jflex
%%
Expresiones regulares

Código de usuario:
En esta sección se crean las clases necesarias para nuestro analizador lexico, las cuales
serán copiadas directamente al inicio del archivo de salida. Se importan los paquetes necesarios.
Manual Jflex con Cup
Compiladores 1
Sección A
Directiva
En esta sección se incluyen algunas reglas propias de Jflex también se podrán una definición de
expresiones regulares para facilitar su uso después.

Definición Regular:

<nombre macro>= <expresión regular valida>

%char; %line Activar el conteo de caracteres y de líneas.


%class permite cambiar el nombre de la clase del analizador lexico, por default copia el
definido en el archivo.
%cupsym Esta cambiara la clase de símbolos que genera por defecto Jflex sym por otro
nombre.
%public permite que la clase del analizador léxico generada por Jflex sea una clase
pública.
%cup Activa el uso de cup.
%init{ Permite agregar código al constructor de la clase generada por jflex, aquí se
Código pueden inicializar las variables.
%init}
%unicode Usamos el formato unicode para trabajar con los ficheros
%standalone Indicamos a JFlex que queremos que genere su propio método main.
%ignorecase De las expresiones léxicas definidas diferencia entre mayúsculas y minúsculas.
%type String Indicamos el tipo que queremos que nos devuelva para los tokens. Dejará el
token actual con la función yytext()

Expresiones Regulares:
En esta sección se definen las expresiones regulares que representan los tokens de nuestro
lenguaje, y que debemos hacer una vez detectados dichos tokens. Las reglas tienen 3 partes:
[<estado(s)>] <expresión> {<acción>}

Definición de Expresiones:

\t Representa un tabulador \r Representa el "regreso al inicio" o sea el


lugar en que la línea vuelve a iniciar.
\n Representa la nueva línea. Como también \f Representa un salto de página
el carácter que le dará inicio.
Manual Jflex con Cup
Compiladores 1
Sección A
\d Representa un dígito del 0 al 9 \v Representa un tabulador vertical
\s Representa un espacio en blanco. \w Representa cualquier carácter
alfanumérico.

a|b unión esta expresión regular, que coincide con todas las entradas que se
corresponde con a o b.
ab Concatenación Una letra que inicia con a, le sigue la letra b.
a* Cerradura La a puede venir 0 o más veces.
Kleene
a+ Cerradura Es equivalente (a)a*
Abierta
a? Cerradura Es equivalente a una cerradura vacía.
cerrada
a{n} Es equivalente a n, veces concatenado a.
a{n,m} Tiene un límite inferior y superior para concatenar las a.
"Expr" Se define un texto exacto que define la expresión regular.
{Identifier} Según una definición regular definida en el área de directivas
podemos hacer uso de ellas.
[a-zA-Z] Definición de Rango de caracteres según el orden definido en ASCII.