Professional Documents
Culture Documents
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
11
12
13
17
S
D
K
10
14
15
16
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
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
FDC
E
E
A
A
Pseudocdigo de variables
Repetir
Autmata de operadores
Operadores
+
Pgina
6
/
*
+, -, /, *
0
1
+
1
E
1
E
/
1
E
*
1
E
fdc
E
A
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
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]
matriz_pal[1][1]
matriz_pal[1][2]
matriz_pal[1][3]
matriz_pal[1][4]
matriz_pal[1][5]
matriz_pal[1][6]
matriz_pal[1][7]
matriz_pal[1][8]
matriz_pal[1][9]
=
=
=
=
=
=
=
=
=
=
"E";
"2";
"E";
"E";
"E";
"E";
"E";
"E";
"E";
"E";
Pgina
8
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";
Pgina
9
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]
matriz_pal[8][1]
matriz_pal[8][2]
matriz_pal[8][3]
matriz_pal[8][4]
matriz_pal[8][5]
matriz_pal[8][6]
matriz_pal[8][7]
matriz_pal[8][8]
=
=
=
=
=
=
=
=
=
"E";
"E";
"E";
"E";
"E";
"E";
"E";
"E";
"E";
Pgina
10
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";
Pgina
11
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";
Pgina
12
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";
Pgina
13
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';
Pgina
14
a_z[22]
a_z[23]
a_z[24]
a_z[25]
a_z[26]
=
=
=
=
=
'v';
'w';
'x';
'y';
'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;
Pgina
15
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;
Pgina
16
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':
Pgina
17
entrada
break;
case '3':
entrada
break;
case '4':
entrada
break;
case '5':
entrada
break;
case '6':
entrada
break;
case '7':
entrada
break;
case '8':
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':
= 2;
= 2;
= 2;
= 2;
= 2;
= 2;
= 2;
= 2;
= 1;
= 1;
= 1;
= 1;
= 1;
= 1;
= 1;
Pgina
18
entrada
break;
case 'i':
entrada
break;
case 'j':
entrada
break;
case 'k':
entrada
break;
case 'l':
entrada
break;
case 'm':
entrada
break;
case 'n':
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;
= 1;
= 1;
= 1;
= 1;
= 1;
= 1;
= 1;
= 1;
= 1;
= 1;
= 1;
= 1;
= 1;
= 1;
= 1;
Pgina
19
case 'w':
entrada
break;
case 'x':
entrada
break;
case 'y':
entrada
break;
case 'z':
entrada
break;
= 1;
= 1;
= 1;
= 1;
case '+':
entrada
break;
case '-':
entrada
break;
case '*':
entrada
break;
case '/':
entrada
break;
= 0;
= 1;
= 2;
= 3;
}
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
Abriendo el archivo automticamente se coloca el contenido del archivo.txt dentro del campo
de texto en el rea rosada.
Pgina
23
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
Pgina
27