reporte de analizador léxico

28
Reporte de analizador léxico Área académica: Ingeniería en sistemas computacionales. Elaborado por: Balderas Avalos Maya Belén Balanzar Hernández Aurora Lucia Morales Vera Ulices Elevi Página 1

Upload: ulisses-morales

Post on 07-Nov-2015

224 views

Category:

Documents


3 download

DESCRIPTION

automatas

TRANSCRIPT

Reporte de analizador lxico rea acadmica: Ingeniera en sistemas computacionales.

Elaborado por: Balderas Avalos Maya BelnBalanzar Hernndez Aurora LuciaMorales Vera Ulices Elevi

Tabla de contenido

Introduccin3Autmata de palabra reservadas4Autmata de variables4Autmata de operadores5Cdigo del nuestro programa6Manual20Conclusin23

Introduccin

Como bien sabemos, el analizador lxico es la primera fase de un compilador, el cual identifica la sintaxis en tokens los cuales deben estar separados por espacios.El analizado sintctico debe de identificar los tokens que forman parte de cada instruccin y ver que estas estn correctamente escritas, para implementar esto es necesaria la utilizacin de autmatas.

En esta ocasin podemos encontrar la explicacin adecuada de la implementacin de nuestro propio lenguaje de programacin en el cual el propio deber validar los operadores, palabras reservadas y variables, todo esto por medio de autmatas finitos deterministas, tablas de transicin y pseudocdigo de cada uno.

Autmata de palabra reservadas

Palabras reservadasElse=SinoIf=SiWhile=DondeCase=KaseDo=Hacer4321

I N O

S

O N D ED98765

0

K

13111210

A S EH

18A C E R17141615

Tabla de transiciones de palabras reservadas

SINODKAHCERFDC

01EEE510E14EEEE

1E2EEEEEEEEEE

2EE3EEEEEEEEA

3EEE4EEEEEEEE

4EEEEEEEEEEEA

5EEE6EEEEEEEE

6EE7EEEEEEEEE

7EEEE8EEEEEEE

8EEEEEEEEE9EE

9EEEEEEEEEEEA

10EEEEEE11EEEEE

1112EEEEEEEEEEE

12EEEEEEEEE13EE

13EEEEEEEEEEEA

14EEEEEE15EEEEE

15EEEEEEEE16EEE

16EEEEEEEEE17EE

17EEEEEEEEEE18E

18EEEEEEEEEEEA

Pseudocdigo de palabras reservadas RepetirLeer el siguiente smbolo de entradaCaso de smbolo

S: entrada:= SI: entrada:=IN: entrada:=NO: entrada:=OD: entrada:=DK: entrada:=KA: entrada:=AH: entrada:=HC: entrada:=CE: entrada:=ER: entrada:=RFdc: entrada:=FdcFdc: SalirEstado= Tabla(estado,entrada)Si estado=error entonces salirHasta estado= aceptar Autmata de variables

Reglas para las variables:1. Empezar con: $2. Letra 3. Letra seguida de n letras4. Numero5. Seguido de n nmeros L NUM

1032

$ L NUM

Tabla de transiciones de las variables$LETRANUMEROFDC

01EEE

1E2EE

2E23A

3EE3A

Pseudocdigo de variables Repetir Leer el smbolo de entrada Caso de smbolo $: entrada=$Letra:entrada= letraNumero:entrada= numero

Fdc: salirEstado = tabla(estado,entrada)Si etado = error entonces salirHasta estado=aceptar

Autmata de operadores

Operadores + - / *+, -, /, *

01

Tabla de transiciones de operadores

+-/*fdc

01111E

1EEEEA

Pseudocdigo de operadores

Repetir Leer el siguiente smbolo de entradaCaso de smbolo +:entrada:=+-:entrada:=-/:entrada:=/*:entrada:=*Fdc:entrada:= fdc

Fdc: salir

Estado = tabla(estado,entrada)Si estadp=error entonce salirHasta estado= aceptar

Cdigo de nuestro programapackage AnalizadorLexico;import java.awt.Font;import java.io.BufferedReader;import java.io.File;import java.io.FileReader;import java.io.IOException;import javax.swing.JOptionPane;import javax.swing.filechooser.FileNameExtensionFilter;public class lexico extends javax.swing.JFrame { Font tipo_funte; String[][] matriz_pal; String[][] matriz_var; String[][] matriz_oper; char pseu[]; char a_z[]; String mandar = ""; public lexico() { initComponents(); //Inicializacin de las matrices Font tipo_fuente = new Font("DialogInput 14", Font.BOLD, 16); matriz_pal = new String[19][12]; matriz_var = new String[4][4]; matriz_oper = new String[2][5]; matriz_pal[0][0] = "1"; matriz_pal[0][1] = "E"; matriz_pal[0][2] = "E"; matriz_pal[0][3] = "E"; matriz_pal[0][4] = "5"; matriz_pal[0][5] = "10"; matriz_pal[0][6] = "E"; matriz_pal[0][7] = "14"; matriz_pal[0][8] = "E"; matriz_pal[0][9] = "E"; matriz_pal[0][10] = "E"; matriz_pal[0][11] = "E";

matriz_pal[1][0] = "E"; matriz_pal[1][1] = "2"; matriz_pal[1][2] = "E"; matriz_pal[1][3] = "E"; matriz_pal[1][4] = "E"; matriz_pal[1][5] = "E"; matriz_pal[1][6] = "E"; matriz_pal[1][7] = "E"; matriz_pal[1][8] = "E"; matriz_pal[1][9] = "E"; matriz_pal[1][10] = "E"; matriz_pal[1][11] = "E";

matriz_pal[2][0] = "E"; matriz_pal[2][1] = "E"; matriz_pal[2][2] = "3"; matriz_pal[2][3] = "E"; matriz_pal[2][4] = "E"; matriz_pal[2][5] = "E"; matriz_pal[2][6] = "E"; matriz_pal[2][7] = "E"; matriz_pal[2][8] = "E"; matriz_pal[2][9] = "E"; matriz_pal[2][10] = "E"; matriz_pal[2][11] = "A";

matriz_pal[3][0] = "E"; matriz_pal[3][1] = "E"; matriz_pal[3][2] = "E"; matriz_pal[3][3] = "4"; matriz_pal[3][4] = "E"; matriz_pal[3][5] = "E"; matriz_pal[3][6] = "E"; matriz_pal[3][7] = "E"; matriz_pal[3][8] = "E"; matriz_pal[3][9] = "E"; matriz_pal[3][10] = "E"; matriz_pal[3][11] = "E";

matriz_pal[4][0] = "E"; matriz_pal[4][1] = "E"; matriz_pal[4][2] = "E"; matriz_pal[4][3] = "E"; matriz_pal[4][4] = "E"; matriz_pal[4][5] = "E"; matriz_pal[4][6] = "E"; matriz_pal[4][7] = "E"; matriz_pal[4][8] = "E"; matriz_pal[4][9] = "E"; matriz_pal[4][10] = "E"; matriz_pal[4][11] = "A";

matriz_pal[5][0] = "E"; matriz_pal[5][1] = "E"; matriz_pal[5][2] = "E"; matriz_pal[5][3] = "6"; matriz_pal[5][4] = "E"; matriz_pal[5][5] = "E"; matriz_pal[5][6] = "E"; matriz_pal[5][7] = "E"; matriz_pal[5][8] = "E"; matriz_pal[5][9] = "E"; matriz_pal[5][10] = "E"; matriz_pal[5][11] = "E";

matriz_pal[6][0] = "E"; matriz_pal[6][1] = "E"; matriz_pal[6][2] = "7"; matriz_pal[6][3] = "E"; matriz_pal[6][4] = "E"; matriz_pal[6][5] = "E"; matriz_pal[6][6] = "E"; matriz_pal[6][7] = "E"; matriz_pal[6][8] = "E"; matriz_pal[6][9] = "E"; matriz_pal[6][10] = "E"; matriz_pal[6][11] = "E";

matriz_pal[7][0] = "E"; matriz_pal[7][1] = "E"; matriz_pal[7][2] = "E"; matriz_pal[7][3] = "E"; matriz_pal[7][4] = "8"; matriz_pal[7][5] = "E"; matriz_pal[7][6] = "E"; matriz_pal[7][7] = "E"; matriz_pal[7][8] = "E"; matriz_pal[7][9] = "E"; matriz_pal[7][10] = "E"; matriz_pal[7][11] = "E";

matriz_pal[8][0] = "E"; matriz_pal[8][1] = "E"; matriz_pal[8][2] = "E"; matriz_pal[8][3] = "E"; matriz_pal[8][4] = "E"; matriz_pal[8][5] = "E"; matriz_pal[8][6] = "E"; matriz_pal[8][7] = "E"; matriz_pal[8][8] = "E"; matriz_pal[8][9] = "9"; matriz_pal[8][10] = "E"; matriz_pal[8][11] = "A";

matriz_pal[9][0] = "E"; matriz_pal[9][1] = "E"; matriz_pal[9][2] = "E"; matriz_pal[9][3] = "E"; matriz_pal[9][4] = "E"; matriz_pal[9][5] = "E"; matriz_pal[9][6] = "E"; matriz_pal[9][7] = "E"; matriz_pal[9][8] = "E"; matriz_pal[9][9] = "E"; matriz_pal[9][10] = "E"; matriz_pal[9][11] = "E";

matriz_pal[10][0] = "E"; matriz_pal[10][1] = "E"; matriz_pal[10][2] = "E"; matriz_pal[10][3] = "E"; matriz_pal[10][4] = "E"; matriz_pal[10][5] = "E"; matriz_pal[10][6] = "11"; matriz_pal[10][7] = "E"; matriz_pal[10][8] = "E"; matriz_pal[10][9] = "E"; matriz_pal[10][10] = "E"; matriz_pal[10][11] = "E";

matriz_pal[11][0] = "12"; matriz_pal[11][1] = "E"; matriz_pal[11][2] = "E"; matriz_pal[11][3] = "E"; matriz_pal[11][4] = "E"; matriz_pal[11][5] = "E"; matriz_pal[11][6] = "E"; matriz_pal[11][7] = "E"; matriz_pal[11][8] = "E"; matriz_pal[11][9] = "E"; matriz_pal[11][10] = "E"; matriz_pal[11][11] = "E";

matriz_pal[12][0] = "E"; matriz_pal[12][1] = "E"; matriz_pal[12][2] = "E"; matriz_pal[12][3] = "E"; matriz_pal[12][4] = "E"; matriz_pal[12][5] = "E"; matriz_pal[12][6] = "E"; matriz_pal[12][7] = "E"; matriz_pal[12][8] = "E"; matriz_pal[12][9] = "13"; matriz_pal[12][10] = "E"; matriz_pal[12][11] = "E"; matriz_pal[13][0] = "E"; matriz_pal[13][1] = "E"; matriz_pal[13][2] = "E"; matriz_pal[13][3] = "E"; matriz_pal[13][4] = "E"; matriz_pal[13][5] = "E"; matriz_pal[13][6] = "E"; matriz_pal[13][7] = "E"; matriz_pal[13][8] = "E"; matriz_pal[13][9] = "E"; matriz_pal[13][10] = "E"; matriz_pal[13][11] = "A"; matriz_pal[14][0] = "E"; matriz_pal[14][1] = "E"; matriz_pal[14][2] = "E"; matriz_pal[14][3] = "E"; matriz_pal[14][4] = "E"; matriz_pal[14][5] = "E"; matriz_pal[14][6] = "15"; matriz_pal[14][7] = "E"; matriz_pal[14][8] = "E"; matriz_pal[14][9] = "E"; matriz_pal[14][10] = "E"; matriz_pal[14][11] = "E"; matriz_pal[15][0] = "E"; matriz_pal[15][1] = "E"; matriz_pal[15][2] = "E"; matriz_pal[15][3] = "E"; matriz_pal[15][4] = "E"; matriz_pal[15][5] = "E"; matriz_pal[15][6] = "E"; matriz_pal[15][7] = "E"; matriz_pal[15][8] = "16"; matriz_pal[15][9] = "E"; matriz_pal[15][10] = "E"; matriz_pal[15][11] = "E"; matriz_pal[16][0] = "E"; matriz_pal[16][1] = "E"; matriz_pal[16][2] = "E"; matriz_pal[16][3] = "E"; matriz_pal[16][4] = "E"; matriz_pal[16][5] = "E"; matriz_pal[16][6] = "E"; matriz_pal[16][7] = "E"; matriz_pal[16][8] = "E"; matriz_pal[16][9] = "17"; matriz_pal[16][10] = "E"; matriz_pal[16][11] = "E"; matriz_pal[17][0] = "E"; matriz_pal[17][1] = "E"; matriz_pal[17][2] = "E"; matriz_pal[17][3] = "E"; matriz_pal[17][4] = "E"; matriz_pal[17][5] = "E"; matriz_pal[17][6] = "E"; matriz_pal[17][7] = "E"; matriz_pal[17][8] = "E"; matriz_pal[17][9] = "E"; matriz_pal[17][10] = "18"; matriz_pal[17][11] = "E"; matriz_pal[18][0] = "E"; matriz_pal[18][1] = "E"; matriz_pal[18][2] = "E"; matriz_pal[18][3] = "E"; matriz_pal[18][4] = "E"; matriz_pal[18][5] = "E"; matriz_pal[18][6] = "E"; matriz_pal[18][7] = "E"; matriz_pal[18][8] = "E"; matriz_pal[18][9] = "E"; matriz_pal[18][10] = "E"; matriz_pal[18][11] = "A"; //matriz de las vairables matriz_var[0][0] = "1"; matriz_var[0][1] = "E"; matriz_var[0][2] = "E"; matriz_var[0][3] = "E"; matriz_var[1][0] = "E"; matriz_var[1][1] = "2"; matriz_var[1][2] = "E"; matriz_var[1][3] = "E";

matriz_var[2][0] = "E"; matriz_var[2][1] = "2"; matriz_var[2][2] = "3"; matriz_var[2][3] = "A"; matriz_var[3][0] = "E"; matriz_var[3][1] = "E"; matriz_var[3][2] = "3"; matriz_var[3][3] = "A"; //matriz de los operadores matriz_oper[0][0] = "1"; matriz_oper[0][1] = "1"; matriz_oper[0][2] = "1"; matriz_oper[0][3] = "1"; matriz_oper[0][4] = "E"; matriz_oper[1][0] = "E"; matriz_oper[1][1] = "E"; matriz_oper[1][2] = "E"; matriz_oper[1][3] = "E"; matriz_oper[1][4] = "A"; //arreglo para evaluar las letras en el primer digito a_z = new char[27]; //Arreglo de letras a_z[0] = 'a'; a_z[1] = 'b'; a_z[2] = 'c'; a_z[3] = 'd'; a_z[4] = 'e'; a_z[5] = 'f'; a_z[6] = 'g'; a_z[7] = 'h'; a_z[8] = 'i'; a_z[9] = 'j'; a_z[10] = 'k'; a_z[12] = 'l'; a_z[13] = 'm'; a_z[14] = 'n'; a_z[15] = 'o'; a_z[16] = 'p'; a_z[17] = 'q'; a_z[18] = 'r'; a_z[19] = 's'; a_z[20] = 't'; a_z[21] = 'u'; a_z[22] = 'v'; a_z[23] = 'w'; a_z[24] = 'x'; a_z[25] = 'y'; a_z[26] = 'z'; } //varables de codigo para cargar el archivo de bloc de notas String lectura = "", texto = ""; File fi;//Mtodo para leer el bloc de notas void leer_archivo() { javax.swing.JFileChooser obj1 = new javax.swing.JFileChooser(); FileNameExtensionFilter filtrando = new FileNameExtensionFilter("txt", "txt"); obj1.setFileFilter(filtrando); obj1.showOpenDialog(obj1); String direccion_archivo = obj1.getSelectedFile().getAbsolutePath(); fi = new File(direccion_archivo); try { FileReader fil_ri = new FileReader(fi); BufferedReader buf_red = new BufferedReader(fil_ri);

String auxiliar; while ((auxiliar = buf_red.readLine()) != null) { lectura = lectura + auxiliar + "\n";

} } catch (IOException e) { JOptionPane.showMessageDialog(null, e); } } private void BotonAbrirActionPerformed(java.awt.event.ActionEvent evt) {

lectura = ""; // TODO add your handling code here: leer_archivo(); TextIngresar.setText(lectura); } int bandera = 0; int inic, fin; int Error = 0; int posicion = 0; int x = 0; private void BtnValidarActionPerformed(java.awt.event.ActionEvent evt) { errores.setText(""); Error = 0; posicion = 0; mandar = ""; //Variable que obtiene toda la cadena de texto del BLOC DE NOTAS String cad = TextIngresar.getText(); x = 0; while (posicion < cad.length()) { //Variables para usar en el autmata String estado = "0"; int entrada = 0; inic = posicion; while (cad.charAt(posicion) != ' ') { posicion = posicion + 1; } fin = posicion; do { //INICIA AUTMATA DE PALABRAS RESERVADAS switch (cad.charAt(x)) { case 's': entrada = 0; break; case 'i': entrada = 1; break; case 'n': entrada = 2; break; case 'o': entrada = 3; break; case 'd': entrada = 4; break; case 'k': entrada = 5; break; case 'a': entrada = 6; break; case 'h': entrada = 7; break; case 'c': entrada = 8; break; case 'e': entrada = 9; break; case 'r': entrada = 10; break; case ' ': entrada = 11; break; default: Error = 1; x= inic; break; } if (Error == 1) { x =inic; break; } estado = matriz_pal[Integer.parseInt(estado)][entrada]; if (estado.equals("E")) { Error = 1; break; } x = x + 1; } while (!estado.equals("A")); //AUTMATA DE VARIABLES if (Error == 1 || estado.equals("E")) { estado = "0"; entrada = 0; Error = 0; do { //INICIA AUTMATA DE VARIABLES

switch (cad.charAt(x)) { case '$': entrada = 0; break; case '0': entrada = 2; break; case '1': entrada = 2; break; case '2': entrada = 2; break; case '3': entrada = 2; break; case '4': entrada = 2; break; case '5': entrada = 2; break; case '6': entrada = 2; break; case '7': entrada = 2; break; case '8': entrada = 2; break; case '9': entrada = 2; break; case 'a': entrada = 1; break; case 'b': entrada = 1; break; case 'c': entrada = 1; break; case 'd': entrada = 1; break; case 'e': entrada = 1; break; case 'f': entrada = 1; break; case 'g': entrada = 1; break; case 'h': entrada = 1; break; case 'i': entrada = 1; break; case 'j': entrada = 1; break; case 'k': entrada = 1; break; case 'l': entrada = 1; break; case 'm': entrada = 1; break; case 'n': entrada = 1; break; case 'o': entrada = 1; break; case 'p': entrada = 1; break; case 'q': entrada = 1; break; case 'r':

entrada = 1; break; case 's': entrada = 1; break; case 't': entrada = 1; break; case 'u': entrada = 1; break; case 'v': entrada = 1; break; case 'w': entrada = 1; break; case 'x': entrada = 1; break; case 'y': entrada = 1; break; case 'z': entrada = 1; break;

case ' ': entrada = 3; break;

default:

Error = 1; x = inic; break; } estado = matriz_var[Integer.parseInt(estado)][entrada]; if (estado.equals("E")) { Error = 1; x = inic; break; } if (Error == 1) { break; } x = x + 1; } while (!estado.equals("A")); } if (Error == 1 || estado.equals("E")) { estado = "0"; entrada = 0; Error = 0; do { //INICIA AUTMATA DE VARIABLES switch (cad.charAt(x)) { case '+': entrada = 0; break; case '-': entrada = 1; break; case '*': entrada = 2; break; case '/': entrada = 3; break; case ' ': entrada = 4; break; default: Error = 1; break; } estado = matriz_oper[Integer.parseInt(estado)][entrada]; if (estado.equals("E")) { Error = 1; break; } if (Error == 1) { break; } x = x + 1; } while (!estado.equals("A")); } if (Error == 1 || estado.equals("E")) { Error = 0; x = posicion + 1; mandar = mandar + "\n" + cad.substring(inic, fin); errores.setText(mandar ); } posicion = fin + 1; Error = 0; } if (errores.getText().equals("")) { JOptionPane.showMessageDialog(this, "Cadena vlida "); } else { JOptionPane.showMessageDialog(this, "Cadena invlida"); }}

Manual

El botn Open File permite encontrar la ruta de nuestro archivo .txt como se muestra las dos figuras:

Abriendo el archivo automticamente se coloca el contenido del archivo.txt dentro del campo de texto en el rea rosada.

Al presionar el botn Validar se mandar un alerta de mensaje si el autmata fue validado o rechazado.

En caso de que nuestro analizador rechace la cadena se deber de mandar a imprimir dentro del rea de texto el token que no sea aceptado como se muestra a continuacin.

Tambin ha sido anexado un botn adicional que nos sirve nicamente para borrar las letras donde ha sido insertada la cadena del bloc de notas y tambin borra las palabras errneas en el cuadro de palabras no validas por el autmata los campos en el cuadro de texto.

Conclusin

En esta ocasin se implement el uso de los autmatas deterministas, utilizamos cada correspondencia por separado de cada autmata dentro del cdigo, la validacin de espacios se realiz dentro de la codificacin dentro del lenguaje de programacin Java.

Nuestro analizador presenta la forma de reportar clara y exactamente la presencia de errores. En conclusin el analizador implementado es el Analizador sintctico, lo cual el objetivo de este es identificar los tokens que forman parte de cada instruccin y ver que estas estn correctamente escritas.Pgina 20