8
JLEX 1. Descripción General Es una herramienta que sirve de apoyo en la implementación de un analizador léxico, Ayuda al análisis léxico la primer fase de un compilador. 2. Instalación Para utilizar esta herramienta se debe baja el fuente de JLex (Main.java) de la pagina http://www.cs.princeton.edu/~appel/modern/java/JLex/current/Main.java . Se crea una carpeta en el directorio bin de nuestro jdk llamada JLex y dentro se baja el archivo Main.java Para compilar Jlex se utilizara las siguientes dos sentencias. Las clases se muestran como las siguientes Universidad de San Carlos de Guatemala Facultad de Ingeniería Escuela de Ciencias y Sistemas Organización de Lenguajes y Compiladores 1 2do. semestre del 2010 cd "G:\Archivos de programa\Java\jdk1.6.0_21\bin" javac JLex\Main.java

JLex

Embed Size (px)

DESCRIPTION

Es una herramienta que sirve de apoyo en la implementación de un analizador léxico, Ayuda al análisis léxico la primer fase de un compilador.

Citation preview

Page 1: JLex

JLEX

1. Descripción General

Es una herramienta que sirve de apoyo en la implementación de un analizador léxico,

Ayuda al análisis léxico la primer fase de un compilador.

2. Instalación

Para utilizar esta herramienta se debe baja el fuente de JLex (Main.java) de la pagina http://www.cs.princeton.edu/~appel/modern/java/JLex/current/Main.java. Se crea una carpeta en el directorio bin de nuestro jdk llamada JLex y dentro se baja el archivo Main.java Para compilar Jlex se utilizara las siguientes dos sentencias. Las clases se muestran como las siguientes

Universidad de San Carlos de Guatemala Facultad de Ingeniería Escuela de Ciencias y Sistemas Organización de Lenguajes y Compiladores 1

2do. semestre del 2010

cd "G:\Archivos de programa\Java\jdk1.6.0_21\bin"

javac JLex\Main.java

Page 2: JLex

Debemos bajar también la carpeta de java_cup en la ruta de nuestro bin del jdk.

Page 3: JLex

2.1 Ejemplo de JLex

Se propone el ejemplo de un analizador léxico que reconozca los componentes léxico

para las declaraciones de variables y las listas de asignaciones con expresiones.

Como el que se muestra a continuación:

Lo primero que se debe realizar en las definición de expresiones regulares para

Identificadores

Palabra reservadas (int, doublé, string)

Operadores (=,+,-,*,/,%)

Constantes (Numero,Cadena)

Otros componentes (Fin de línea, espacios y tabuladores)

int a1,a2,a3; double b1,b2,b3; string c_1,c_2,c_3; int d1; a1=1; b1=2.0; a2=a1+b1; b2=a1+b2; a3=a2+3; b3=b2*4.0; c_1="hola"; c_2="mundo"; c_3=c_1+" "+c_2; a3=(a1+b1)*(b2+a2);

b3=(a1%b1)/(b2%a2);

Page 4: JLex

Para esto se procede a definir las expresiones regulares y las reglas en el archivo léxico.lex como se muestra a continuación.

package ejemplo; import java_cup.runtime.*; import javax.swing.*; import java.util.*; %% %class Yylex %{String literal; String temp_include; %} %{ int columna=1; %} %public %cup %line %full %unicode %ignorecase %char %{ public String sourceFilename; StringBuffer string = new StringBuffer(); int ultimoEstado = 0; public void init(){}; %} %eofval{ {return new Symbol(Token.EOF, null); } %eofval} ALPHA=[A-Za-zÑñ] DIGITO=[0-9] IDENTIFICADOR={ALPHA}({ALPHA}|{DIGITO}|"_")* NUMERO=({DIGITO})+"."({DIGITO})+ CADENA=[\"] [^\"\n]+ [\"\n] %% [\n] { yychar=0;}

[ \t\r\n\f] { /* ignore white space. */ }

\’ { /* ignore apostrofos. */ }

Page 5: JLex

<YYINITIAL> [\t\r\f] {/*no hace nada, aumenta una columna*/yychar++; }

<YYINITIAL> [\n] {yychar=0; /*yyline=0*/}

<YYINITIAL>"(" { return new Symbol(Token.OPEN, yyline, yychar, yytext());}

<YYINITIAL>")" { return new Symbol(Token.CLOSE, yyline, yychar, yytext());}

<YYINITIAL>"+" { return new Symbol(Token.PLUS, yyline, yychar, yytext());}

<YYINITIAL>"-" { return new Symbol(Token.MIN, yyline, yychar, yytext());}

<YYINITIAL>"*" { return new Symbol(Token.BY, yyline, yychar, yytext());}

<YYINITIAL>"/" { return new Symbol(Token.DIV, yyline, yychar, yytext());}

<YYINITIAL>"%" { return new Symbol(Token.MOD, yyline, yychar, yytext());}

<YYINITIAL>"=" { return new Symbol(Token.EQUAL, yyline, yychar, yytext());}

<YYINITIAL>"," { return new Symbol(Token.COMA, yyline, yychar, yytext());

<YYINITIAL>";" { return new Symbol(Token.POINTCOMA, yyline, yychar,

yytext());}

<YYINITIAL>"int" { return new Symbol(Token.INT, yyline, yychar, yytext());}

<YYINITIAL>"double" { return new Symbol(Token.DOUBLE, yyline, yychar,

yytext());}

<YYINITIAL>"string" { return new Symbol(Token.STRING, yyline, yychar,

yytext());}

<YYINITIAL>{NUMERO} { return new Symbol(Token.NUMERO, yyline, yychar,

yytext());}

<YYINITIAL>{IDENTIFICADOR} { return new Symbol(Token.IDENTIFICADOR,

yyline, yychar, yytext());}

<YYINITIAL>{CADENA} { return new Symbol(Token.CADENA, yyline, yychar,

yytext());}

. {

System.out.println("error lexico en la fila "+yyline +" y en la columna " + yychar);

//interfaz.rotular(“error lexico :”+ yytext()+” en la fila “+yyline +” y en la

columna ” + yychar);

}

Page 6: JLex

Para poder utilizar únicamente en analizador léxico de JLex se debe de crear una clase a la que llamaremos Token que contendrá todos los token a devolver por nuestro léxico.lex.

package ejemplo;

/** CUP generated class containing symbol constants. */

public class Token {

/* terminals */

public static final int MOD = 8;

public static final int CADENA = 17;

public static final int PLUS = 4;

public static final int CLOSE = 3;

public static final int INT = 12;

public static final int EQUAL = 9;

public static final int STRING = 14;

public static final int COMA = 10;

public static final int EOF = 0;

public static final int BY = 6;

public static final int DIV = 7;

public static final int error = 1;

public static final int NUMERO = 16;

public static final int IDENTIFICADOR = 15;

public static final int MIN = 5;

public static final int OPEN = 2;

public static final int POINTCOMA = 11;

public static final int DOUBLE = 13;

}

Page 7: JLex

Despues se debe compilar con las herramienta de Jlex creando el archivo bat mostrado a

continuacion y ejecutándolo

Se ejecuta este archivo y nos dara como resultado un archivo al cual renombramos como

Yylex y que será nuestro analizador lexico.

Para probarlo se debe crear un proyecto con el nombre que más se prefiera en este caso

Ejemplo. Y copiar en directorio de src las carpetas de JLex y java_cup, además en la

carpeta del paquete principal en src se debe copiar los archivos generados Yylex.java y

Token.java junto al Main el cual debe tener el código siguiente

cd "G:\Archivos de programa\Java\jdk1.6.0_21\bin"

set CLASSPATH=G:\Archivos de

programa\Java\jdk1.6.0_21\bin;%CLASSPATH%

set PATH=G:\Archivos de programa\Java\jdk1.6.0_21\bin;%PATH%

cd "G:\Documents and Settings\db2admin\Mis

documentos\NetBeansProjects\Ejemplo\src\ejemplo"

del Yylex.java

java JLex.Main lexico.lex

rename lexico.lex.java Yylex.java

pause

public static void main(String[] args) throws FileNotFoundException, IOException { // TODO code application logic here try{ File f=new File("entrada.txt"); BufferedReader r=new BufferedReader(new FileReader(f)); Yylex scanner=new Yylex(r); Symbol symbol=scanner.next_token(); while(symbol!=null){ System.out.println("token: "+symbol.sym+" valor: "+symbol.value); symbol=(symbol.sym==0) ?null:scanner.next_token(); } } catch(FileNotFoundException e){System.out.println(e.getMessage());} }

Page 8: JLex

Links de de consulta

http://muytux.blogspot.com/2010/07/manual-de-jflex.html

http://www.basketcase.net84.net/index/?p=318

http://www.cs.princeton.edu/~appel/modern/java/JLex/