Академический Документы
Профессиональный Документы
Культура Документы
JFlex
Diseo de compiladores
JFlex
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
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
[^]
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
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
text
Yylex.java
javac
%eofval{
System.out.println("line number=" + lineCounter);
return new Symbol(sym.EOF);
%eofval}
import java.io.*;
JFlex
Un ejemplo
}
}
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
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
Tester
23/03/2014
Fuente de JFlex
Modelo del lenguaje
Representacin intermedia
Fuente de JFlex
Fuente de CUP
Fuente de CUP