Debido a que en la web no se encuentran ejemplos concretos del uso de JLEX y JAVA CUP, he decidido escribir un tutorial para el generador de analizadores léxicos JAVA JLEX y el generador de analizadores sintácticos JAVA CUP, he creado una nueva pagina en este blog dedicada a un tutorial y al estudio de estas herramientas, el enlace es: https://openfecks.wordpress.com/jlex-y-cup/
Tutorial JLEX y JAVA CUP
6 comentarios to “Tutorial JLEX y JAVA CUP”
-
Gracias miles
-
Hola..vi su tutorial y me gusto..
quisiera saber si me puede ayudar con este proyecto que nos dejaron..llevo dias tratando de entender todo esto pero la verdad no se como empezar
Analizador Financiero
En este proyecto se debe leer de un archivo de texto los datos financieros de una empresa y calcular índices financieros.
Estructura del archivo de texto
RECORD_TYPE=HEADER
ENTERPRISE_NAME=
YEAR=
MONTH=
BEGIN
VARIABLE=nombre1, VALUE=valor1
VARIABLE=nombre2, VALUE=valor2
VARIABLE=nombre3, VALUE=valor3
END -
Hola, mira despues de estas dos semanas investigando he logrado por una parte definir los token y la gramatica, y e intentado hacer el codigo de java, a continuacion lo posteo para que le heches un vistazo
TOKENS
tk_Record_Type = “Record_Type”
tk_header=”HEADER”
tk_Enterprise_name=” Enterprise_name”
Nombre= ([a-z])+([0-9])*
tk_YEAR=”YEAR”
Año= ([0-9])+
tk_Month=”Month”
Mes= ([0-9])+
tk_Variable= “NOMBRE1”
NOMBRE1= ([a-z])+
tk_Variable= “NOMBRE2”
NOMBRE2= ([a-z])+
tk_Variable= “NOMBRE3”
NOMBRE3= ([a-z])+
tk_VALUE=”VALOR1”
VALOR1= ([0-9])+
tk_VALUE=”VALOR2”
VALOR2= ([0-9])+
tk_VALUE=”VALOR2”
VALOR2= ([0-9])+
IGUAL =”=”
MENOS = “-”
MAS = “+”
DIVISION = “/”
Abre_parentesis = “(“
Cierra_parentesis= “)”
Punto_coma = “;”GRAMATICA
::=
::= tk_record_type IGUAL tk_header
tk_Enterprise_name IGUAL Nombre
tk_year IGUAL Año
tk_month IGUAL Mes
::= BEGIN END
::=
::= Variable IGUAL Nombre1 punto_coma
Variable IGUAL Nombre2 punto_coma
Variable IGUAL Nombre3 punto_coma::=
::= (Abre_parentesis)* VALOR1 [(MAS l MENOS l DIVISION)]+ VALOR2 (Cierra_parentesis)* [(MAS l MENOS l DIVISION)]* (VALOR 3)*
::= (Abre_parentesis)* VALOR2 [(MAS l MENOS l DIVISION)]+ VALOR2 (Cierra_parentesis)* [(MAS l MENOS l DIVISION)]* (VALOR 3)*
::= (Abre_parentesis)* VALOR3 [(MAS l MENOS l DIVISION)]+ VALOR2 (Cierra_parentesis)* [(MAS l MENOS l DIVISION)]* (VALOR 3)*
(Abre_parentesis)* VALOR1 [(MAS l MENOS l DIVISION)]+ VALOR 2 (Cierra_parentesis)* [(MAS l MENOS l DIVISION)]* (VALOR 3)* l £CODIGO JLEX
package jlexcup;
import java_cup.runtime.Symbol;%%
%cup
%ignorecase
%type java_cup.runtime.Symbol
%class scanner
%implements java_cup.runtime.Scanner
%{
public void PrintToken(String str){
System.out.println(str);
}
%}
%eofval{
System.out.println(“Fin del archivo”);
return null;
%eofval}
NOMBRE= ([a-z])+([0-9])*
AÑO = ([0-9])+
MES = ([0-9])+
VARIABLES= ({NOMBRE1}|{NOMBRE2}|{NOMBRE3})+
NOMBRE1=([a-z])+
NOMBRE2=([a-z])+
NOMBRE3=([a-z])+VALUES= ({VALOR1}|{NOMBRE2}|{NOMBRE3})+
VALOR1=([0-9])+
VALOR2=([0-9])+
VALOR3=([0-9])+%%
“(” {PrintToken(“Abre_parentesis”);return new Symbol(sym.PARENA);}
“)” {PrintToken(“Cierra_parentesis”);return new Symbol(sym.PARENC);}
“=” {PrintToken(“IGUAL”);return new Symbol(sym.IGUAL);}
“+” {PrintToken(“MAS”);return new Symbol(sym.MAS);}
“-” {PrintToken(“MENOS”);return new Symbol(sym.MENOS);}
“/” {PrintToken(“DIVISION”);return new Symbol(sym.DIVISION);}[\t\r\f] {}
[\n] {}
” ” {}
. {PrintToken(“Caracter_no_valido”);}Bueno, esto es lo que tengo pero la verdad con lo que explican en la U es dificil poder entenderlo, me faltaria el cup y luego hacer las pruebas..espero tus opiniones y ayuda..saludos
-
vuelvo a postear lo que llevo, por alguna razon no se copia bien todo
ESTRUCTURA DEL ARCHIVO DE TEXTO
RECORD_TYPE=HEADER
ENTERPRISE_NAME=
YEAR=
MONTH=
BEGIN
VARIABLE=nombre1, VALUE=valor1
VARIABLE=nombre2, VALUE=valor2
VARIABLE=nombre3, VALUE=valor3
ENDTOKENS
tk_Record_Type = “Record_Type”
tk_header=”HEADER”
tk_Enterprise_name=” Enterprise_name”
Nombre= ([a-z])+([0-9])*
tk_YEAR=”YEAR”
Año= ([0-9])+
tk_Month=”Month”
Mes= ([0-9])+
tk_Variable= “NOMBRE1”
NOMBRE1= ([a-z])+
tk_Variable= “NOMBRE2”
NOMBRE2= ([a-z])+
tk_Variable= “NOMBRE3”
NOMBRE3= ([a-z])+
tk_VALUE=”VALOR1”
VALOR1= ([0-9])+
tk_VALUE=”VALOR2”
VALOR2= ([0-9])+
tk_VALUE=”VALOR2”
VALOR2= ([0-9])+
IGUAL =”=”
MENOS = “-”
MAS = “+”
DIVISION = “/”
Abre_parentesis = “(“
Cierra_parentesis= “)”
Punto_coma = “;”GRAMATICA
::=
::= tk_record_type IGUAL tk_header
tk_Enterprise_name IGUAL Nombre
tk_year IGUAL Año
tk_month IGUAL Mes
::= BEGIN END
::=
::= Variable IGUAL Nombre1 punto_coma
Variable IGUAL Nombre2 punto_coma
Variable IGUAL Nombre3 punto_coma::=
::= (Abre_parentesis)* VALOR1 [(MAS l MENOS l DIVISION)]+ VALOR2 (Cierra_parentesis)* [(MAS l MENOS l DIVISION)]* (VALOR 3)*
::= (Abre_parentesis)* VALOR2 [(MAS l MENOS l DIVISION)]+ VALOR2 (Cierra_parentesis)* [(MAS l MENOS l DIVISION)]* (VALOR 3)*
::= (Abre_parentesis)* VALOR3 [(MAS l MENOS l DIVISION)]+ VALOR2 (Cierra_parentesis)* [(MAS l MENOS l DIVISION)]* (VALOR 3)*
(Abre_parentesis)* VALOR1 [(MAS l MENOS l DIVISION)]+ VALOR 2 (Cierra_parentesis)* [(MAS l MENOS l DIVISION)]* (VALOR 3)* l £CODIGO JLEX
package jlexcup;
import java_cup.runtime.Symbol;%%
%cup
%ignorecase
%type java_cup.runtime.Symbol
%class scanner
%implements java_cup.runtime.Scanner
%{
public void PrintToken(String str){
System.out.println(str);
}
%}
%eofval{
System.out.println(“Fin del archivo”);
return null;
%eofval}
NOMBRE= ([a-z])+([0-9])*
AÑO = ([0-9])+
MES = ([0-9])+
VARIABLES= ({NOMBRE1}|{NOMBRE2}|{NOMBRE3})+
NOMBRE1=([a-z])+
NOMBRE2=([a-z])+
NOMBRE3=([a-z])+VALUES= ({VALOR1}|{NOMBRE2}|{NOMBRE3})+
VALOR1=([0-9])+
VALOR2=([0-9])+
VALOR3=([0-9])+%%
“(” {PrintToken(“Abre_parentesis”);return new Symbol(sym.PARENA);}
“)” {PrintToken(“Cierra_parentesis”);return new Symbol(sym.PARENC);}
“=” {PrintToken(“IGUAL”);return new Symbol(sym.IGUAL);}
“+” {PrintToken(“MAS”);return new Symbol(sym.MAS);}
“-” {PrintToken(“MENOS”);return new Symbol(sym.MENOS);}
“/” {PrintToken(“DIVISION”);return new Symbol(sym.DIVISION);}[\t\r\f] {}
[\n] {}
” ” {}
. {PrintToken(“Caracter_no_valido”);} -
Interesante el tutorial pero me queda la duda del análisis semántico con javacup me podrían ayudar con documentación o un ejemplo