You are on page 1of 6

23/03/2014

JFlex

Diseo de compiladores
JFlex

Es un generador de analizadores lexicogrficos


Esta desarrollado en Java y genera
analizadores en cdigo Java
Es una reescritura de la herramienta JLex, la
cual es una reescritura de la herramienta
lex/flex para Unix
Esta pensado para ser usado en conjunto con
el generador de parsers LALR CUP

JFlex
Es open source
Puede ser descargado de la pagina del curso o del
sitio de JFlex
http://jflex.de/download.html

http://jflex.de/manual.html

Entrada
Archivo con la especificacin del scanner

Salida
El analizador lxico (scanner)
Escrito en cdigo Java
JFlex
Especificacion.lex

Texto del
programa
Scanner.class

Puede ser utilizado en forma standalone o


integrado con Eclipse, a travs de una tarea ANT
o de la herramienta de gestin de proyecto
MAVEN
Informacin detallada del funcionamiento se
puede encontrar en el manual en lnea:

Funcionamiento

javac
Scanner.java
Lista de
tokens

Archivo de especificacin
Cdigo de usuario
Copiado directamente al scanner

%%
Directivas JFlex
Definen macros, nombres de estados

%%
Reglas del analizador
Expresiones regulares
Cambios de estado
Acciones cuando se localiza un token

Cdigo de usuario
Definicin de packages
Importaciones necesarias
Cualquier cdigo de ayuda necesario para que el
scanner funcione correctamente
Generalmente contiene cdigo utilizado desde las
acciones realizadas al encontrar un token
package uy.edu.fing.compiladores.obligatorio
import java.util.Stack;
public void debug(String texto) {
System.out.println(texto);
}

23/03/2014

Directivas JFlex
Directivas: Controlan el comportamiento de JFlex
%line: Prende el conteo de lneas
%char: Prende el conteo de caracteres
%class class-name: Cambia el nombre de la clase
generada
%cup: Activa la compatibilidad con CUP
%type token-class-name: Clase usar para el Token
%public: Hace que la clase generada es publica
%function read-token-method
%scanerror exception-type-name

Directivas JFlex
Definiciones de estado
%state nombre-de-estado

Definiciones de macro
nombre-de-macro = expresion regular

Expresiones regulares
r$
. (dot)
"..."
{name}
*
+
?
(...)

a|b
[...]

ab
[^]

match reg. exp. r at end of a line


any character except the newline
verbatim string
macro expansion
zero or more repetitions
one or more repetitions
zero or one repetitions
grouping within regular expressions
match a or b
class of characters - any one character enclosed in
brackets
range of characters
negated class any one not enclosed in brackets

Reglas
Estructura de las reglas
[estados] regexp { accin (cdigo java) }
regexp: Describe como detectar los tokens
Prioridad para el matcheo de la regla: El string
mas largo
Si para el mismo largo tenemos mas de una
concordancia: La primera regla es la que se utiliza

Importante:
Las reglas deben matchear toda posible entrada

Macros

ALPHA=[A-Za-z_]
DIGIT=[0-9]
ALPHA_NUMERIC={ALPHA}|{DIGIT}
IDENT={ALPHA}({ALPHA_NUMERIC})*
NUMBER=({DIGIT})+
WHITE_SPACE=([\ \n\r\t\f])+

Acciones
Escritas en cdigo Java
Puede utilizar mtodos y variables especiales
provistos por JFlex
yytext(): Retorna el lexema del token actual
yyline: Retorna el numero de lnea

Transiciones de estado
yybegin(nombre-estado): Le indica a JFlex para
saltar al nuevo estado
YYINITIAL: Nombre que le da JFlex al estado inicial

23/03/2014

Cambios de estado
YYINITIAL

Cambios de estado
<YYINITIAL> {NUMBER} {
return new Symbol(sym.NUMBER, yytext(), yyline));
}
<YYINITIAL> {WHITE_SPACE} { }

COMMENTS

//

<YYINITIAL> "+" {
return new Symbol(sym.PLUS, yytext(), yyline);
}
<YYINITIAL> "-" {
return new Symbol(sym.MINUS, yytext(), yyline);
}
<YYINITIAL> "*" {
return new Symbol(sym.TIMES, yytext(), yyline);
}
...
<YYINITIAL> "//" { yybegin(COMMENTS); }
<COMMENTS> [^\n] { }
<COMMENTS> [\n] { yybegin(YYINITIAL); }
<YYINITIAL> . { return new Symbol(sym.error, null); }

^\n

\n

Contador de lneas: lineCount.lex


import java_cup.runtime.Symbol;
%%
%cup
%{
private int lineCounter = 0;
%}

Contador de lneas: lineCount.lex


java JFlex.Main lineCount.lex
lineCount.lex

javac *.java
Main.java

NEWLINE=\n
%%
<YYINITIAL>{NEWLINE} {
lineCounter++;
}
<YYINITIAL>[^{NEWLINE}] { }

} catch (Exception e) {
throw new RuntimeException("IO Error (brutal exit) +
e.toString());
}

Lexical
analyzer

tokens

sym.java

JFlex y JavaCUP deben estar en el CLASSPATH, junto con cualquier otra


biblioteca necesaria para que el programa funcione

Contador de lneas: lineCount.lex


public class Main {
public static void main(String[] args) {
Symbol currToken;
try {
FileReader txtFile = new FileReader(args[0]);
Yylex scanner = new Yylex(txtFile);
do {
currToken = scanner.next_token();
// do something with currToken
} while (currToken.sym != sym.EOF);

text

Yylex.java

javac

%eofval{
System.out.println("line number=" + lineCounter);
return new Symbol(sym.EOF);
%eofval}

import java.io.*;

JFlex

Un ejemplo

Un compilador sencillo de expresiones


Soporta +, -, * y /
Maneja enteros, flotantes e identificadores
Construiremos el analizador lxico y el
analizador sintctico
Lo vamos a embeber dentro de un proyecto
Eclipse (para posterior reutilizacin)

}
}

23/03/2014

Proyecto Eclipse
Creamos un proyecto Eclipse estndar
(Aplicacin Java de consola)
Separamos directorios src (fuentes) y bin (clases)
Creamos un directorio lib (para almacenar
bibliotecas externas)
Creamos una carpeta language para almacenar
los archivos relacionados con JFlex y Cup

Seccin Java del compilador


Relacionada al modelado del
lenguaje y al control del
proceso de compilacin

Biblioteca de soporte
utilizada para la ejecucin del
programa (Al ejecutar el
parse en runtime
necesitamos esto)

Todo lo relacionado a la
generacin de los elementos
de anlisis (lxico y sintctico)
va en esta carpeta

Fsicamente, la dependencia
anterior va en esta carpeta

23/03/2014

Archivo con la especificacin


sintctica del lenguaje (para
CUP)

Archivo con la especificacin


lxica del lenguaje (para
JFlex)

Script ANT para la ejecucin


del CUP y JFlex

Modelado del lenguaje


El proceso de anlisis genera
esta estructura para posterior
procesamiento

Clases generadas por el


proceso de anlisis (lxico y
sintctico)

Tester

23/03/2014

Fuente de JFlex
Modelo del lenguaje
Representacin intermedia

Fuente de JFlex

Fuente de CUP

Fuente de CUP

Que hace nuestro compilador?


Leer el fuente (en este caso un string, pero puede
ser un archivo)
Analizarlo lexicalmente
Analizarlo sintcticamente
Construir una estructura que nos permita
procesar lo ledo
En este caso, solo lo recorremos para mostrarlo en
otro formato

Nuestro compilador es mas bien un traductor

You might also like