Documentos de Académico
Documentos de Profesional
Documentos de Cultura
JFlex
• Es un generador de analizadores lexicográficos
• Esta desarrollado en Java y genera
Diseño de compiladores analizadores en código Java
• Es una reescritura de la herramienta JLex, la
JFlex 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 Funcionamiento
• Es open source • Entrada
• Puede ser descargado de la pagina del curso o del – Archivo con la especificación del scanner
sitio de JFlex
– http://jflex.de/download.html • Salida
• Puede ser utilizado en forma standalone o – El analizador léxico (scanner) Texto del
integrado con Eclipse, a través de una tarea ANT
o de la herramienta de gestión de proyecto – Escrito en código Java programa
MAVEN
Scanner.class
• Información detallada del funcionamiento se JFlex javac
puede encontrar en el manual en línea:
– http://jflex.de/manual.html Especificacion.lex Scanner.java
Lista de
tokens
1
23/03/2014
Reglas Acciones
• Estructura de las reglas • Escritas en código Java
– [estados] regexp { acción (código java) } • Puede utilizar métodos y variables especiales
– regexp: Describe como detectar los tokens provistos por JFlex
– Prioridad para el matcheo de la regla: El string – yytext(): Retorna el lexema del token actual
mas largo – yyline: Retorna el numero de línea
– Si para el mismo largo tenemos mas de una • Transiciones de estado
concordancia: La primera regla es la que se utiliza
– yybegin(nombre-estado): Le indica a JFlex para
• Importante: saltar al nuevo estado
– Las reglas deben matchear toda posible entrada – YYINITIAL: Nombre que le da JFlex al estado inicial
2
23/03/2014
<YYINITIAL> "+" {
‘//’ return new Symbol(sym.PLUS, yytext(), yyline);
^\n
}
<YYINITIAL> "-" {
return new Symbol(sym.MINUS, yytext(), yyline);
}
<YYINITIAL> "*" {
return new Symbol(sym.TIMES, yytext(), yyline);
\n }
...
<YYINITIAL> "//" { yybegin(COMMENTS); }
<COMMENTS> [^\n] { }
<COMMENTS> [\n] { yybegin(YYINITIAL); }
<YYINITIAL> . { return new Symbol(sym.error, null); }
NEWLINE=\n
%%
sym.java
<YYINITIAL>{NEWLINE} {
lineCounter++;
}
<YYINITIAL>[^{NEWLINE}] { } JFlex y JavaCUP deben estar en el CLASSPATH, junto con cualquier otra
biblioteca necesaria para que el programa funcione
3
23/03/2014
Proyecto Eclipse
• Creamos un proyecto Eclipse estándar
(Aplicación 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
Todo lo relacionado a la
generación de los elementos
de análisis (léxico y sintáctico)
va en esta carpeta
Físicamente, la dependencia
anterior va en esta carpeta
4
23/03/2014
Tester
5
23/03/2014
Fuente de JFlex
Fuente de CUP