MANUALJFLEX sinCup

9
Universidad De San Carlo Facultad de Ingeniería Escuela de Ciencias y Sis Compiladores 1 Ing. José Rodolfo Calvo V Aux. Aura Luz Cifuentes Jflex es una herramienta desarro especificación en el que se indica JAVACUP es un analizador sintác Manu C EN WINDOWS los stemas Villagrán s Reyes ollada en Java, la cual genera un programa en Java a an los tokens permitidos por nuestro lenguaje con la ctico o sea un parser-generador vamos a gestionar jf ual Jflex Sin Cup Compiladores 1 Sección A a partir de una a ayuda flex.

description

Analisis lexico, compiladores, expresion regular, jflex, directivas

Transcript of MANUALJFLEX sinCup

Page 1: MANUALJFLEX sinCup

Universidad De San Carlos

Facultad de Ingeniería

Escuela de Ciencias y Sistemas

Compiladores 1

Ing. José Rodolfo Calvo Villagrán

Aux. Aura Luz Cifuentes Reyes

Jflex es una herramienta desarrollada en Java, la cual genera un especificación en el que se indican los tokens permitidos por nuestro lenguaje con la ayudaJAVACUP es un analizador sintáctico o sea un parser

Manual Jflex SinCompiladores 1

EN WINDOWS

Universidad De San Carlos

Escuela de Ciencias y Sistemas

Villagrán

Aux. Aura Luz Cifuentes Reyes

Jflex es una herramienta desarrollada en Java, la cual genera un programa en Java a partir de una especificación en el que se indican los tokens permitidos por nuestro lenguaje con la ayudaJAVACUP es un analizador sintáctico o sea un parser-generador vamos a gestionar jflex.

Manual Jflex Sin Cup Compiladores 1

Sección A

programa en Java a partir de una especificación en el que se indican los tokens permitidos por nuestro lenguaje con la ayuda

generador vamos a gestionar jflex.

Page 2: MANUALJFLEX sinCup

Manual Jflex Sin Cup Compiladores 1

Sección A

Instalación:

Paso 1: Descarga de Libreras

Descargamos las fuentes de JFlex en la página: http://jflex.de/download.html

Paso 2: Creación de Carpeta contenedora de fuentes

Creamos la Carpeta “Fuentes” dentro de la unidad C:

Descomprimimos el contenido de la carpeta anteriormente descargado: jflex-1.4.3 dentro de la

carpeta de Fuentes.

Paso 3: Creación de Archivo de Configuración Lexico.bat

Cambiamos la dirección de JAVA_HOME por la dirección de nuestra actual JDK.

Agregamos la dirección de nuestro actual proyecto.

Fichero: Lexico.bat

SET JAVA_HOME="C:\Program Files (x86)\Java\jdk1.6.0_17\bin" SET PATH=%JAVA_HOME%;%PATH% SET CLASSPATH=%JAVA_HOME%; SET JFLEX_HOME= C:\Fuentes\jflex-1.4.3 cd C:\Users\lucita\Documents\NetBeansProjects\SimpleLex\src\simplelex java -jar %JFLEX_HOME%\lib\JFlex.jar scanner.jflex pause

Paso 4: Creación de un proyecto de Netbeans

- File -> New Project -> Java Application

Project Name: SimpleLex

Page 3: MANUALJFLEX sinCup

Manual Jflex Sin Cup Compiladores 1

Sección A - Dentro de la carpeta del proyecto, agregamos una carpeta “lib”.

- Copiamos la librería: java-cup-11a-runtime.jar dentro de la carpeta lib.

- Clic secundario en Librerías, y le damos Agregar nuevo JAR/FOLDER.

Paso 5: Creación Scanner.jflex

Scanner.jflex:

package simplelex; import java_cup.runtime.Symbol; import java.util.LinkedList; %% tstring =[\"] [^\"\n]+ [\"\n] numero =[0-9]+ "."? [0-9]* letra =[a-zA-ZÑñ]+ iden ={letra}({letra}|{numero}|"_")* %cupsym simbolo %class scanner %cup %unicode %public %line

Page 4: MANUALJFLEX sinCup

Manual Jflex Sin Cup Compiladores 1

Sección A

%char %ignorecase %{ /* Lista con errores sintacticos */ public LinkedList<Errores> lista=new LinkedList<Errores>(); /* Metodo que es llamado al encontrar un error lexico */ private void ErrorScan(int linea, int columna, String valor){ lista.add(new Errores(linea, columna, "Error lexico en el caracter "+valor) ); } %} %% {tstring} {return new Symbol(simbolo.tstring, yychar,yyline,new String(yytext()));} {numero} {return new Symbol(simbolo.numero, yychar,yyline,new String(yytext()));} {iden} {return new Symbol(simbolo.iden, yychar,yyline,new String(yytext()));} [ \t\r\f\n]+ { /* Se ignoran */} . { ErrorScan(yyline,yychar,yytext()); }

Paso 6: Creación Errores.java

Fichero: Errores.java

package simplelex; public class Errores { protected Integer Linea; protected Integer Columna; protected String Descripcion; public Errores(Integer Linea, Integer Columna, String Descripcion) { this.Linea = Linea; this.Columna = Columna; this.Descripcion = Descripcion; } }

Paso 7: Creación Simbolo.java

Fichero: Simbolo.java Aquí declaras todos los tokens que definistes en el análisis lexico.

Page 5: MANUALJFLEX sinCup

Manual Jflex Sin Cup Compiladores 1

Sección A

public class simbolo { public static final int iden = 12; public static final int tstring = 11; public static final int EOF = 0; public static final int numero = 10; public static final int error = 1; }

NO OLVIDES DECLARAR EOF=0 y error=1.

ESTA CLASE REPRESENTA LOS TOKEN O COMPONENTES LEXICOS QUE FUERON DECLARADOS EN

JFLEX ej: {tstring} {return new Symbol(simbolo.tstring, yychar,yyline,new String(yytext()));}

Paso 8: Creación Main.java

Fichero: Main.java

package simplelex; import java_cup.runtime.Symbol; import java.io.BufferedReader; import java.io.StringReader; import java.util.Iterator; import java.util.LinkedList; public class Main { public static void main(String[] args) { //Archivo de entrada String VarString="xx yy 4 \"hola\" 5 \n"; VarString=VarString+"4 ww 5 \"hello\" ; \n"; //Lista de Errores LinkedList<Errores> lista=new LinkedList<Errores>(); System.out.println("*****"); try { //Instance del Scanner scanner scan = new scanner(new BufferedReader( new StringReader(VarString))); lista=scan.lista; Symbol sim=scan.next_token(); while(sim.sym!=0){ System.out.println(sim.value+" "+sim.sym); sim=scan.next_token(); } } catch (Exception ex) { } Iterator<Errores> it=lista.iterator(); /*Listar los errores */ while(it.hasNext()){ Errores error=it.next(); System.out.println("Linea: "+error.Linea+" Columna :"+error.Columna+" D: "+error.Descripcion ); } } }

Page 6: MANUALJFLEX sinCup

Funcionamiento

scanner scan = new scanner(new BufferedReader( new StringReader(V lista=scan.lista; Symbol sim=scan.next_token(); while(sim.sym!=0){ System.out.println(sim.value+" "+sim.sym); sim=scan.next_token(); }

Paso 8: Compilar

Le damos doble clic a los ficheros léxico.bat

JFlex: Jflex es una herramienta desarrollada en Java, la cual genera especificación en el que se indican los tokens permitidos por nuestro lenguaje con la ayudaJAVACUP es un analizador sintáctico o sea un parser

Un archivo de especificación para Jfletiene el siguiente formato:

Archivo.jflex

JFLEX

Archivo.java

javac

Archivo.class

Se crea una instancia de la clase

escáner sobre la variable scan

EOF = 0 , REPRESENTA EL FIN DEL

ARCHIVO FUE AGREGADO EN LA

CLASE SIMBOLO

Manual Jflex SinCompiladores 1

scanner scan = new scanner(new BufferedReader( new StringReader(VarString)));

Symbol sim=scan.next_token();

System.out.println(sim.value+" "+sim.sym); sim=scan.next_token();

Le damos doble clic a los ficheros léxico.bat luego compilamos el proyecto de netbeans.

Jflex es una herramienta desarrollada en Java, la cual genera un programa en Java a partir de una especificación en el que se indican los tokens permitidos por nuestro lenguaje con la ayudaJAVACUP es un analizador sintáctico o sea un parser-generador vamos a gestionar jflex.

Un archivo de especificación para Jflex está organizado en tres secciones, separadas por: “%%", y

Archivo.java

Archivo.class

de la clase

Nos devuelve el primer

declarado.

Obtenemos el siguiente token

Manual Jflex Sin Cup Compiladores 1

Sección A

arString)));

luego compilamos el proyecto de netbeans.

un programa en Java a partir de una especificación en el que se indican los tokens permitidos por nuestro lenguaje con la ayuda

generador vamos a gestionar jflex.

x está organizado en tres secciones, separadas por: “%%", y

Nos devuelve el primer símbolo

Obtenemos el siguiente token

Page 7: MANUALJFLEX sinCup

Manual Jflex Sin Cup Compiladores 1

Sección A Código de usuario %% Directivas Jflex %%

Expresiones regulares

Código de usuario: En esta sección se crean las clases necesarias para nuestro analizador lexico, las cuales

serán copiadas directamente al inicio del archivo de salida. Se importan los paquetes necesarios.

Directiva

En esta sección se incluyen algunas reglas propias de Jflex también se podrán una definición de

expresiones regulares para facilitar su uso después.

Definición Regular:

<nombre macro>= <expresión regular valida>

%char; %line Activar el conteo de caracteres y de líneas.

%class permite cambiar el nombre de la clase del analizador lexico, por default copia el definido en el archivo.

%cupsym Esta cambiara la clase de símbolos que genera por defecto Jflex sym por otro nombre.

%public permite que la clase del analizador léxico generada por Jflex sea una clase pública.

%cup Activa el uso de cup.

%init{ Código %init}

Permite agregar código al constructor de la clase generada por jflex, aquí se pueden inicializar las variables.

%unicode Usamos el formato unicode para trabajar con los ficheros

%standalone Indicamos a JFlex que queremos que genere su propio método main.

%ignorecase De las expresiones léxicas definidas diferencia entre mayúsculas y minúsculas.

%type String Indicamos el tipo que queremos que nos devuelva para los tokens. Dejará el token actual con la función yytext()

Page 8: MANUALJFLEX sinCup

Manual Jflex Sin Cup Compiladores 1

Sección A

Expresiones Regulares:

En esta sección se definen las expresiones regulares que representan los tokens de nuestro lenguaje, y que debemos hacer una vez detectados dichos tokens. Las reglas tienen 3 partes:

[<estado(s)>] <expresión> {<acción>}

Definición de Expresiones:

\t Representa un tabulador \r Representa el "regreso al inicio" o sea el lugar en que la línea vuelve a iniciar.

\n Representa la nueva línea. Como también el carácter que le dará inicio.

\f Representa un salto de página

\d Representa un dígito del 0 al 9 \v Representa un tabulador vertical

\s Representa un espacio en blanco. \w Representa cualquier carácter alfanumérico.

a | b unión esta expresión regular, que coincide con todas las entradas que se corresponde con a o b.

a b Concatenación Una letra que inicia con a, le sigue la letra b.

a* Cerradura Kleene

La a puede venir 0 o más veces.

a+ Cerradura Abierta

Es equivalente (a)a*

a? Cerradura cerrada

Es equivalente a una cerradura vacía.

a{n} Es equivalente a n, veces concatenado a.

a{n,m} Tiene un límite inferior y superior para concatenar las a.

"Expr" Se define un texto exacto que define la expresión regular.

{Identifier} Según una definición regular definida en el área de directivas podemos hacer uso de ellas.

[a-zA-Z] Definición de Rango de caracteres según el orden definido en ASCII.

Page 9: MANUALJFLEX sinCup

Manual Jflex Sin Cup Compiladores 1

Sección A