EN LINUX

Universidad De San Carlos Facultad de Ingeniería Escuela de Ciencias y Sistemas Compiladores 1 Ing. José Rodolfo Calvo Villagrán Aux. Aura Luz Cifuentes Reyes

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 generador vamos a gestionar jflex. parser-generador

Sistemas -> Administración -> Gestor de Actualizaciones Clic en Configuración.

Cambiamos la pestaña a Otros Software. Activamos clic en partnet.

Iniciamos la consola

Y actualizamos, sudo apt-get update

Sudo apt-get install sun-java6-jdk jflex cup

Se acepta la licencia de JAVA con F2 y enter Instalar netbeans: Lo descargamos de la pagina: http://netbeans.org/downloads/index.html Nos ubicamos en la carpeta de donde lo descargamos y escribimos: “sh netbeans-6.9-ml-linux.sh”

Creación de un proyecto de Netbeans
File -> New Project -> Java Application Project Name: miscaner

-

Dentro de la carpeta del proyecto, agregamos una carpeta “lib”. Copiamos la librería: java-cup-11a-runtime.jar dentro de la carpeta lib. Clic secundario en Librerías, y le damos Agregar nuevo JAR/FOLDER.

Creación Scanner.jflex
Scanner.jflex: package miscaner; import java_cup.runtime.Symbol; %% Comentario Comentario2 tstring numero letra iden %state A %cupsym simbolo %class gramatilex %cup %public %unicode %line %char %ignorecase %% ="/"[*] [^*]+ [*]"/" | "/"[*] [*]+ "/" =[/][/] ([^\r\n])* \r|\n =[\"] [^\"\n]+ [\"\n] =[0-9]+ "."? [0-9]* =[a-zA-ZÑñ]+ ={letra}({letra}|{numero}|"_")*

"IF" "WHILE" "FOR" [<][!]"inicio"

{return new Symbol(simbolo.tif, yychar,yyline); } {return new Symbol(simbolo.twhile, yychar,yyline); } {return new Symbol(simbolo.tfor, yychar,yyline); } {yybegin(A); return new Symbol(simbolo.tstart, yychar,yyline); }

/* 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} {numero} {iden} */ {return new Symbol(simbolo.tstring, yychar,yyline,new String(yytext()));} {return new Symbol(simbolo.numero, yychar,yyline,new String(yytext()));} {return new Symbol(simbolo.iden, yychar,yyline,new String(yytext()));}

/* COMENTARIOS */ {Comentario} { /* Se ignoran */} {Comentario2} { /* Se ignoran */} /* BLANCOS */

[ \t\r\f\n]+ <A>{ {numero} ";" [!][>] [ \t\r\f\n]+ . }

{ /* Se ignoran */}

{return new Symbol(simbolo.numero, yychar,yyline,new String(yytext()));} {return new Symbol(simbolo.coma, yychar,yyline); } {yybegin(YYINITIAL); return new Symbol(simbolo.tend, yychar,yyline);} { /* Se ignoran */} { System.out.println("Error lexico dentro de <!inicio: "+yytext()); }

/* Cualquier Otro */ . { System.out.println("Error lexico: "+yytext()); }

Creación Parser.cup
Fichero: Parser.cup 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; start with INICIA; INICIA::= L; L::=L TIPOS

|TIPOS; TIPOS ::= tif | twhile | tfor | igual | mas | menos | tstring | numero | iden | tstart | tend | coma | error; {: System.out.println("IF"); :} {: System.out.println("WHILE"); :} {: System.out.println("FOR"); :} {: System.out.println("IGUAL"); :} {: System.out.println("MAS"); :} {: System.out.println("MENOS"); :} {: System.out.println("STRING"); :} {: System.out.println("NUMERO"); :} {: System.out.println("IDENTIFICADOR"); :} {: System.out.println("<!INICIO"); :} {: System.out.println("!>"); :} {: System.out.println("COMA"); :}

Creación Main.java
Fichero: Main.java 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(); } } Dentro de la carpeta donde tenemos el proyecto. Desde la consola “jflex scanner.jflex”

Cup –parser sintactico – simbolo Parser.cup

Compilar
Ejecutamos 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; !> 4+3=7 //end /* Fin */