SlideShare una empresa de Scribd logo
23/03/2014
1
Diseño de compiladores
JFlex
JFlex
• Es un generador de analizadores lexicográficos
• Esta desarrollado en Java y genera
analizadores en código 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
• Puede ser utilizado en forma standalone o
integrado con Eclipse, a través de una tarea ANT
o de la herramienta de gestión de proyecto
MAVEN
• Información detallada del funcionamiento se
puede encontrar en el manual en línea:
– http://jflex.de/manual.html
Funcionamiento
• Entrada
– Archivo con la especificación del scanner
• Salida
– El analizador léxico (scanner)
– Escrito en código Java
Especificacion.lex
JFlex
Scanner.java
javac
Scanner.class
Texto del
programa
Lista de
tokens
Archivo de especificación
• Código 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
Código de usuario
• Definición de packages
• Importaciones necesarias
• Cualquier código de ayuda necesario para que el
scanner funcione correctamente
• Generalmente contiene código 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
2
Directivas JFlex
• Directivas: Controlan el comportamiento de JFlex
– %line: Prende el conteo de líneas
– %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 $ match reg. exp. r at end of a line
. (dot) any character except the newline
"..." verbatim string
{name} macro expansion
* zero or more repetitions
+ one or more repetitions
? zero or one repetitions
(...) grouping within regular expressions
a|b match a or b
[...]
class of characters - any one character enclosed in
brackets
a–b range of characters
[^…] negated class – any one not enclosed in brackets
Macros
• ALPHA=[A-Za-z_]
• DIGIT=[0-9]
• ALPHA_NUMERIC={ALPHA}|{DIGIT}
• IDENT={ALPHA}({ALPHA_NUMERIC})*
• NUMBER=({DIGIT})+
• WHITE_SPACE=([ nrtf])+
Reglas
• Estructura de las reglas
– [estados] regexp { acción (código 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
Acciones
• Escritas en código Java
• Puede utilizar métodos y variables especiales
provistos por JFlex
– yytext(): Retorna el lexema del token actual
– yyline: Retorna el numero de línea
• 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
3
Cambios de estado
YYINITIAL COMMENTS
‘//’
n
^n
Cambios de estado
<YYINITIAL> {NUMBER} {
return new Symbol(sym.NUMBER, yytext(), yyline));
}
<YYINITIAL> {WHITE_SPACE} { }
<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); }
Contador de líneas: lineCount.lex
import java_cup.runtime.Symbol;
%%
%cup
%{
private int lineCounter = 0;
%}
%eofval{
System.out.println("line number=" + lineCounter);
return new Symbol(sym.EOF);
%eofval}
NEWLINE=n
%%
<YYINITIAL>{NEWLINE} {
lineCounter++;
}
<YYINITIAL>[^{NEWLINE}] { }
Contador de líneas: lineCount.lex
JFlex
javac
lineCount.lex
Lexical
analyzer
text
tokens
Yylex.java
java JFlex.Main lineCount.lex
javac *.java
Main.java
sym.java
JFlex y JavaCUP deben estar en el CLASSPATH, junto con cualquier otra
biblioteca necesaria para que el programa funcione
Contador de líneas: lineCount.lex
import java.io.*;
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);
} catch (Exception e) {
throw new RuntimeException("IO Error (brutal exit)” +
e.toString());
}
}
}
Un ejemplo
• Un “compilador” sencillo de expresiones
• Soporta +, -, * y /
• Maneja enteros, flotantes e identificadores
• Construiremos el analizador léxico y el
analizador sintáctico
• Lo vamos a embeber dentro de un proyecto
Eclipse (para posterior reutilización)
23/03/2014
4
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
Sección “Java” del compilador
Relacionada al modelado del
lenguaje y al control del
proceso de compilación
Biblioteca de soporte
utilizada para la ejecución del
programa (Al ejecutar el
parse en runtime
necesitamos esto)
Físicamente, la dependencia
anterior va en esta carpeta
Todo lo relacionado a la
generación de los elementos
de análisis (léxico y sintáctico)
va en esta carpeta
23/03/2014
5
Archivo con la especificación
sintáctica del lenguaje (para
CUP)
Archivo con la especificación
léxica del lenguaje (para
JFlex)
Script ANT para la ejecución
del CUP y JFlex
Modelado del lenguaje
El proceso de análisis genera
esta estructura para posterior
procesamiento
Clases generadas por el
proceso de análisis (léxico y
sintáctico)
Tester
23/03/2014
6
Modelo del lenguaje
Representación intermedia
Fuente de JFlex
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 sintácticamente
• Construir una estructura que nos permita
procesar lo leído
– En este caso, solo lo recorremos para mostrarlo en
otro formato
• Nuestro “compilador” es mas bien un “traductor”

Más contenido relacionado

La actualidad más candente

Tabla comparativa de herramientas case oswaldo mauleon
Tabla comparativa de herramientas case oswaldo mauleon Tabla comparativa de herramientas case oswaldo mauleon
Tabla comparativa de herramientas case oswaldo mauleon
oswaldoyuneri
 
Taxonomia de las herramientas case
Taxonomia de las herramientas caseTaxonomia de las herramientas case
Taxonomia de las herramientas case
isidro luna beltran
 
Análisis de Requerimientos
Análisis de RequerimientosAnálisis de Requerimientos
Análisis de Requerimientos
UTPL UTPL
 
Ensamblador y enlazador
Ensamblador y enlazadorEnsamblador y enlazador
Ensamblador y enlazador
RickyZhengHu
 
Tipos de pruebas de software
Tipos de pruebas de softwareTipos de pruebas de software
Tipos de pruebas de software
Guillermo Lemus
 
Documentación de Software
Documentación de Software Documentación de Software
Documentación de Software
waqoak
 
MODELO DE PROCESOS DEL SOFTWARE
MODELO DE PROCESOS DEL SOFTWAREMODELO DE PROCESOS DEL SOFTWARE
MODELO DE PROCESOS DEL SOFTWARE
Micky Jerzy
 
Métodos Formales
Métodos FormalesMétodos Formales
Métodos Formales
Natalia Herrera Rey
 
Programación lógica y funcional
Programación lógica y funcionalProgramación lógica y funcional
Programación lógica y funcional
Alejandra MA
 
Lenguajes autómatas.
Lenguajes autómatas.Lenguajes autómatas.
Lenguajes autómatas.
LuiS YmAY
 
Procedimiento Para Utilizar Flex Y Bison
Procedimiento Para Utilizar Flex Y Bison Procedimiento Para Utilizar Flex Y Bison
Procedimiento Para Utilizar Flex Y Bison
Raul Hernandez Mayo
 
Requerimientos del software
Requerimientos del software Requerimientos del software
Requerimientos del software
Rosa Virginia Ortega Loaiza
 
Procesos De Ingenieria Del Software
Procesos De Ingenieria Del SoftwareProcesos De Ingenieria Del Software
Procesos De Ingenieria Del Software
Raquel Solano
 
TABLA DE SÍMBOLOS
TABLA DE SÍMBOLOSTABLA DE SÍMBOLOS
TABLA DE SÍMBOLOS
Infomania pro
 
Clase6 ejemplo analisis lexico dev cpp
Clase6 ejemplo analisis lexico dev cppClase6 ejemplo analisis lexico dev cpp
Clase6 ejemplo analisis lexico dev cpp
Infomania pro
 
Tabla de símbolos
Tabla de símbolosTabla de símbolos
Modelado Orientado a Objetos
Modelado Orientado a ObjetosModelado Orientado a Objetos
Modelado Orientado a Objetos
Rafael Miranda
 
Yacc
YaccYacc
6 Sistemas Basados en Reglas - Arquitectura Detallada
6 Sistemas Basados en Reglas - Arquitectura Detallada6 Sistemas Basados en Reglas - Arquitectura Detallada
6 Sistemas Basados en Reglas - Arquitectura Detallada
ESCOM
 
Tópicos Avanzados de Programación - Unidad 4 Acceso a datos
Tópicos Avanzados de Programación - Unidad 4 Acceso a datosTópicos Avanzados de Programación - Unidad 4 Acceso a datos
Tópicos Avanzados de Programación - Unidad 4 Acceso a datos
José Antonio Sandoval Acosta
 

La actualidad más candente (20)

Tabla comparativa de herramientas case oswaldo mauleon
Tabla comparativa de herramientas case oswaldo mauleon Tabla comparativa de herramientas case oswaldo mauleon
Tabla comparativa de herramientas case oswaldo mauleon
 
Taxonomia de las herramientas case
Taxonomia de las herramientas caseTaxonomia de las herramientas case
Taxonomia de las herramientas case
 
Análisis de Requerimientos
Análisis de RequerimientosAnálisis de Requerimientos
Análisis de Requerimientos
 
Ensamblador y enlazador
Ensamblador y enlazadorEnsamblador y enlazador
Ensamblador y enlazador
 
Tipos de pruebas de software
Tipos de pruebas de softwareTipos de pruebas de software
Tipos de pruebas de software
 
Documentación de Software
Documentación de Software Documentación de Software
Documentación de Software
 
MODELO DE PROCESOS DEL SOFTWARE
MODELO DE PROCESOS DEL SOFTWAREMODELO DE PROCESOS DEL SOFTWARE
MODELO DE PROCESOS DEL SOFTWARE
 
Métodos Formales
Métodos FormalesMétodos Formales
Métodos Formales
 
Programación lógica y funcional
Programación lógica y funcionalProgramación lógica y funcional
Programación lógica y funcional
 
Lenguajes autómatas.
Lenguajes autómatas.Lenguajes autómatas.
Lenguajes autómatas.
 
Procedimiento Para Utilizar Flex Y Bison
Procedimiento Para Utilizar Flex Y Bison Procedimiento Para Utilizar Flex Y Bison
Procedimiento Para Utilizar Flex Y Bison
 
Requerimientos del software
Requerimientos del software Requerimientos del software
Requerimientos del software
 
Procesos De Ingenieria Del Software
Procesos De Ingenieria Del SoftwareProcesos De Ingenieria Del Software
Procesos De Ingenieria Del Software
 
TABLA DE SÍMBOLOS
TABLA DE SÍMBOLOSTABLA DE SÍMBOLOS
TABLA DE SÍMBOLOS
 
Clase6 ejemplo analisis lexico dev cpp
Clase6 ejemplo analisis lexico dev cppClase6 ejemplo analisis lexico dev cpp
Clase6 ejemplo analisis lexico dev cpp
 
Tabla de símbolos
Tabla de símbolosTabla de símbolos
Tabla de símbolos
 
Modelado Orientado a Objetos
Modelado Orientado a ObjetosModelado Orientado a Objetos
Modelado Orientado a Objetos
 
Yacc
YaccYacc
Yacc
 
6 Sistemas Basados en Reglas - Arquitectura Detallada
6 Sistemas Basados en Reglas - Arquitectura Detallada6 Sistemas Basados en Reglas - Arquitectura Detallada
6 Sistemas Basados en Reglas - Arquitectura Detallada
 
Tópicos Avanzados de Programación - Unidad 4 Acceso a datos
Tópicos Avanzados de Programación - Unidad 4 Acceso a datosTópicos Avanzados de Programación - Unidad 4 Acceso a datos
Tópicos Avanzados de Programación - Unidad 4 Acceso a datos
 

Destacado

Custom Language Plugin for JetBrains IDEA
Custom Language Plugin for JetBrains IDEACustom Language Plugin for JetBrains IDEA
Custom Language Plugin for JetBrains IDEA
Alexander Zastashkov
 
Write Your Own Compiler in 24 Hours
Write Your Own Compiler in 24 HoursWrite Your Own Compiler in 24 Hours
Write Your Own Compiler in 24 Hours
Phillip Trelford
 
Esprima - What is that
Esprima - What is thatEsprima - What is that
Esprima - What is that
Abhijeet Pawar
 
Lexing and parsing
Lexing and parsingLexing and parsing
Lexing and parsing
Elizabeth Smith
 
Creating own language made easy
Creating own language made easyCreating own language made easy
Creating own language made easy
Ingvar Stepanyan
 
Write Your Own JVM Compiler
Write Your Own JVM CompilerWrite Your Own JVM Compiler
Write Your Own JVM Compiler
Erin Dees
 

Destacado (6)

Custom Language Plugin for JetBrains IDEA
Custom Language Plugin for JetBrains IDEACustom Language Plugin for JetBrains IDEA
Custom Language Plugin for JetBrains IDEA
 
Write Your Own Compiler in 24 Hours
Write Your Own Compiler in 24 HoursWrite Your Own Compiler in 24 Hours
Write Your Own Compiler in 24 Hours
 
Esprima - What is that
Esprima - What is thatEsprima - What is that
Esprima - What is that
 
Lexing and parsing
Lexing and parsingLexing and parsing
Lexing and parsing
 
Creating own language made easy
Creating own language made easyCreating own language made easy
Creating own language made easy
 
Write Your Own JVM Compiler
Write Your Own JVM CompilerWrite Your Own JVM Compiler
Write Your Own JVM Compiler
 

Similar a 04 j flex

Estructura básica de un programa en C++
Estructura básica de un programa en C++Estructura básica de un programa en C++
Estructura básica de un programa en C++
Rosbelia Balza
 
Java 8 - Nuevas características
Java 8 - Nuevas característicasJava 8 - Nuevas características
Java 8 - Nuevas características
Fernando Petrola
 
Estructura basica de_un_programa_c_
Estructura basica de_un_programa_c_Estructura basica de_un_programa_c_
Estructura basica de_un_programa_c_
Maztherprozh
 
Estructura basica de_un_programa_c_ (1)
Estructura basica de_un_programa_c_ (1)Estructura basica de_un_programa_c_ (1)
Estructura basica de_un_programa_c_ (1)
Maztherprozh
 
Java 8
Java 8Java 8
Java 8
BVision
 
JAVA.PPT
JAVA.PPTJAVA.PPT
JAVA.PPT
GalvanGR
 
JAVA (1).PPT
JAVA (1).PPTJAVA (1).PPT
JAVA (1).PPT
miguel checa
 
JAVA (1).PPT
JAVA (1).PPTJAVA (1).PPT
JAVA (1).PPT
DanielHidalgo92
 
Bt haskell-1
Bt haskell-1Bt haskell-1
Bt haskell-1
Rosana Alvarez
 
TUTORIAL JAVA
TUTORIAL JAVATUTORIAL JAVA
TUTORIAL JAVA
denis ticona condori
 
TALLER FLEX Y BISON
TALLER FLEX Y BISONTALLER FLEX Y BISON
TALLER FLEX Y BISON
Anthony Benalcazar
 
FLEX Y BISON
FLEX Y BISONFLEX Y BISON
FLEX Y BISON
Anthony Benalcazar
 
Unidad 2 Sintaxis en java
Unidad 2 Sintaxis en javaUnidad 2 Sintaxis en java
Unidad 2 Sintaxis en java
Cindy Adriana Bohórquez Santana
 
Sintaxisenjava
Sintaxisenjava Sintaxisenjava
Sintaxisenjava
Victor Zapata
 
Manejo de memoria
Manejo de memoriaManejo de memoria
Manejo de memoria
Valentin Manzano
 
Scala en proyectos de vinculación Ancap-UR - 2013-03
Scala en proyectos de vinculación Ancap-UR - 2013-03Scala en proyectos de vinculación Ancap-UR - 2013-03
Scala en proyectos de vinculación Ancap-UR - 2013-03
Germán Ferrari
 
Curso prog sist
Curso prog sistCurso prog sist
Curso prog sist
Tony Potter
 
Apuntes scilab
Apuntes scilabApuntes scilab
Apuntes scilab
Ricardo Gutierrez
 
Apuntes scilab
Apuntes scilabApuntes scilab
Apuntes scilab
AbelRodrguez9
 
Introduccion rapida a SCILAB.pdf
Introduccion rapida a SCILAB.pdfIntroduccion rapida a SCILAB.pdf
Introduccion rapida a SCILAB.pdf
cursosrams
 

Similar a 04 j flex (20)

Estructura básica de un programa en C++
Estructura básica de un programa en C++Estructura básica de un programa en C++
Estructura básica de un programa en C++
 
Java 8 - Nuevas características
Java 8 - Nuevas característicasJava 8 - Nuevas características
Java 8 - Nuevas características
 
Estructura basica de_un_programa_c_
Estructura basica de_un_programa_c_Estructura basica de_un_programa_c_
Estructura basica de_un_programa_c_
 
Estructura basica de_un_programa_c_ (1)
Estructura basica de_un_programa_c_ (1)Estructura basica de_un_programa_c_ (1)
Estructura basica de_un_programa_c_ (1)
 
Java 8
Java 8Java 8
Java 8
 
JAVA.PPT
JAVA.PPTJAVA.PPT
JAVA.PPT
 
JAVA (1).PPT
JAVA (1).PPTJAVA (1).PPT
JAVA (1).PPT
 
JAVA (1).PPT
JAVA (1).PPTJAVA (1).PPT
JAVA (1).PPT
 
Bt haskell-1
Bt haskell-1Bt haskell-1
Bt haskell-1
 
TUTORIAL JAVA
TUTORIAL JAVATUTORIAL JAVA
TUTORIAL JAVA
 
TALLER FLEX Y BISON
TALLER FLEX Y BISONTALLER FLEX Y BISON
TALLER FLEX Y BISON
 
FLEX Y BISON
FLEX Y BISONFLEX Y BISON
FLEX Y BISON
 
Unidad 2 Sintaxis en java
Unidad 2 Sintaxis en javaUnidad 2 Sintaxis en java
Unidad 2 Sintaxis en java
 
Sintaxisenjava
Sintaxisenjava Sintaxisenjava
Sintaxisenjava
 
Manejo de memoria
Manejo de memoriaManejo de memoria
Manejo de memoria
 
Scala en proyectos de vinculación Ancap-UR - 2013-03
Scala en proyectos de vinculación Ancap-UR - 2013-03Scala en proyectos de vinculación Ancap-UR - 2013-03
Scala en proyectos de vinculación Ancap-UR - 2013-03
 
Curso prog sist
Curso prog sistCurso prog sist
Curso prog sist
 
Apuntes scilab
Apuntes scilabApuntes scilab
Apuntes scilab
 
Apuntes scilab
Apuntes scilabApuntes scilab
Apuntes scilab
 
Introduccion rapida a SCILAB.pdf
Introduccion rapida a SCILAB.pdfIntroduccion rapida a SCILAB.pdf
Introduccion rapida a SCILAB.pdf
 

Último

TARJETA MADRE DE DAYRON FABRI RUIZ-1.pptx
TARJETA MADRE DE DAYRON FABRI RUIZ-1.pptxTARJETA MADRE DE DAYRON FABRI RUIZ-1.pptx
TARJETA MADRE DE DAYRON FABRI RUIZ-1.pptx
dayronfabricioruizmo
 
primer manual de nuestra compañía de soporte
primer manual de nuestra compañía de soporteprimer manual de nuestra compañía de soporte
primer manual de nuestra compañía de soporte
eliersin13
 
DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.
DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.
DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.
Maria Celeste Trujillo Cruz
 
herramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcel
herramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcelherramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcel
herramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcel
Eduardo455921
 
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
micarnavaltupatrimon
 
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
micarnavaltupatrimon
 
Introduccion al Lenguaje de Programación C++
Introduccion al Lenguaje de Programación  C++Introduccion al Lenguaje de Programación  C++
Introduccion al Lenguaje de Programación C++
PaulDelgadoSoto
 

Último (7)

TARJETA MADRE DE DAYRON FABRI RUIZ-1.pptx
TARJETA MADRE DE DAYRON FABRI RUIZ-1.pptxTARJETA MADRE DE DAYRON FABRI RUIZ-1.pptx
TARJETA MADRE DE DAYRON FABRI RUIZ-1.pptx
 
primer manual de nuestra compañía de soporte
primer manual de nuestra compañía de soporteprimer manual de nuestra compañía de soporte
primer manual de nuestra compañía de soporte
 
DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.
DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.
DIAPOSITIVA DE LA MEMORIA RAM.PPXT.-MARIATRUJILLO.
 
herramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcel
herramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcelherramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcel
herramientaswebpdfwww.edu.pe.edu.institutoluisevalcarcel
 
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
 
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
Mi Carnaval, Aplicación web para la gestión del carnaval y la predicción basa...
 
Introduccion al Lenguaje de Programación C++
Introduccion al Lenguaje de Programación  C++Introduccion al Lenguaje de Programación  C++
Introduccion al Lenguaje de Programación C++
 

04 j flex

  • 1. 23/03/2014 1 Diseño de compiladores JFlex JFlex • Es un generador de analizadores lexicográficos • Esta desarrollado en Java y genera analizadores en código 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 • Puede ser utilizado en forma standalone o integrado con Eclipse, a través de una tarea ANT o de la herramienta de gestión de proyecto MAVEN • Información detallada del funcionamiento se puede encontrar en el manual en línea: – http://jflex.de/manual.html Funcionamiento • Entrada – Archivo con la especificación del scanner • Salida – El analizador léxico (scanner) – Escrito en código Java Especificacion.lex JFlex Scanner.java javac Scanner.class Texto del programa Lista de tokens Archivo de especificación • Código 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 Código de usuario • Definición de packages • Importaciones necesarias • Cualquier código de ayuda necesario para que el scanner funcione correctamente • Generalmente contiene código 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); }
  • 2. 23/03/2014 2 Directivas JFlex • Directivas: Controlan el comportamiento de JFlex – %line: Prende el conteo de líneas – %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 $ match reg. exp. r at end of a line . (dot) any character except the newline "..." verbatim string {name} macro expansion * zero or more repetitions + one or more repetitions ? zero or one repetitions (...) grouping within regular expressions a|b match a or b [...] class of characters - any one character enclosed in brackets a–b range of characters [^…] negated class – any one not enclosed in brackets Macros • ALPHA=[A-Za-z_] • DIGIT=[0-9] • ALPHA_NUMERIC={ALPHA}|{DIGIT} • IDENT={ALPHA}({ALPHA_NUMERIC})* • NUMBER=({DIGIT})+ • WHITE_SPACE=([ nrtf])+ Reglas • Estructura de las reglas – [estados] regexp { acción (código 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 Acciones • Escritas en código Java • Puede utilizar métodos y variables especiales provistos por JFlex – yytext(): Retorna el lexema del token actual – yyline: Retorna el numero de línea • Transiciones de estado – yybegin(nombre-estado): Le indica a JFlex para saltar al nuevo estado – YYINITIAL: Nombre que le da JFlex al estado inicial
  • 3. 23/03/2014 3 Cambios de estado YYINITIAL COMMENTS ‘//’ n ^n Cambios de estado <YYINITIAL> {NUMBER} { return new Symbol(sym.NUMBER, yytext(), yyline)); } <YYINITIAL> {WHITE_SPACE} { } <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); } Contador de líneas: lineCount.lex import java_cup.runtime.Symbol; %% %cup %{ private int lineCounter = 0; %} %eofval{ System.out.println("line number=" + lineCounter); return new Symbol(sym.EOF); %eofval} NEWLINE=n %% <YYINITIAL>{NEWLINE} { lineCounter++; } <YYINITIAL>[^{NEWLINE}] { } Contador de líneas: lineCount.lex JFlex javac lineCount.lex Lexical analyzer text tokens Yylex.java java JFlex.Main lineCount.lex javac *.java Main.java sym.java JFlex y JavaCUP deben estar en el CLASSPATH, junto con cualquier otra biblioteca necesaria para que el programa funcione Contador de líneas: lineCount.lex import java.io.*; 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); } catch (Exception e) { throw new RuntimeException("IO Error (brutal exit)” + e.toString()); } } } Un ejemplo • Un “compilador” sencillo de expresiones • Soporta +, -, * y / • Maneja enteros, flotantes e identificadores • Construiremos el analizador léxico y el analizador sintáctico • Lo vamos a embeber dentro de un proyecto Eclipse (para posterior reutilización)
  • 4. 23/03/2014 4 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 Sección “Java” del compilador Relacionada al modelado del lenguaje y al control del proceso de compilación Biblioteca de soporte utilizada para la ejecución del programa (Al ejecutar el parse en runtime necesitamos esto) Físicamente, la dependencia anterior va en esta carpeta Todo lo relacionado a la generación de los elementos de análisis (léxico y sintáctico) va en esta carpeta
  • 5. 23/03/2014 5 Archivo con la especificación sintáctica del lenguaje (para CUP) Archivo con la especificación léxica del lenguaje (para JFlex) Script ANT para la ejecución del CUP y JFlex Modelado del lenguaje El proceso de análisis genera esta estructura para posterior procesamiento Clases generadas por el proceso de análisis (léxico y sintáctico) Tester
  • 6. 23/03/2014 6 Modelo del lenguaje Representación intermedia Fuente de JFlex 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 sintácticamente • Construir una estructura que nos permita procesar lo leído – En este caso, solo lo recorremos para mostrarlo en otro formato • Nuestro “compilador” es mas bien un “traductor”