Professional Documents
Culture Documents
Compiladores 1
Sección A
EN WINDOWS
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 ayuda
JAVACUP es un analizador sintáctico o sea un parser
parser-generador
generador vamos a gestionar jflex.
Manual Jflex con Cup
Compiladores 1
Sección A
Instalación:
cd C:\Users\lucita\Documents\NetBeansProjects\MiScaner\src\miscaner
java -jar %JFLEX_HOME%\lib\JFlex.jar Scanner.jflex
pause
Fichero: Sintactico.bat
cd C:\Users\lucita\Documents\NetBeansProjects\MiScaner\src\miscaner
java -classpath C:\Fuentes\ java_cup.Main -parser sintactico -symbols simbolo Parser.cup
pause
package miscaner;
Manual Jflex con Cup
Compiladores 1
Sección A
import java_cup.runtime.Symbol;
%%
%state A
%cupsym simbolo
%class gramatilex
%cup
%public
%unicode
%public
%line
%char
%ignorecase
%%
/* OPERADOR */
"=" {return new Symbol(simbolo.igual, yychar,yyline); }
"+" {return new Symbol(simbolo.mas, yychar,yyline); }
"-" {return new Symbol(simbolo.menos, yychar,yyline); }
";" {return new Symbol(simbolo.coma, yychar,yyline); }
/* String */
{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()));}
/* COMENTARIOS */
{Comentario} { /* Se ignoran */}
{Comentario2} { /* Se ignoran */}
/* BLANCOS */
[ \t\r\f\n]+ { /* Se ignoran */}
Manual Jflex con Cup
Compiladores 1
Sección A
<A>{
{numero} {return new Symbol(simbolo.numero, yychar,yyline,new String(yytext()));}
";" {return new Symbol(simbolo.coma, yychar,yyline); }
[!][>] {yybegin(YYINITIAL); return new Symbol(simbolo2.tend, yychar,yyline);}
[ \t\r\f\n]+ { /* Se ignoran */}
. { System.out.println("Error lexico dentro de <!inicio: "+yytext()); }
}
/* Cualquier Otro */
. { System.out.println("Error lexico: "+yytext()); }
package miscaner;
import java_cup.runtime.*;
parser code
{:
/**Metodo al que se llama automáticamente ante algún error sintactico.*/
public void syntax_error(Symbol s){
System.out.println("Error en la Línea " + (s.right+1) +" Columna "+s.left+ ". Identificador "
+s.value + " no reconocido." );
}
/**Metodo al que se llama en el momento en que ya no es posible una recuperación de
errores.*/
public void unrecovered_syntax_error(Symbol s) throws java.lang.Exception{
System.out.println("Error en la Línea " + (s.right+1)+ "Columna "+s.left+". Identificador " +
s.value + " no reconocido.");
}
:}
action code
{:
:}
terminal tif , twhile, tfor, igual, mas, menos;
terminal tstart, coma, tend;
terminal String tstring, numero, iden;
non terminal INICIA,L, TIPOS;
INICIA::= L;
L::=L TIPOS
|TIPOS;
Manual Jflex con Cup
Compiladores 1
Sección A
package miscaner;
import java.io.FileInputStream;
public class Main {
public static void main(String[] args) throws Exception {
System.out.println("-------------------------------");
new sintactico(new gramatilex(new FileInputStream("prueba.txt"))).parse();
}
}
Paso 8: Compilar
Le damos doble clic a los ficheros léxico.bat y sintáctico.bat y luego compilamos el proyecto de
netbeans.
Archivo de Entrada:
/* Este es un comentario */
Variable = 2.33333 ;
for <!inicio 3; 2; 1; 4; !>
var = " Cadena ";
numero = 2222;
// Comentario 2
/* Comentario 4 */
while <!Inicio
6; 7; 8; 9;
Manual Jflex con Cup
Compiladores 1
Sección A
!>
4+3=7
//end
/* Fin */
JFlex:
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 ayuda
JAVACUP es un analizador sintáctico o sea un parser
parser-generador
generador vamos a gestionar jflex.
Archivo.jflex
JFLEX
Archivo.java
javac
Archivo.class
Un archivo de especificación para Jfle
Jflexx está organizado en tres secciones, separadas por: “%%", y
tiene el siguiente formato:
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.
Manual Jflex con Cup
Compiladores 1
Sección A
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:
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:
a|b unión esta expresión regular, que coincide con todas las entradas que se
corresponde con a o b.
ab Concatenación Una letra que inicia con a, le sigue la letra b.
a* Cerradura La a puede venir 0 o más veces.
Kleene
a+ Cerradura Es equivalente (a)a*
Abierta
a? Cerradura Es equivalente a una cerradura vacía.
cerrada
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.