analizador de una matriz utilizando compiladores

22
CIS-IXB-001 UNIVERSIDAD NACIONAL DE LOJA ´ Area de la Energ´ ıa las Industrias y los Recursos Naturales No Renovables Carrera de Ingenier ´ ıa en Sistemas ” Compiladores” Analizador L ´ exico-Sint ´ actico en una Matriz Noveno B Autores: Christian Ra´ ul Lara Pacheco Docente: Ing. Henry-Paz, Loja-Ecuador 2015 1

Upload: christian-lara

Post on 26-Jul-2015

72 views

Category:

Education


2 download

TRANSCRIPT

CIS-IXB-001

UNIVERSIDADNACIONALDE LOJA

Area de la Energıa las Industrias y los Recursos Naturales No Renovables

Carrera de Ingenierıa en Sistemas

” Compiladores”

Analizador Lexico-Sintactico en unaMatriz

Noveno B

Autores:

• Christian Raul Lara Pacheco

Docente: Ing. Henry-Paz,

Loja-Ecuador2015

1

IndiceA. Introduccion 3

B. Problema a resolver 31 . Caracterısticas del funcionamiento del analizador . . . . . . . . . . . . . . 3

1 .1. Estructura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 . Clases JAVA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

2 .1. AnalizadorLexico.java . . . . . . . . . . . . . . . . . . . . . . . . . 102 .2. AnalizadorSintactico.java . . . . . . . . . . . . . . . . . . . . . 122 .3. sym.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 .4. token.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

3 . Control de errores y resultados . . . . . . . . . . . . . . . . . . . . . . . . . 173 .1. Control de erores AnalizadorLexico.java . . . . . . . . . . . . . . . 173 .2. Control de erores AnalizadaroSintactico.java . . . . . . . . . . . . . 183 .3. Mensajes de error a traves de la interfaz . . . . . . . . . . . . . . . 19

4 . Estructura del programa en NetBeans . . . . . . . . . . . . . . . . . . . . . 214 .1. Direccion web donde reposa el codigo . . . . . . . . . . . . . . . . . 21

C. BIBLIOGRAFIA 22

A. IntroduccionCon el pasar del tiempo el hombre se ha convertido en el mejor modelo de evolucion

y desarrollo dentro de nuestro mundo, innovaciones tecnologicas, descubrimientos, curaspara enfermedades mortales y la creacion de la tecnologıa son algunos de los referentesy carta de presentacion que pueden dar fe de que nosotros estamos en constante cambio.A pesar de todo no podemos decir que somos una raza perfecta; los defectos, erroresy equivocaciones nos han demostrado que nada puede llegar a su maxima perfeccion.En cualquier campo que se desempene, el hombre trata realizar un trabajo y lograr unresultado sin errores o problemas, no obstante la imperfeccion esta presente y nunca sepodra llegar a un 100 %; a pesar de esto se trata de disminuir la brecha y reducir suserrores.

En el campo de la computacion especıficamente el desarrollo de software se necesitaque los errores y defectos se disminuyan al mınimo, para esto se hace uso de diferentesmetodologıas, mismas que nos facilitan el trabajo. Compiladores es una rama que permitemodelar un entorno para ayudar al aprendizaje a traves de la deteccion y correccion deerrores mediante la ejecucion de algun programa el mismo que necesite ingresar un tipode texto o variables para ejecutar algun proceso.

En el presente proyecto se plasma todo el aprendizaje obtenido referente a la unidadde compiladores, mediante un ejemplo practico.

B. Problema a resolverSe pretende ingresar una matriz de tres filas en el analizador donde se verifique la

sintaxis, emitiendo un mensaje de error por medio de un control realizado por un compi-lador.

1 . Caracterısticas del funcionamiento del analizador1 .1. Estructura

Un compilador se conforma por ciertas partes importantes tales como:

Analizador Lexico: Es la primera fase de un compilador consistente en un progra-ma que recibe como entrada el codigo fuente de otro programa (secuencia de caracte-res) y produce una salida compuesta de tokens (componentes lexicos) o sımbolos.[1]

Su principal funcion consiste en leer los caracteres de entrada y elaborar como salidauna secuencia de componentes lexicos que utiliza el analizador sintactico para hacerel analisis.[1]El analizador lexico que se propone en este informe se describe las variables conrespecto al ingreso de una matriz, dentro del siguiente codigo se encuentra detalladodicho analizador.

3

/* 1. Iniciamos nombrando el paquete*/

package comp;import java_cup.runtime.Symbol;

/* 2. Iniciamos la edicion del codigo con dos porcentajes %%*/%%

/* 3. La clase AnalizadorLexico serael codigo java que se creara a partir de este archivo flex */

%class AnalizadorLexico

/*Integraremos cup para la sintaxis e identificaremosla fila y columna donde el escaner ubicara el token */

%cup%full%line%column%char%ignorecase

/*Finaliza el archivo*/%eofval{return new Symbol(sym.EOF,new String("Fin del archivo"));%eofval}

/*Se incluye el siguiente codigo java paradeterminar la posicion de la etiqueta */

%{int lineaActual = 1;private static int actualEtq=0;private static String nuevaEtq() {return "etqL"+(++actualEtq);}

/* Generamos un java_cup.Symbolpara guardar el tipo de token encontrado */

private Symbol symbol(int type) {return new Symbol(type, yyline, yycolumn);

}

4

/* Generamos un Symbol para el tipo detoken encontrado junto con su valor */

private Symbol symbol(int type, Object value) {return new Symbol(type, yyline, yycolumn, value);

}%}

/*Expresiones regulares, son las variables queme permitiran determinar lo que necesito para mi compilador*/

digito = 0|[1-9][0-9]*SaltoLinea = \r|\n|\r\n|\n\respacio = \t|\f|" "

/* Aquı determinare los sımbolos que formaran la matriz*/

%%/*Primer sımbolo llamado ABREPARENTESIS,con el que comienza la matriz*/"(" { return new Symbol(sym.ABREPARENTESIS,

new token(yycolumn, yyline, yytext())); }

/*Sımbolo llamado CIERRAPARENTESIS,con el que termina la matriz*/")" { return new Symbol(sym.CIERRAPARENTESIS,

new token(yycolumn, yyline, yytext())); }

/*Sımbolo llamado puntoycoma,que me interpretara el fin de la fila de la matriz*/";" { return new Symbol(sym.PUNTOYCOMA,

new token(yycolumn, yyline, yytext())); }

/*Sımbolo llamado COMA,separador ente los numeros enteros*/"," { return new Symbol(sym.COMA,

new token(yycolumn, yyline, yytext())); }

Integer(yytext())); }

/*Se retorna un Objeto de tipo symbol el mismoque se enruentra estructurado de un valor enteroque identifica que es un dıgito y adicionalmenteun objeto de tipo token donde se almacena lacolumna y lınea en la que se ubica como el

5

valor de su respectivo token*/{digito} {return new Symbol(sym.INT,

new token(yycolumn, yyline, yytext()));}

/*Se retorna un Objeto de tipo symbol el mismoque identifica un salto de lınea y adicionalmenteun objeto de tipo token donde se almacena lacolumna y lınea en la que se ubica como el valorde su respectivo token*/

{SaltoLinea} {return new Symbol(sym.ENTER,new token(yycolumn, yyline, yytext()));}

/*Se ignora el espacio que se encuentre entre cada dıgito */{espacio}+ {;}

/*Imprime un mensaje de error indicado su posicion*/. {System.err.println

("caracter invalido" + yytext() +"["+ yyline + ":"+ yycolumn + "]");}

6

Analizador Sintactico: Convierte el texto de entrada en otras estructuras, que sonmas utiles para el posterior analisis y capturan la jerarquıa implıcita de la cadena.[2]

Codigo

package comp;import java_cup.runtime.*;import java.io.FileReader;

parser code {:@Override

/* Reporte un error de sintaxis encontrado. */public void syntax_error(Symbol sy) {

token t=(token)sy.value;done_parsing();report_error("Error sintactico cerca de \""+ t.getCadena()+"\" :["+t.getRow()+" : "+t.getCol()+"]",null);

}

/* Reporte de error encontrado. */public void report_error(String message, Object info) {

StringBuilder m = new StringBuilder("Error");if (info instanceof java_cup.runtime.Symbol) {

java_cup.runtime.Symbols = ((java_cup.runtime.Symbol) info);if (s.left >= 0) {

m.append(" en la lınea "+(s.left+1));if (s.right >= 0)

m.append(", columna "+(s.right+1));}

}m.append(" : "+message);System.err.println(m);

}

/* Cuando se encuentra un error de donde el sistema no puederecuperarse, se lanza un error fatal. Se despliega el mensajede error y se finaliza la ejecucion. */

public void report_fatal_error(String message, Object info) {report_error(message, info);System.exit(1);

}

7

/* Metodo main para garantizar la ejecucion del analizadorlexico y sintactico, ademas que se pase como parametro la tablade sımbolos correspondiente. */

public static void main(String[] args){try {

AnalizadorSintactico asin = new AnalizadorSintactico(new AnalizadorLexico( new FileReader(args[0])));

Object result = asin.parse().value;} catch (Exception ex) {

ex.printStackTrace();}

}:}

/*Declaramos las variables terminalesdeclaro cada uno de los tokens yaespecificados en el analizador lexico */

/*Sımbolos que forman la matriz*/terminal ABREPARENTESIS,CIERRAPARENTESIS,PUNTOYCOMA,ENTER,COMA;

/*Numero entero con que se llena la matriz*/terminal token INT;

/*Declaramos las variables no terminalesvariables donde se dara la estructura al programa */

non terminal instrucciones, instruccion, prog;non terminal expresion1,expresion2,expresion3;

/*Se indica que inicia la estructura de las reglas sintacticas*/start with prog;

/**/prog ::= ABREPARENTESIS instrucciones CIERRAPARENTESIS;

/*---------DEFINICION DE INSTRUCCIONES----------------*/

/**/instrucciones ::=

instrucciones expresion1 | expresion1 ENTER instruccion ENTER/**/

8

expresion3 | expresion3 ;

/**/instruccion ::= instruccion expresion2;

/**/expresion1 ::= INT:a COMA INT:b COMA INT:c PUNTOYCOMA{:System.out.println(""+a+" "+ b +" "+ c);:};

/**/expresion2 ::= INT:d COMA INT:e COMA INT:f PUNTOYCOMA{:System.out.println(""+d+" "+ e +" "+ f);:};

/**/expresion3 ::= INT:g COMA INT:h COMA INT:i PUNTOYCOMA{:System.out.println(""+g+" "+ h +" "+ i);:};

Para la creacion del archivo CUP se necesita comprender muy bien cada una de lasacciones que el compilador necesita realizar, para esto se crea un automata el mismoque nos sera de ayuda para poder identificar las instrucciones y las expresionesterminales y no terminales. A continuacion se muestra el automata definido para el

compilador que se ha creado:

Figura 1: Automata Matriz.

9

2 . Clases JAVAUna vez realizados ambos archivos procedemos a ejecutar cada uno, de esta forma

obtendremos 3 clases de manera automatica, las mismas que nos serviran para nuestrocompilador, en sı son las partes mas importantes de un compilador

A continuacion se enumeran las clases.

AnalizadorLexico.java

AnalizadorSintactico.java

sym.java

token.java

2 .1. AnalizadorLexico.java

Para poder obtener como resultado la clase AnalizadorLexico.java creamos la claseEjecutorFlex.java de donde llamaremos al archivo Lexer.flex

Codigo

package comp;

import java.io.*;import java_cup.runtime.Symbol;

/**** @author Chris*/public class EjecutorFlex {

/*** @param args the command line arguments*/public static void main(String[] args) {jflex.Main.generate(new File(

"src"+File.separator+"comp"+ File.separator + "Lexer.flex"));

}}

10

Una vez ejecutado el archivo main, se creara la clase AnalizadorLexico.java. A conti-nuacion mostramos un extracto del codigo ya que es muy extenso colocarlo en el docu-mento

Codigo

package comp;

import java_cup.runtime.Symbol;import javax.swing.JTextArea;..[codigo].[codigo].[codigo]./*Introduzco un nuevo objeto con un constructor, en este casoLo necesitare para poder asignar a un area de texto el errorque necesita capturar*/

JTextArea txterror;

public AnalizadorLexico(java.io.Reader in, JTextArea txterror) {this.txterror = txterror;this.zzReader = in;

}/*Aquı se encuentra codigo generado automaticamente*/...[codigo].[codigo].[codigo]..

/*Aquı se encuentra codigo donde se identifica cada unode los errores controlados por el compilador*/switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {

case 1: {/*Los mansajes de error se mostraran por pantallaIndicando la ubicacion dadas por las lıneas y columnas*/

System.err.println("Caracter invalido" + yytext() +" [" + yyline + ":" + yycolumn + "]");

txterror.setText("Caracter Incorrecto " + yytext() +" [" + yyline + ":" + yycolumn + "]");

11

char c = yytext().charAt(0);

if (Character.isLetter(c)) {txterror.setText

("La matriz recibe solo numeros enteros");} else {

txterror.setText("Error ingrese solo numeros");

}

}}

/*Aquı se encuentra codigo generado automaticamente*/...[codigo].[codigo].[codigo]..

2 .2. AnalizadorSintactico.java

Para poder obtener como resultado la clase AnalizadorSintactico.java creamos la claseMainCup.java de donde llamaremos al archivo Sintactico.Cup

Codigo

package comp;

import java.io.File;

public class MainCup {public static void main(String[] args) {

String opciones[] = new String[5];opciones[0] = "-destdir";opciones[1] = "src" + File.separator + "comp";opciones[2] = "-parser";opciones[3] = "AnalizadorSintactico";opciones[4] = "src" + File.separator +"comp" + File.separator + "Sintactico.cup";

try {// java_cup.Main.main(opciones);

} catch (Exception e) {

12

System.out.print(e);}

}}

Una vez ejecutado el archivo main, se creara la clase AnalizadorSintactico.java. A conti-nuacion mostramos un extracto del codigo, aquı se trata de dar sentido a las expresionesque ingresaremos a verificar.

Codigo

package comp;

import java_cup.runtime.*;import java.io.FileReader;import javax.swing.JTextArea;/*** CUP v0.11b 20141202 (SVN rev 60) generated parser.*/

@SuppressWarnings({"rawtypes"})public class AnalizadorSintactico extends java_cup.runtime.lr_parser {

public final Class getSymbolContainer() {return sym.class;

}

public AnalizadorSintactico() {super();

}

/*Utilizamos un area de texto para emitir el tipo de error*/JTextArea txterror;

/*El constructor del analiazdor sintacticose utiliza para recibir el JTextArea y presentarlos errorres en la interfaz grafica */public AnalizadorSintactico

(java_cup.runtime.Scanner s, JTextArea txterror) {super(s);this.txterror = txterror;

}...[codigo]

13

.[codigo]

.[codigo]

.

./**/

El resto de codigo es autogenerado una vez que se llama al archivo CUP.

2 .3. sym.java

La clase sym se crea a partir de el archivo CUP donde se declaran cada una de lasinstrucciones terminales del compilador.

package comp;

/** CUP generated class containing symbol constants. */

public class sym {/*Se generan automaticamente del cual se ibtienenlos valores asignados por la librerıa CUP.*/

public static final int COMA = 6;public static final int CIERRAPARENTESIS = 3;public static final int PUNTOYCOMA = 4;public static final int error = 1;public static final int ABREPARENTESIS = 2;public static final int ENTER = 5;public static final int EOF = 0;public static final int INT = 7;public static final String[] terminalNames = new String[] {"EOF","error","ABREPARENTESIS","CIERRAPARENTESIS","PUNTOYCOMA","ENTER","COMA","INT"};

}

14

2 .4. token.java

La siguiente clase se utiliza para capturar cada uno de los errores mediante el segui-miento del escaner mientras recorre sus filas y columnas

package comp;public class token {

private int col;private int row;private String cadena;private int entero;

public token() {

}

/*Constructor de la clase token.java

public token(int col, int row, String cadena) {this.col = col;this.row = row;this.cadena = cadena;

}public int getCol() {

return (this.col) + 1;}public int getRow() {

return (this.row) + 1;}

public String getCadena() {return this.cadena;

}public void setCadena(String c) {

cadena = c;}public int getEntero() {

return this.entero;}

@Overridepublic String toString() {

return "token{" + "col=" + col + ", row=" + row + ",cadena=" + cadena + ", entero=" + entero + ’}’;

15

}}

16

3 . Control de errores y resultadosAdemas se trata de darle sentido al compilador, en esta seccion ya se hallan unidos

tanto el archivo Sintactico.cup y Lexer.flex, esto permite que nuestro compilador le desentido a las expresiones que se desean verificar, esto quiere decir que tambien se verificarasu semantica.

3 .1. Control de erores AnalizadorLexico.java

En el siguiente codigo se controlan los errores, mismo que me daran un mensaje cuandose encuentren dentro de un area de texto en una interfaz grafica

switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {case 1: {/*Primer caso donde me captura el error del caracter ivalidomediante la obtencion de las lıneas y columnas */

System.err.println("Caracter invalido" + yytext() +" [" + yyline + ":" + yycolumn + "]");

/*Primer caso donde me captura el error del caracter incorrectomostrando ademas la ubicacion del errormediante las lıneas y columnas*/

txterror.setText("Caracter Incorrecto " + yytext() +" [" + yyline + ":" + yycolumn + "]");

char c = yytext().charAt(0);

/*Primer caso donde me captura el error y se justificadando a conocer lo que esta permitido*/

if (Character.isLetter(c)) {txterror.setText

("La matriz recibe solo numeros enteros");} else {

txterror.setText("Error ingrese solo numeros");

}

}}

17

3 .2. Control de erores AnalizadaroSintactico.java

@Override/*Se sobreescribe el metodo error de sintaxis*/

public void syntax_error(Symbol sy) {token t = (token) sy.value;done_parsing();report_error("Error de Sintaxis \""

+ t.getCadena() + "\" :[" + t.getRow() + " : " + t.getCol() + "]", null);

/*Se indica la posicion del error*/txterror.setText("Error cerca del token: \""

+ t.getCadena() + "\": En la Linea [" + t.getRow() +" : "+ t.getCol() + "] "+ "\n" + txterror.getText());

txterror.setText(txterror.getText() + "\n" +"Se debe tener la sig. Estructura:" + "\n"

+ "\t" + " (1,2,3;4,6,1;7,8,9;) ");}

}

Al terminar con esta estructura unicamente se procede a modelar una interfaz media-te la cual se introducira el texto en forma de matriz para luego realizar su analisis ydeterminar si su estructura es correcta

Figura 2: Interfaz para analizar la Matriz

18

3 .3. Mensajes de error a traves de la interfaz

Error de sintaxis: Aquı se determina si toda la matriz se genera de manera correctao en su defecto se encuentra escrita de forma incorrecta, al encontrar un error en suescritura se emite un mensaje de error.

Figura 3: Mensaje error de sintaxis

Error de escritura: Aquı se determina si toda la matriz se encuentra conformadapor numeros enteros o en su defecto se encuentra formada por algun caracter noreconocido por el compilador, como por ejemplo una letra.

Figura 4: Mensaje error de sintaxis

19

Matriz correcta: Finalmente si no se encuentra ningun error ni en su sintaxis nien su semantica, el compilador determina que la matriz se ha ingresado de maneracorrecta.

Figura 5: Matriz correcta

20

4 . Estructura del programa en NetBeansEl programa se divide en 4 paquetes:

comp: Se almacenan todas las clases y los archivos: Lexer.flex, Sintactico.cup, Ana-lizadorLexico.java, AnalizadorSintactico.java, token.java, sym.java y los ejecutores.

entradas: se encuentra un archivo de texto donde existen varios ejemplos de matricespara su posterior verificacion

logos: Se encuentran las imagenes y logotipos de la interfaz grafica

vista: Se encuentra creada la interfaz grafica la misma que se utiliza para la ejecuciondel programa.

Figura 6: Estructura del proyecto

4 .1. Direccion web donde reposa el codigo

https://code.google.com/p/compiladormatriz/source/browse/trunk

21

C. BIBLIOGRAFIA

Referencias[1] Aho, A.V., Sethi, R., Ullman, J.D. (1990), Compiladores: principios, tecnicas y he-

rramientas,capitulo 1, paginas: 1- 25, 743-747.

[2] Louden, K.C. (1997), Construccion de Compiladores: Principios y practica, capitulo1, paginas:1- 27. el A. Vega Castro (2008), Integracion de JFlex y CUP, paginas:10-15.

22