6997331 Instalacion JLex CUP

download 6997331 Instalacion JLex CUP

of 22

Transcript of 6997331 Instalacion JLex CUP

  • 7/30/2019 6997331 Instalacion JLex CUP

    1/22

    Gua de Instalacin y Ejemplos

    USAC

    Facultad de Ingeniera

    Manuel Elias Muhn Esquit

    200018480

  • 7/30/2019 6997331 Instalacion JLex CUP

    2/22

    Jlex es una herramienta desarrollada en Java el cual puede recibir un

    archivo de entrada (archivo .lex) dentro del cual se declaran

    expresiones regulares y tokens vlidos para un lenguaje que

    deseamos reconocer. Dicho de otro modo Jlex es una herramienta

    para generar analizadores lxicos.

    CUP es un generador de parsers para gramticas tipo LALR(1),dentro del cdigo del archivo de entrada (archivo .cup) deben existir

    declaraciones de producciones y asociacin de fragmentos de cdigo

    Java. Cuando una produccin es reconocida, se genera un archivo

    fuente Java, parser.java que contiene una clase parser, con un

    mtodo Symbol parser(), el cual es utilizado para analizar un archivode entrada que contiene instrucciones validas para el lenguaje que

    hemos creado con Jlex & CUP.

    Las extensiones de archivos de entrada pueden ser de cualquier tipo,

    al final y al cabo son archivos planos.

  • 7/30/2019 6997331 Instalacion JLex CUP

    3/22

    1. Instalacin del JDK de Java (entorno necesario para compilar y ejec

    2. Descarga e instalacin de Jlex

    3. Descarga e instalacin de CUP

    4. Ejemplo

    5. Funcionamiento

  • 7/30/2019 6997331 Instalacion JLex CUP

    4/22

    Para poder utilizar Jlex & CUP uno de los primeros pasosrequeridos es la instalacin del JDK, el cual es el entorno

    necesario para compilar y ejecutar clases Java.

    El instalador del JDK se puede descargar desde la pgina

    de SUN (http://java.sun.com/j2se/1.4.2/download.html).

    El procedimiento para instalar el JDK en el entorno Windows

    es el tradicional doble clic sobre el archivo ejecutable y

    luego el botn siguiente hasta llegar al final de la instalacin.

    Para este ejemplo nos hemos descargado el jdk1.6.0, sin

    realizar modificaciones a la carpeta de instalacin que

    aparece por default aunque es posible instalarla en cualquier

    ubicacin de nuestro disco duro.

    http://java.sun.com/j2se/1.4.2/download.htmlhttp://java.sun.com/j2se/1.4.2/download.html
  • 7/30/2019 6997331 Instalacion JLex CUP

    5/22

    Clic derecho sobre My

    Computer (Mi PC), escoger

    Properties (Propiedades) y

    luego en System Properties

    (Propiedades del Sistema)

    se debe escoger la pestaa

    Advanced.

    Presionare el botn

    Environment Varialbes(Variables de Entorno)

  • 7/30/2019 6997331 Instalacion JLex CUP

    6/22

    Nos posicionamos sobre la

    variable de entorno

    CLASSPATH, y

    presionamos el botn Edit

    (Editar).

    Si la variable de entorno no

    existe, entonces debe ser

    creada presionando el

    botn New (Nuevo) yagregar los datos

    correspondientes.

  • 7/30/2019 6997331 Instalacion JLex CUP

    7/22

    Nos ubicamos al final de la cadena dentro de Variable Value

    (Valor de la Variable) y agregamos punto y coma, seguido del

    Path de ubicacin de la carpeta bin de la instalacin del JDK, en

    ejemplo se agrega la cadena: ;C:\Program

    Files\Java\jdk1.6.0\bin sin las comillas.

    Presionamos el botn Ok y agregamos la misma cadena a la

    variable Path.

  • 7/30/2019 6997331 Instalacion JLex CUP

    8/22

    Realizamos los pasos anteriores

    para agregar la cadena ;C:\Program

    Files\Java\jdk1.6.0\bin a la variable

    Path. Si la variable Path no existe

    debe ser creada utilizando el botnNew (Nuevo) e ingresar los datos.

    Despus de las anteriores

    modificaciones al CLASSPATH y al

    Path ya podemos utilizar loscomandos de Java (java, javac,

    appletviewer, jar, etc.) desde

    cualquier carpeta dentro de nuestro

    disco duro.

  • 7/30/2019 6997331 Instalacion JLex CUP

    9/22

    Jlex es una herramienta creada en y para el lenguaje Java quesirve para crear analizadores lxicos, a continuacin

    describimos los pasos de su instalacin:

    1.Descargar el archivo de instalacin de Jlex (

    http://www.cs.princeton.edu/~appel/modern/java/JLex/), el cualconsiste en un archivo java (Main.java).

    2.Ubicar el Main.java en cualquier carpeta de nuestro disco

    duro, en este caso creamos la carpeta jlex dentro del bin del

    JDK: C:\Program Files\Java\jdk1.6.0\bin\jlex.

    3.Abrimos una ventana del D.O.S. dentro de la carpeta jlex ycompilamos el Main.java con la instruccin: javac Main.java,

    despus de lo cual podemos ver los archivos .class creados

    dentro de la carpeta jlex.

    http://www.cs.princeton.edu/~appel/modern/java/JLex/http://www.cs.princeton.edu/~appel/modern/java/JLex/http://www.cs.princeton.edu/~appel/modern/java/JLex/
  • 7/30/2019 6997331 Instalacion JLex CUP

    10/22

    C:\Program Files\Java\jdk1.6.0\bin\jlex>javac Main.java

  • 7/30/2019 6997331 Instalacion JLex CUP

    11/22

    Como se hiso mencin en la intro CUP es un generador deparsers, a continuacin describimos los paso para su

    instalacin.

    1.Descargar el archivo de instalacin de CUP (

    http://www.cs.princeton.edu/~appel/modern/java/CUP/), el cualconsiste en un archivo .zip.

    2.Descomprimimos el archivo y podemos ver varios archivos y

    carpetas. La carpeta que no interesa es java_cup la cual

    podemos ubicar en cualquier lugar de nuestro disco duro, en

    este caso lo ubicamos en la carpeta bin de instalacin del JDK

    similar a como lo hicimos con el Main.java de Jlex.

    3.En este caso no es necesario compilar el contenido de la

    carpeta ya que estos archivos han sido previamente

    compilados, podemos notarlo por las clases que se encuentran

    dentro de la carpeta.

    http://www.cs.princeton.edu/~appel/modern/java/CUP/http://www.cs.princeton.edu/~appel/modern/java/CUP/
  • 7/30/2019 6997331 Instalacion JLex CUP

    12/22

    Ejemplo del Archivo JLex:

    Guardamos el archivo con el nombre lexico.lex en cualquier

    carpeta de nuestro disco duro, en este caso en: C:\prueba.

    /*Definicin del paquete al que pertenece y otros paquetes que puede utilizar

    */

    package Ejemplo;

    import java_cup.runtime.Symbol;

    /*DIRECTIVAS PARA EL ARCHIVO LEX

    Para que sea compatible con cup

    %cup

    Hace la clase publica%public

    Agrega todos los caracteres, para que este disponible la %full

    Para utilizar el atributo line

    %line

    Para utilizar el atributo char

    %char

    Coloca el case insensitive, es decir no hace diferencia entre mayusculas y minusculas

    %ignorecase

    Esto genera el simbolo de final de archivo%eofval

    */

  • 7/30/2019 6997331 Instalacion JLex CUP

    13/22

    /*los nombre que aparecen despues de sym. son los nombre que se le dan a los TERMINALES,

    despues se debe de especificar el tipo que se devolvera, regularmente String, pero puede

    ser cualquier otro tipo y despues convertirlo*/

    /*Nota:

    Jlex no acepta comentarios debajo de este smbolo de doble porcentaje.*/

    %%

    %{

    //declaracin de variables y cdigo que va ha ser copiado al escaner

    public static int linea=1;

    public static int pos=0;

    /*Nota:En este bloque se pueden escribir comentarios.

    */

    %}

    %cup

    %full

    %line

    %char

    %ignorecase

    %eofval{

    return new Symbol(sym.EOF,new String("Fin de Archivo"));%eofval}

    %%";" {/*aqui puede ir cualqier otro cdigo: algn calculo o asignacin*/

    return new Symbol(sym.SEMI, new String(yytext()));}

    "+" {return new Symbol(sym.PLUS,new String(yytext()));}

    "-" {return new Symbol(sym.MINUS,new String(yytext()));}

    "/" {return new Symbol(sym.DIVI,new String(yytext()));}

    "*" {return new Symbol(sym.TIMES,new String(yytext()));}

    "(" {return new Symbol(sym.LPAREN,new String(yytext()));}")" {return new Symbol(sym.RPAREN,new String(yytext()));}

  • 7/30/2019 6997331 Instalacion JLex CUP

    14/22

    [0-9]+ {return new Symbol(sym.NUMBER, new Integer(yytext()));}[ \t\r\n\f] {/* Ignora espacios en blanco, tabuladores, retornos de carro, etc.*/}

    "." {return new Symbol(sym.PUNTO);

    /*al estar encerrado entre comillas devuelve el token PUNTO cuando lea

    un punto de la entrada. Notese la diferencia con la siguiente instruccion

    donde el punto aparece sin comillas. Cuando se coloca un punto sin comillas

    junto a sus acciones estas acciones sern ejecutadas cada vez que el analizador

    lexico encuentre algun lexema que no concuerde con cualquiera de loscomponentes lexicos especificados. Por ejemplo, al encontrar un simbolo

    como la @ estre imprimira en la shell "Caracter Ilegal: @". la funcin

    yytext() devuelve el ultimo lexema levantado por el analizador lexico.*/}

    . {System.out.println("Caracter Ilegal: "+yytext());}

    El cdigo esta comentado para un mejor entendimiento de cada parte o

    bloque que lo compone.

  • 7/30/2019 6997331 Instalacion JLex CUP

    15/22

    Abrimos una ventana de D.O.S. en la carpeta C:\prueba y

    ejecutamos la instruccin:

    java JLex.Main lexico.lex

  • 7/30/2019 6997331 Instalacion JLex CUP

    16/22

    Ejemplo del Archivo CUP:

    Guardamos el archivo con el nombre sintactico.cup en la misma

    carpeta donde guardamos el archivo lex: C:\prueba.

    /*Aqui se incluye el nombre del paquete al que va a pertenecer la clase parser.java

    y todos los paquetes que se vayan a utilizar dentro del proyecto. Por ejemplo si se

    fuera a utilizar la clase ArrayList se debe agregar la linea import Java.util.ArrayList;

    */

    package Ejemplo;

    import java.io.*;

    import java_cup.runtime.*; //Clase que incluye las instrucciones de CUP

    /*el bloque que siguie es codigo que se copia a la clase parser.java,

    que puede ser utilizado dentro de las acciones semnticas

    este cdigo se copia exactamente igual sin revisar errores.

    */

    parser code

    {:

    public static void main(String args[]) throws Exception{

    //new parser(new Yylex(new FileInputStream(args[0]))).parse();

    new parser(new Yylex(System.in)).parse();

    }

    //este mtodo sirve para el manejo de errores provisto por CUP

    public void syntax_error(Symbol s){

    report_error("Error de sintaxis Linea:"+Integer.toString(Yylex.linea+1)+"

    Columna:"+Integer.toString(Yylex.pos+1)+" En \""+s.value+"\"",null);

    }

    :}

  • 7/30/2019 6997331 Instalacion JLex CUP

    17/22

    //Seccin donde se pueden declarar variables, constantes, etc

    action code

    {: //mis variables

    int integer = 1;

    :}

    /* Declaracin de terminales y los tipos que pueden declararse */

    //declaracin de terminales y sus tipos

    terminal String SEMI, PLUS, MINUS, DIVI, TIMES, LPAREN, RPAREN;

    terminal Integer NUMBER;

    terminal PUNTO;

    //Declaracion de no terminales y sus tipos

    non terminal expr_list, expr_part;

    non terminal Integer expr;

    //presedencia de operadores

    precedence left PLUS, MINUS;

    precedence left TIMES, DIVI;

    /*

    Gramtica: el lado izquierdo es reemplazado por su correspondiente produccin

    si es un no terminal. las acciones semnticas se colocan entre llaves y dos puntos {::}

    Un terminal o no terminal seguido de dos puntos y una letra sirve como un alias del terminal

    o no terminal para poder utilizarlo como una variable del tipo que le fue asignado en los blouqesanteriores.

    */

  • 7/30/2019 6997331 Instalacion JLex CUP

    18/22

    expr_list ::= expr_list expr_part

    |expr_part

    ;

    expr_part ::= expr:e SEMI {: System.out.println("Operacion Exitosa. Resulatado="+e.intValue()); :}

    |PUNTO {: System.out.println("Archivo Parseado Exitosamente."); :}

    ;

    expr ::= NUMBER:n {: RESULT=n; :}

    |expr:l PLUS expr:r {: RESULT=new Integer(l.intValue() + r.intValue()); :}

    |expr:l MINUS expr:r {: RESULT=new Integer(l.intValue() - r.intValue()); :}

    |expr:l DIVI expr:r {: if (r.intValue() != 0) {

    RESULT=new Integer(l.intValue() / r.intValue());

    }

    else{

    System.out.println("Error Semantico Divisin por Cero.");

    }:}

    |expr:l TIMES expr:r {: RESULT=new Integer(l.intValue() * r.intValue()); :}

    |LPAREN expr:e RPAREN {: RESULT=e; :}

    |error SEMI {:System.out.println("Error de Sintaxis");:}

    ;

    Al igual que el archivo lex, el archivo cup esta comentado para una

    mejor comprensin.

  • 7/30/2019 6997331 Instalacion JLex CUP

    19/22

    Abrimos una ventana de D.O.S. en la carpeta C:\prueba y

    ejecutamos la instruccin:

    java java_cup.Main sintactico.cup

  • 7/30/2019 6997331 Instalacion JLex CUP

    20/22

    Para unir los archivos generados por el Jlex & CUP y obtener

    el analizador final ejecutamos la instruccin:

    javac -d . parser.java sym.java tok2.lex.java

  • 7/30/2019 6997331 Instalacion JLex CUP

    21/22

    El analizador que acabamos de crear reconoce expresiones

    aritmticas bsicas: suma, resta, multiplicacin y divisin. Los

    datos de entrada pueden escribirse en un archivo :

    Java Ejemplo.parser < entrada.txt

    5+3*6;

    5+3-4;

    (5+10)*2;

    8/2-10;

  • 7/30/2019 6997331 Instalacion JLex CUP

    22/22

    Tambin podemos ingresar expresiones desde consola:

    java Ejemplo.parser

    E ingresando:

    5*5-10+2*5; 1/1-1;

    10+3-5; 10/5+13-3;