Ciclo While Con Jflex Cup

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 13

PROYECTO COMPILADORES

ESTRUCTURA WHILE CON JFLEX Y JAVA CUP

PROFESOR:
Rafael García Mencía

ALUMNOS:
Iván Luis Jiménez
Francisco Aguilar Jacobo

Chilpancingo de los Bravo a 9 de enero del 2017


Objetivo

El objetivo de este proyecto es simular la estructura de programación WHILE con ayuda de JFLEX y
JAVA CUP. Como bien sabemos ésta estructura es algo compleja, ya que inicia con la palabra reservada
WHILE, después abre paréntesis, dentro del paréntesis se pueden agregar muchas instrucciones de
comparación, lógicas y más, cierra paréntesis, abre y cierra llaves. Nosotros sólo tomamos en cuentas
las más importantes y más usadas.
Contenido

Objetivo .................................................................................................................................................................................. 1
Desarrollo ...............................................................................................................................................................................3
Estructura del archivo JFlex: .....................................................................................................................................3
Estructura del archivo CUP: .........................................................................................................................................5
Clase para compilar los archivos JFLEX y CUP en JAVA ....................................................................................7
Clase para ejecutar el analizador léxico y sintáctico ...........................................................................................9
Corriendo el programa.................................................................................................................................................. 12
Desarrollo
Estructura del archivo JFlex:
Nombre del archivo: archivo_flex.flex

/* --Código propio del programa o usuario-- */

package Cup_and_Flex;

import java_cup.runtime.*;

import java.io.Reader;

%%

%{

public void imprime(String texto){

System.out.println(": "+texto);

%}

/*DIRECTIVAS JLEX*/

%class AnalizadorLexico_While

%public

%full

%char

%line

%cup

%ignorecase

%eofval{

System.out.println("FIN DEL ARCHIVO");

System.exit(0);

%eofval}

entero=[0-9]
Id=[a-zA-z][a-zA-Z0-9]

%%

/*MANEJO DE LAS PALABRAS RESERVADAS*/

"while" {imprime("mientras");}

"(" {imprime("abre parentesis");}

({entero})+ {imprime("entero");}

{Id} {imprime("identificador");}

">" {imprime("mayor");}

"<" {imprime("menor");}

">=" {imprime("mayor igual");}

"<=" {imprime("menor igual");}

"true" {imprime("verdadero");}

"false" {imprime("falso");}

"||" {imprime("or");}

"&&" {imprime("and");}

"==" {imprime("igual igual");}

"!=" {imprime("no igual");}

(" ") {System.out.print(" ");}

")" {imprime("cierra parentesis");}

"{" {imprime("abre corchete");}

"}" {imprime("cierra corchete");}

[\t\r\n\f] {}

. {System.out.println("Error Léxico");}
Estructura del archivo CUP:
Nombre del archivo:archivo_cup.cup

package Cup_and_Flex;

import java_cup.runtime.*;

import java.io.FileReader;

parser code

{:

/**

* Método al que se llama automáticamente ante algún error sintactico.

**/

public void syntax_error(Symbol s){

// System.out.println("Error Sintáctico en la Línea " + (s.left) +

// " Columna "+s.right+ ". No se esperaba este componente: " +s.value+".");

/**

* Método al que se llama automáticamente ante algún error sintáctico

* en el 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 síntactico irrecuperable en la Línea " +

//(s.left)+ " Columna "+s.right+". Componente " + s.value +

//" no reconocido.");

:}

terminal or_,and_,igual_igual,no_igual,mayor,menor,mayor_igual,menor_igual,numero,id,
open_par, close_par,open_corch, close_corch,truee,falsee;
non terminal Object MIENTRAS, SIMBOLOS_COMPARAR, TIPO_DATO, CONDICION,
EXPRESION_OR, EXPRESION_AND, IGEXP,CMP;

MIENTRAS::= MIENTRAS open_par

|EXPRESION_OR

|IGEXP

|SIMBOLOS_COMPARAR close_par open_corch close_corch;

CONDICION::= EXPRESION_OR;

EXPRESION_OR::= EXPRESION_OR or_ EXPRESION_AND

|EXPRESION_AND close_par;

EXPRESION_AND::= EXPRESION_AND and_ IGEXP;

IGEXP::= IGEXP igual_igual CMP

|IGEXP no_igual CMP

|CMP;

SIMBOLOS_COMPARAR::= mayor

|menor

|mayor_igual

|menor_igual close_par;

CMP::= CMP SIMBOLOS_COMPARAR TIPO_DATO

|TIPO_DATO

|open_par CONDICION close_par;

TIPO_DATO::= id

|numero
|truee

|falsee close_par;

Clase para compilar los archivos JFLEX y CUP en JAVA


Nombre de la clase:Compilar_Cup_Flex.java

package Cup_and_Flex;

import java.io.File;

import java.nio.file.Path;

import java.nio.file.Paths;

/**

* @author Ivan Luis Jimenez

* @author Francisco Aguilar Jacobo

*/

class Compilar_Cup_Flex {

public static void main(String[] args) {

Compilar_Cup_Flex compilar = new Compilar_Cup_Flex();

compilar.compilar_archivos();

boolean mvAL = moverArch("AnalizadorLexico_While.java");

boolean mvAS = moverArch("AnalizadorSintactico_While.java");

boolean mvSym = moverArch("sym.java");

public void compilar_archivos() {

String archLexico = "";


String archSintactico = "";

System.out.println("\n*** Procesando archivo default ***\n");

archLexico =
"C:\\Users\\Jony\\Documents\\HackPy\\While_Cup_and_Flex\\test\\Cup_and_Flex\\arc
hivo_flex.flex";

archSintactico =
"C:\\Users\\Jony\\Documents\\HackPy\\While_Cup_and_Flex\\test\\Cup_and_Flex\\arc
hivo_cup.cup";

String[] alexico = {archLexico};

String[] asintactico = {"-parser", "AnalizadorSintactico_While", archSintactico};

jflex.Main.main(alexico);

try {

java_cup.Main.main(asintactico);

} catch (Exception ex) {

System.out.println("" + ex);

System.out.println("Generados correctamente!...");

public static boolean moverArch(String archNombre) {

boolean efectuado = false;

File arch = new File(archNombre);

if (arch.exists()) {

System.out.println("\n*** Moviendo " + arch + " ***");

Path currentRelativePath = Paths.get("");

String nuevoDir = currentRelativePath.toAbsolutePath().toString()

+ File.separator + "test" + File.separator

+ "Cup_and_Flex" + File.separator + arch.getName();

File archViejo = new File(nuevoDir);


archViejo.delete();

if (arch.renameTo(new File(nuevoDir))) {

System.out.println("\n*** Generado " + archNombre + "***\n");

efectuado = true;

} else {

System.out.println("\n*** No movido " + archNombre + " ***\n");

} else {

System.out.println("\n*** Codigo no existente ***\n");

return efectuado;

Clase para ejecutar el analizador léxico y sintáctico


Nombre de la clase:Ejecutable.java

package Cup_and_Flex;

import java.io.BufferedWriter;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.FileWriter;

import java.io.IOException;

import java.util.Scanner;

/**

* @author Ivan Luis Jimenez

* @author Francisco Aguilar Jacobo


*/

public class Ejecutable {

Scanner leer = new Scanner(System.in);

public static void main (String args[]){

Ejecutable ejecutar=new Ejecutable();

ejecutar.archivo();

ejecutar.ejecutar_analizador();

public void archivo() {

String ruta = "archivo_texto.txt";

File archivo = new File(ruta);

BufferedWriter bw = null;

if (archivo.exists()) {

try {

bw = new BufferedWriter(new FileWriter(archivo));

System.out.print("Escriba la expresion While:");

String expresion = leer.nextLine();

bw.write(expresion);

} catch (IOException ex) {

System.out.println("" + ex);

} else {

try {

try {

bw = new BufferedWriter(new FileWriter(archivo));

} catch (IOException ex) {

System.out.println("" + ex);

}
System.out.print("Escriba la expresion While:");

String expresion = leer.nextLine();

bw.write(expresion);

} catch (IOException ex) {

System.out.println("" + ex);

try {

bw.close();

} catch (IOException ex) {

System.out.println("");

public void ejecutar_analizador() {

System.out.println("*****Inicio Ejecuación*****");

try {

AnalizadorSintactico_While asin = new AnalizadorSintactico_While(

new AnalizadorLexico_While(new FileReader("archivo_texto.txt")));

Object result = asin.parse().value;

System.out.println("*****Resultados Finales******");

} catch (FileNotFoundException ex) {

System.out.println("");

} catch (Exception ex) {

System.out.println("");

}
Corriendo el programa

Para finalizar muestro unas capturas del programa funcionando:

Desde NetBeans una estructura while valida:

Como la estructura while esta correcta, no nos muestra ningún error.

Una estructura while Inválida:

Como la estructura está mal y además tiene variables o tokens que no fueron declarados, por lo tanto
el lenguaje lo desconoce y no lo acepta y marca error léxico.

También podría gustarte