Você está na página 1de 9

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
parser-generador
generador vamos a gestionar jflex.
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 =[/][/] ([^\r\n])* \r|\n
tstring =[\"] [^\"\n]+ [\"\n]
numero =[0-9]+ "."? [0-9]*
letra =[a-zA-ZÑñ]+
iden ={letra}({letra}|{numero}|"_")*

%state A

%cupsym simbolo
%class gramatilex
%cup
%public
%unicode
%line
%char
%ignorecase
%%

"IF" {return new Symbol(simbolo.tif, yychar,yyline); }


"WHILE" {return new Symbol(simbolo.twhile, yychar,yyline); }
"FOR" {return new Symbol(simbolo.tfor, yychar,yyline); }
[<][!]"inicio" {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} {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 */}

<A>{
{numero} {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);}
[ \t\r\f\n]+ { /* 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 {: System.out.println("IF"); :}


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

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 */

Você também pode gostar