Você está na página 1de 27

Reporte de analizador lxico

rea acadmica: Ingeniera en sistemas computacionales.

Elaborado por:
Balderas Avalos Maya Beln
Balanzar Hernndez Aurora Lucia
Morales Vera Ulices Elevi

Pgina
1

Tabla de contenido
Introduccin.......................................................................................................3
Autmata de palabra reservadas......................................................................4
Autmata de variables......................................................................................4
Autmata de operadores...................................................................................5
Cdigo del nuestro programa...........................................................................6
Manual.............................................................................................................20
Conclusin.......................................................................................................23

Pgina
2

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.

Pgina
3

Autmata de palabra reservadas


Palabras reservadas
Else=Sino
If=Si
While=Donde
Case=Kase
Do=Hacer

11

12

13

17

S
D

K
10

14

15

16

Tabla de transiciones de palabras reservadas

0
1
2
3
4

S
1
E
E
E
E

I
E
2
E
E
E

N
E
E
3
E
E

O
E
E
E
4
E

D
5
E
E
E
E

K
10
E
E
E
E

A
E
E
E
E
E

H
14
E
E
E
E

Pgina
4

C
E
E
E
E
E

E
E
E
E
E
E

R
E
E
E
E
E

FDC
E
E
A
E
A

18

5
6
7
8
9
10
11
12
13
14
15
16
17
18

E
E
E
E
E
E
12
E
E
E
E
E
E
E

E
E
E
E
E
E
E
E
E
E
E
E
E
E

E
7
E
E
E
E
E
E
E
E
E
E
E
E

6
E
E
E
E
E
E
E
E
E
E
E
E
E

E
E
8
E
E
E
E
E
E
E
E
E
E
E

E
E
E
E
E
E
E
E
E
E
E
E
E
E

E
E
E
E
E
11
E
E
E
15
E
E
E
E

E
E
E
E
E
E
E
E
E
E
E
E
E
E

E
E
E
E
E
E
E
E
E
E
16
E
E
E

E
E
E
9
E
E
E
13
E
E
E
17
E
E

E
E
E
E
E
E
E
E
E
E
E
E
18
E

E
E
E
E
A
E
E
E
A
E
E
E
E
A

Pseudocdigo de palabras reservadas


Repetir
Leer el siguiente smbolo de entrada
Caso de smbolo
S: entrada:= S
I: entrada:=I
N: entrada:=N
O: entrada:=O
D: entrada:=D
K: entrada:=K
A: entrada:=A
H: entrada:=H
C: entrada:=C
E: entrada:=E
R: entrada:=R
Fdc: entrada:=Fdc
Fdc: Salir
Estado= Tabla(estado,entrada)
Si estado=error entonces salir
Hasta estado= aceptar

Autmata de variables
Reglas para las variables:
1. Empezar con: $
Pgina
5

2.
3.
4.
5.

Letra
Letra seguida de n letras
Numero
Seguido de n nmeros

0
$

0
1
2
3

$
1
E
E
E

2
L

NUM

3
NUM

Tabla de transiciones de las variables


LETRA
NUMERO
E
E
2
E
2
3
E
3

FDC
E
E
A
A

Pseudocdigo de variables
Repetir

Leer el smbolo de entrada


Caso de smbolo
$: entrada=$
Letra:entrada= letra
Numero:entrada= numero
Fdc: salir
Estado = tabla(estado,entrada)
Si etado = error entonces salir
Hasta estado=aceptar

Autmata de operadores
Operadores
+
Pgina
6

/
*

+, -, /, *

Tabla de transiciones de operadores

0
1

+
1
E

1
E

/
1
E

*
1
E

Pseudocdigo de operadores
Repetir
Leer el siguiente smbolo de entrada
Caso de smbolo
+:entrada:=+
-:entrada:=/:entrada:=/
*:entrada:=*
Fdc:entrada:= fdc
Fdc: salir
Estado = tabla(estado,entrada)
Si estadp=error entonce salir
Hasta estado= aceptar

Pgina
7

fdc
E
A

Cdigo de nuestro programa


package 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
Pgina
8

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";
Pgina
9

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]
matriz_pal[6][1]
matriz_pal[6][2]
matriz_pal[6][3]
matriz_pal[6][4]
matriz_pal[6][5]
matriz_pal[6][6]
matriz_pal[6][7]

=
=
=
=
=
=
=
=

"E";
"E";
"7";
"E";
"E";
"E";
"E";
"E";
Pgina
10

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";
Pgina
11

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";
Pgina
12

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";
Pgina
13

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";
Pgina
14

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 {
Pgina
15

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)) {
Pgina
16

case 's':
entrada =
break;
case 'i':
entrada =
break;
case 'n':
entrada =
break;
case 'o':
entrada =
break;
case 'd':
entrada =
break;
case 'k':
entrada =
break;
case 'a':
entrada =
break;
case 'h':
entrada =
break;
case 'c':
entrada =
break;
case 'e':
entrada =
break;
case 'r':
entrada =
break;
case ' ':
entrada =
break;
default:
Error = 1;
x= inic;
break;

0;
1;
2;
3;
4;
5;
6;
7;
8;
9;
10;
11;

}
if (Error == 1) {
x =inic;
break;
}
Pgina
17

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':
Pgina
18

entrada
break;
case '9':
entrada
break;
case 'a':
entrada
break;
case 'b':
entrada
break;
case 'c':
entrada
break;
case 'd':
entrada
break;
case 'e':
entrada
break;
case 'f':
entrada
break;
case 'g':
entrada
break;
case 'h':
entrada
break;
case 'i':
entrada
break;
case 'j':
entrada
break;
case 'k':
entrada
break;
case 'l':
entrada
break;
case 'm':
entrada
break;
case 'n':

= 2;
= 2;
= 1;
= 1;
= 1;
= 1;
= 1;
= 1;
= 1;
= 1;
= 1;
= 1;
= 1;
= 1;
= 1;

Pgina
19

entrada
break;
case 'o':
entrada
break;
case 'p':
entrada
break;
case 'q':
entrada
break;
case 'r':
entrada
break;
case 's':
entrada
break;
case 't':
entrada
break;
case 'u':
entrada
break;
case 'v':
entrada
break;
case 'w':
entrada
break;
case 'x':
entrada
break;
case 'y':
entrada
break;
case 'z':
entrada
break;

= 1;
= 1;
= 1;
= 1;

= 1;
= 1;
= 1;
= 1;
= 1;
= 1;
= 1;
= 1;
= 1;

case ' ':


entrada = 3;
break;
default:
Pgina
20

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;
Pgina
21

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:

Pgina
22

Pgina
23

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.

Pgina
24

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.

Pgina
25

Conclusin
Pgina
26

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
27