Tutorial JLEX y JAVA CUP

por Josue Ortega

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/

6 comentarios to “Tutorial JLEX y JAVA CUP”

  1. 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

    • Qué tal lo primero que tenes que hacer es definir en tu archivo lex, los tokens que pertenecen al lenguaje, por ejemplo las palabras reservadas y los signos, eso sería en el archivo jlex.
      Luego de esto definir una gramática que reconozca la estructura del archivo, según veo sería algo como

      G::= S bloque

      S::= S, S1
      | S1
      S1::= Asig

      Asig::= palabra_reservada ‘=’ valor

      Bloque ::= BEGIN L END

      L::= L , L1
      | L1
      L1::= id ‘=’ vnombre

      esto reconocería una gramática similar a la que te piden
      Saludos

  2. 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

  3. 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
    END

    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”);}

  4. 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

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: