Instalación JLex & CUP
Instalación JLex & CUP
Instalación JLex & CUP
USAC
Facultad de Ingeniería
Manuel Elias Muhún Esquit
200018480
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 válidos para un lenguaje que
deseamos reconocer. Dicho de otro modo Jlex es una herramienta
para generar analizadores léxicos.
Presionare el botón
Environment Varialbes
(Variables de Entorno)
Nos posicionamos sobre la
variable de entorno
CLASSPATH, y
presionamos el botón Edit
(Editar).
Si la variable de entorno no
existe, entonces debe ser
creada presionando el
botón New (Nuevo) y
agregar los datos
correspondientes.
Nos ubicamos al final de la cadena dentro de Variable Value
(Valor de la Variable) y agregamos punto y coma, seguido del
Path de ubicación de la carpeta bin de la instalación del JDK, en
ejemplo se agrega la cadena: “;C:\Program
Files\Java\jdk1.6.0\bin” sin las comillas.
package Ejemplo;
import java_cup.runtime.Symbol;
/*Nota:
Jlex no acepta comentarios debajo de este símbolo de doble porcentaje.
*/
%%
%{
//declaración de variables y código 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 código: algún calculo o asignación*/
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()));}
[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 serán ejecutadas cada vez que el analizador
lexico encuentre algun lexema que no concuerde con cualquiera de los
componentes lexicos especificados. Por ejemplo, al encontrar un simbolo
como la @ estre imprimira en la shell "Caracter Ilegal: @". la función
yytext() devuelve el ultimo lexema levantado por el analizador lexico.*/
}
. {System.out.println("Caracter Ilegal: "+yytext());}
import java.io.*;
import java_cup.runtime.*; //Clase que incluye las instrucciones de CUP
//presedencia de operadores
precedence left PLUS, MINUS;
precedence left TIMES, DIVI;
/*
Gramática: el lado izquierdo es reemplazado por su correspondiente producción
si es un no terminal. las acciones semánticas 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 blouqes
anteriores.
*/
expr_list ::= expr_list expr_part
|expr_part
;
Al igual que el archivo lex, el archivo cup esta comentado para una
mejor comprensión.
Abrimos una ventana de D.O.S. en la carpeta C:\prueba y
ejecutamos la instrucción:
5+3*6;
5+3-4;
(5+10)*2;
8/2-10;
También 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;