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
Top Related