Manual JFlex CUP PDF
Manual JFlex CUP PDF
Manual JFlex CUP PDF
Facultad de Ingeniería
Escuela de ciencias y sistemas
Organización de Lenguajes y compiladores 1
Sección C
Erick Tejaxún Xicón
Generador.bat
SET JFLEX_HOME= C:\libs\jflex-1.6.1
cd C:\Users\erick\Documents\NetBeansProjects\clase1\src\Analisis\
java -jar %JFLEX_HOME%\lib\jflex-1.6.1.jar scanner.l
pause
Scanner.l
package Analisis; // Paquete donde estará nuestro scanner
import java_cup.runtime.Symbol;
%%
%{
/*Area de declaración de codigo java.
*Funciones y variables necesarias
*
*/
String nombre;
public void imprimir(String cadena)
{
System.out.println(cadena);
}
%}
// Area de directivas
%cupsym sym
%class scanner
%cup
%public
%unicode
%line
%column
%char
%ignorecase
%%
// Acciones
/* Espacios en blanco */
{espacio} {/*Ignorar*/}
{entero} {return new Symbol(sym.entero,yycolumn,yyline,yytext());}
{decimal} {return new Symbol(sym.decimal,yycolumn,yyline,yytext());}
{cadena} {return new Symbol(sym.cadena,yycolumn,yyline,yytext());}
{id} {return new Symbol(sym.id,yycolumn,yyline,yytext());}
{caracter} {return new Symbol(sym.caracter,yycolumn,yyline,yytext());}
{bool} {return new Symbol(sym.booleano,yycolumn,yyline,yytext());}
";" {return new Symbol(sym.puntocoma,yycolumn,yyline,yytext());}
"(" {return new Symbol(sym.para,yycolumn,yyline,yytext());}
")" {return new Symbol(sym.parc,yycolumn,yyline,yytext());}
"+" {return new Symbol(sym.suma,yycolumn,yyline,yytext());}
"-" {return new Symbol(sym.resta,yycolumn,yyline,yytext());}
"*" {return new Symbol(sym.multi,yycolumn,yyline,yytext());}
"/" {return new Symbol(sym.div,yycolumn,yyline,yytext());}
"^" {return new Symbol(sym.potencia,yycolumn,yyline,yytext());}
{Comentario} { /*Se ignora.*/}
{ComentarioMulti} { /*Se ignora.*/}
/*Recolección de errores*/
.
{
System.err.println("Error lexico: "+yytext()+ " Linea:"+(yyline+1)+"
Columna:"+(yycolumn+1));
}
Parser.cup
package Analisis; // Paquete
import java_cup.runtime.*;
parser code
{:
/*
* Aquí están los no terminales
*/
non terminal INICIO;
non terminal String LEXP, EXP; // No terminales de tipo String
/* Precedencia */
precedence left suma, resta;
precedence left multi, div;
precedence left potencia;
/* Definición de la gramatica */
start with INICIO; // indicamos con qué producción debe empezar la gramatica.
EXP::=
EXP:valor1 suma EXP:valor2 {:RESULT = "suma("+valor1+","+valor2+")";:}
|EXP:valor1 resta EXP:valor2 {:RESULT ="resta("+valor1+","+valor2+")";:}
|EXP:valor1 multi EXP:valor2 {:RESULT = "multiplicacion("+valor1+","+valor2+")";:}
|EXP:valor1 div EXP:valor2 {:RESULT = "division("+valor1+","+valor2+")";:}
|EXP:valor1 potencia EXP:valor2 {:RESULT = "potencia("+valor1+","+valor2+")";:}
|para EXP:valor parc {:RESULT = valor;:}
|entero:valor {:RESULT = valor;:}
|decimal:valor {:RESULT = valor;:}
|cadena:valor {:RESULT = valor;:}
|booleano:valor {:RESULT = valor;:}
|id:valor {:RESULT = valor;:}
|caracter:valor {:RESULT = valor;:}
;
5. Luego de tener nuestro archivos scanner.l y parser.cup generamos nuestros analizadores
con el archivo [generador.bat]
Se ejecutará nuestro script. Vemos que primero nos generará nuestro archivo [scanner.java] y nos
muestra detalles. Si hubiera errores, se nos indicarán con detalle.
Luego nos generará nuestro analizador sintactico.
Esto generará las clases [parser.java] y la clase [sym.java].
Ahora que ya tenemos nuestros analizadores, crearemos la interfaz gráfica desde dónde
vamos a utilizarlos.
Creamos una Ventana JFrame.
Agregamos 2 textArea.
txtInput: Caja de texto donde se ingresará la entrada.
txtOutput: Caja de texto donde se mostrará la salida.
Botón “analizar”: llamará a la función analizar() donde se analizará la entrada.
Tarea:
Se solicita una aplicación que reconozca la misma gramática que este ejemplo pero que
genere como salida:
La misma cadena de entrada pero en notación postfija.
En caso de que todos los operando sean de tipo entero o doble, se deberá generar
como cadena en postfija = resultado.
/* Input */
(a-b*c/1)*1;
1+1;
9+2-34*1;
5+(a*b);
/*output */
a b - c 1 / * 1 *
1 1 + = 2
9 2 + 34 1 * - = -23
5 a b * +