using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace AnalizadorLexico
{
public partial class Form1 : Form
{
int x;//Declaro una Variable Publica para Guardar las Posicones
//Declaro 3 Arreglos Mas Para Guardar mis Simbolos
bool Erro = false;
public static int[] Codigo
=new int[61]; public static string[] Tokens
= new string[61]; public static string[] Simbolo
= new string[61]; public Form1()
{
InitializeComponent();
for (int i = 0; i < Codigo.Length; i++) // Inicializamos los Codigos
Codigo[i] = i + 1;
Simbolo[0] = "Procedimiento"; Tokens[0] = "PALABRA RESERVADA - PR";
Simbolo[1] = "Funcion"; Tokens[1] = "PALABRA RESERVADA - PR";
Simbolo[2] = "Principal";Tokens[2] = "PALABRA RESERVADA - PR";
Simbolo[3] = "Entero";Tokens[3] = "PALABRA RESERVADA - PR";
Simbolo[4] = "Decimal";Tokens[4] = "PALABRA RESERVADA - PR";
Simbolo[5] = "Doble";Tokens[5] = "PALABRA RESERVADA - PR";
Simbolo[6] = "Caracter";Tokens[6] = "PALABRA RESERVADA - PR";
Simbolo[7] = "Cadena";Tokens[7] = "PALABRA RESERVADA - PR";
Simbolo[8] = "Booleano";Tokens[8] = "PALABRA RESERVADA - PR";
Simbolo[9] = "Si";Tokens[9] = "PALABRA RESERVADA - PR";
Simbolo[10] = "Entonces";Tokens[10] = "PALABRA RESERVADA - PR";
Simbolo[11] = "Sino";Tokens[11] = "PALABRA RESERVADA - PR";
Simbolo[12] = "Abrir";Tokens[12] = "PALABRA RESERVADA - PR";
Simbolo[13] = "Caso";Tokens[13] = "PALABRA RESERVADA - PR";
Simbolo[14] = "Quiebre";Tokens[14] = "PALABRA RESERVADA - PR";
Simbolo[15] = "Defecto";Tokens[15] = "PALABRA RESERVADA - PR";
Simbolo[16] = "Ira";Tokens[16] = "PALABRA RESERVADA - PR";
Simbolo[17] = "Retornar";Tokens[17] = "PALABRA RESERVADA - PR";
Simbolo[18] = "Para";Tokens[18] = "PALABRA RESERVADA - PR";
Simbolo[19] = "Mientras";Tokens[19] = "PALABRA RESERVADA - PR";
Simbolo[20] = "Hacer";Tokens[20] = "PALABRA RESERVADA - PR";
Simbolo[21] = "Mostrar";Tokens[21] = "PALABRA RESERVADA - PR";
Simbolo[22] = "Leer";Tokens[22] = "PALABRA RESERVADA - PR";
Simbolo[23] = "Limpiar";Tokens[23] = "PALABRA RESERVADA - PR";
Simbolo[24] = "Pausa";Tokens[24] = "PALABRA RESERVADA - PR";
Simbolo[25] = "Abs";Tokens[25] = "PALABRA RESERVADA - PR";
Simbolo[26] = "Mod";Tokens[26] = "PALABRA RESERVADA - PR";
Simbolo[27] = "Exp";Tokens[27] = "PALABRA RESERVADA - PR";
Simbolo[28] = "Sqrt";Tokens[28] = "PALABRA RESERVADA - PR";
Simbolo[29] = "(";Tokens[29] = "SIGNO SEPARADOR";
Simbolo[30] = ")";Tokens[30] = "SIGNO SEPARADOR";
Simbolo[31] = "{";Tokens[31] = "SIGNO SEPARADOR";
Simbolo[32] = "}";Tokens[32] = "SIGNO SEPARADOR";
Simbolo[33] = "[";Tokens[33] = "SIGNO SEPARADOR";
Simbolo[34] = "]";Tokens[34] = "SIGNO SEPARADOR";
Simbolo[35] = "+";Tokens[35] = "OPERADOR - OP";
Simbolo[36] = "-"; Tokens[36] = "OPERADOR - OP";
Simbolo[37] = "*"; Tokens[37] = "OPERADOR - OP";
Simbolo[38] = "/"; Tokens[38] = "OPERADOR - OP";
Simbolo[39] = "&&"; Tokens[39] = "OPERADOR - OP";
Simbolo[40] = "++"; Tokens[40] = "OPERADOR - OP";
Simbolo[41] = "--"; Tokens[41] = "OPERADOR - OP";
Simbolo[42] = "="; Tokens[42] = "SIGNO COMPARADOR - SC";
Simbolo[43] = "=="; Tokens[43] = "SIGNO COMPARADOR - SC";
Simbolo[44] = "<="; Tokens[44] = "SIGNO COMPARADOR - SC";
Simbolo[45] = ">="; Tokens[45] = "SIGNO COMPARADOR - SC";
Simbolo[46] = "<"; Tokens[46] = "SIGNO COMPARADOR - SC";
Simbolo[47] = ">"; Tokens[47] = "SIGNO COMPARADOR - SC";
Simbolo[48] = "!="; Tokens[48] = "SIGNO COMPARADOR - SC";
Simbolo[49] = "!"; Tokens[49] = "SIGNO RELACIONADOR - SR";
Simbolo[50] = "&"; Tokens[50] = "SIGNO RELACIONADOR - SR";
Simbolo[51] = "|"; Tokens[51] = "SIGNO RELACIONADOR - SR";
Simbolo[52] = ","; Tokens[52] = "SIGNO DE PUNTUACION - SP";
Simbolo[53] = ";"; Tokens[53] = "SIGNO DE PUNTUACION - SP";
Simbolo[54] = ":"; Tokens[54] = "SIGNO DE PUNTUACION - SP";
Simbolo[55] = "\""; Tokens[55] = "SIGNO DE PUNTUACION - SP";
Simbolo[56] = "'"; Tokens[56] = "SIGNO DE PUNTUACION - SP";
Simbolo[57] = "."; Tokens[57] = "SIGNO DE PUNTUACION - SP";
Simbolo[58] = "_"; Tokens[58] = "SIGNO SEPARADOR";
Simbolo[59] = "FALSE"; Tokens[59] = "Booleano - BO";
Simbolo[60] = "TRUE"; Tokens[60] = "Booleano - BO";
}
private void btnAnalizar_Click(object sender, EventArgs e)
{
if (dgvtokens.RowCount > 0) // Limpio Simpre y Cuando Hayga Datos en el DataGridWied
dgvtokens.Rows.Clear();
if (dgvErrores.RowCount > 0)
dgvErrores.Rows.Clear();
Erro = false;
richTextBox2.Text = "";
Analizar(); //LLamo ah mi Procedimiento Analizar
}
private void Analizar()
{
char[] Cadena = richTextBox1.Text.ToCharArray();//Separo del Texto Fuente En Caracteres Separados y Almaceno en un Array de tipo Caracter
string Texto = "";
int i = 0; //Declaro mi Contador para Poder Recorrer toda la Cadena
while (i < Cadena.Length)
{
if (i < Cadena.Length - 1)
{
//Verificamos con que Letra Empiezza i
if (AnalizarLetra(Cadena[i]))
{
x = i;//Guardamos la Posicion Donde Empieza
while (AnalizarNumero(Cadena[i]) || AnalizarLetra(Cadena[i]) || Cadena[i] == '_')//Repetira Mientras Sea un Numero oh una Letra
{
Texto = Texto + Cadena[i].ToString();
i++;
if (i == Cadena.Length) break;//Si Llegamos ah la Ultina Posicion Salimos porque ya no hay nada por analizar
}
//Ver si es una Palabra Reservada oh es un Identificador
PR(Texto); //Llamamos ah un Procedimiento Palabra Reservada -PR para Confirmar si es una PR
Texto = "";
}
else if (AnalizarNumero(Cadena[i]) || (Cadena[i].ToString() == "-" && AnalizarNumero(Cadena[i + 1])))
{
x = i;//Guardamos la Posicion Donde Empieza
string Ti = "E";
bool SolounPunto = true; //Inicializamos una Variable Aux que nos Va Indicar que la Concadenacion ya Tiene un Punto y no Puede Aceptar mas
if (Cadena[i].ToString() == "-") //si es que primero empieza con un -
{
Texto = Texto + Cadena[i].ToString();
i += 1;
}
while (AnalizarNumero(Cadena[i])) //Repetira mientras sea un Numero
{
Texto = Texto + Cadena[i].ToString();
i++;
if (i < Cadena.Length - 1) //entrara siempre y cuando no sea el ultimo Caracter del Texto fuente
{
if (Cadena[i] == '.' && AnalizarNumero(Cadena[i + 1]) && SolounPunto) // Si se Cumple las Reglas Seguimos Cancadenando
{
Texto = Texto + Cadena[i].ToString();
SolounPunto = false;
Ti = "D";
i++;
}
}
if (i == Cadena.Length) break;//Si Llegamos ah la Ultina Posicion Salimos porque ya no hay nada por analizar
}
//Mostrar el Numero
if (Ti == "E") //Si es Entero
{
dgvtokens.RowCount = dgvtokens.RowCount + 1;
dgvtokens[0, dgvtokens.RowCount - 1].Value = "60";
dgvtokens[1, dgvtokens.RowCount - 1].Value = Texto.ToString();
dgvtokens[2, dgvtokens.RowCount - 1].Value = "NUMERO ENTERO - NE";
dgvtokens[3, dgvtokens.RowCount - 1].Value = (x + 1).ToString();
Texto = "";
}
else //Si es Decimal
{
dgvtokens.RowCount = dgvtokens.RowCount + 1;
dgvtokens[0, dgvtokens.RowCount - 1].Value = "61";
dgvtokens[1, dgvtokens.RowCount - 1].Value = Texto.ToString();
dgvtokens[2, dgvtokens.RowCount - 1].Value = "NUMERO DECIMAL - ND";
dgvtokens[3, dgvtokens.RowCount - 1].Value = (x + 1).ToString();
Texto = "";
}
}
else if (Cadena[i].ToString() == " " || Cadena[i].ToString() == "\n" || Cadena[i].ToString() == "\t")//si hay un espacio o un enter seguimos avanzando
i++;
else if (char.IsSymbol(Cadena[i]) || char.IsSeparator(Cadena[i]) || char.IsPunctuation(Cadena[i])) // ahora vemos si son simbolos
{
x = i;
if (i < Cadena.Length - 1)
{
if (Cadena[i].ToString() == "=" && Cadena[i + 1].ToString() == "=")
{
string Union = Cadena[i].ToString() + Cadena[i + 1].ToString();
AnalizarSimbolo(Union, x);
i = i + 2;
}
else if (Cadena[i].ToString() == "!" && Cadena[i + 1].ToString() == "=")
{
string Union = Cadena[i].ToString() + Cadena[i + 1].ToString();
AnalizarSimbolo(Union, x);
i = i + 2;
}
else if (Cadena[i].ToString() == ">" && Cadena[i + 1].ToString() == "=")
{
string Union = Cadena[i].ToString() + Cadena[i + 1].ToString();
AnalizarSimbolo(Union, x);
i = i + 2;
}
else if (Cadena[i].ToString() == "<" && Cadena[i + 1].ToString() == "=")
{
string Union = Cadena[i].ToString() + Cadena[i + 1].ToString();
AnalizarSimbolo(Union, x);
i = i + 2;
}
else if (Cadena[i].ToString() == "+" && Cadena[i + 1].ToString() == "+")
{
string Union = Cadena[i].ToString() + Cadena[i + 1].ToString();
AnalizarSimbolo(Union, x);
i = i + 2;
}
else if (Cadena[i].ToString() == "-" && Cadena[i + 1].ToString() == "-")
{
string Union = Cadena[i].ToString() + Cadena[i + 1].ToString();
AnalizarSimbolo(Union, x);
i = i + 2;
}
else if (Cadena[i].ToString() == "&" && Cadena[i + 1].ToString() == "&")
{
string Union = Cadena[i].ToString() + Cadena[i + 1].ToString();
AnalizarSimbolo(Union, x);
i = i + 2;
}
else if (Cadena[i].ToString() == "/" && Cadena[i + 1].ToString() == "/") // Para los Comentarios de Linea
{
string Union = "";
x = i;
for (int j = i; j < Cadena.Length; j++)
{
if (Cadena[i].ToString() != "\n")
{
Union = Union + Cadena[j];
i += 1;//Incremento mi Contador
}
else
{
i = j;//Intercambio la Posicion Donde Estuvo el Enter
break;
}
}
dgvtokens.RowCount = dgvtokens.RowCount + 1;
dgvtokens[0, dgvtokens.RowCount - 1].Value = "65";
dgvtokens[1, dgvtokens.RowCount - 1].Value = Union.ToString();
dgvtokens[2, dgvtokens.RowCount - 1].Value = "COMENTARIO DE LINEA - CL";
dgvtokens[3, dgvtokens.RowCount - 1].Value = (x + 1).ToString();
}
else if (Cadena[i].ToString() == "/" && Cadena[i + 1].ToString() == "*") // Para los Comentarios de Parrafo
{
x = i;
int flag = -1;
//Recorro Toda mi Cadena para Ver si se Encuentra * y el /
for (int j = i + 2; j < Cadena.Length; j++)
{
if (j + 1 != Cadena.Length)
{
if (Cadena[j].ToString() == "*" && Cadena[j + 1].ToString() == "/")
{
flag = j + 1;
break;
}
}
}
if (flag > -1)
{
i = flag + 1;
dgvtokens.RowCount = dgvtokens.RowCount + 1;
dgvtokens[0, dgvtokens.RowCount - 1].Value = "65";
dgvtokens[1, dgvtokens.RowCount - 1].Value = "/* */";
dgvtokens[2, dgvtokens.RowCount - 1].Value = "COMENTARIO DE PARRAFO - CP";
dgvtokens[3, dgvtokens.RowCount - 1].Value = (x + 1).ToString();
}
else
{
AnalizarSimbolo(Cadena[i].ToString(), x);//Analizo el Simbolo Solo
i = i + 1;
}
}
else if (Cadena[i].ToString() == "\"") //Cada Vez que encuentra una Comilla
{
int flag = -1;
string Union = "";
x = i;
//Recorrer Toda la Cadena Hasta Ubicar el ""
for (int j = i + 1; j < Cadena.Length; j++)
{
if (Cadena[j].ToString() == "\"")
{
flag = j;
break;
}
else if (Cadena[j].ToString() == "\n")//oh si llego ah fin de linea y no encontro nada
{
flag = -1;
break;
}
}
if (flag > -1)
{
i = flag + 1;//Actualizamos la Nueva Posicion ah Buscar e Incrementado mas uno
//Un Pequeño Recorrido para Concadenar
for (int k = x; k < i; k++)
Union = Union + Cadena[k];
dgvtokens.RowCount = dgvtokens.RowCount + 1;
dgvtokens[0, dgvtokens.RowCount - 1].Value = "62";
dgvtokens[1, dgvtokens.RowCount - 1].Value = Union.ToString();
dgvtokens[2, dgvtokens.RowCount - 1].Value = "CADENA - CA";
dgvtokens[3, dgvtokens.RowCount - 1].Value = (x + 1).ToString();
}
else
{
AnalizarSimbolo(Cadena[i].ToString(), x);//Analizo el Simbolo Solo
i = i + 1;
}
}
else if (Cadena[i].ToString() == "'") //Cada Vez que Encuentre una Comilla Simple
{
x = i;
string Union = Cadena[i].ToString() + Cadena[i + 1].ToString();
i = i + 2;
if (i <= Cadena.Length - 1)
{
if (Cadena[i].ToString() == "'") //Si Cumple la Condicion
{
dgvtokens.RowCount = dgvtokens.RowCount + 1;
dgvtokens[0, dgvtokens.RowCount - 1].Value = "63";
dgvtokens[1, dgvtokens.RowCount - 1].Value = Union.ToString() + Cadena[i].ToString();
dgvtokens[2, dgvtokens.RowCount - 1].Value = "CARACTER - CR";
dgvtokens[3, dgvtokens.RowCount - 1].Value = (x + 1).ToString();
i++;
}
else
{
i = x;
AnalizarSimbolo(Cadena[i].ToString(), x);
i = i + 1;
}
}
else //Regreso al Principio donde Almaceno mi Puntero
{
i = x;
AnalizarSimbolo(Cadena[i].ToString(), x);
i = i + 1;
}
}
else //Si no se Cumple nada de las Condiciones Dada Analizo el Simbolo para Ver si es un Desconocido
{
AnalizarSimbolo(Cadena[i].ToString(), x);
i = i + 1;
}
}
else // Si Solo Tengo un Simbolo
{
AnalizarSimbolo(Cadena[i].ToString(), x);
i = i + 1;
}
}
}
else //Si solo es una Cadena de Longitud 1
{
x = i;
if (AnalizarNumero(Cadena[i]))
{
Texto = Cadena[i].ToString();
dgvtokens.RowCount = dgvtokens.RowCount + 1;
dgvtokens[0, dgvtokens.RowCount - 1].Value = "60";
dgvtokens[1, dgvtokens.RowCount - 1].Value = Texto.ToString();
dgvtokens[2, dgvtokens.RowCount - 1].Value = "NUMERO ENTERO - NE";
dgvtokens[3, dgvtokens.RowCount - 1].Value = (x + 1).ToString();
}
else if (AnalizarLetra(Cadena[i]))
{
Texto = Cadena[i].ToString();
PR(Texto); //Llamamos ah un Procedimiento Palabra Reservada -PR para Confirmar si es una PR
}
else
{
AnalizarSimbolo(Cadena[i].ToString(), x);
}
Texto = "";
i++;
}
}
richTextBox2.Text = (Erro) ? "Analisis Lexico INCORRECTO" : "Analisis Lexico CORRECTO";
}
private void AnalizarSimbolo(string Union, int PosEmpieza)
{
int flag = -1;
int Pos = -1;
for (int i = 29; i < Simbolo.Length; i++)
{
if (Simbolo[i] == Union)
{
flag = 1;
Pos = i;
break;
}
}
//Verificamos si el Simbolo Pertenece al Lp
if (flag > -1)
{
dgvtokens.RowCount = dgvtokens.RowCount + 1;
dgvtokens[0, dgvtokens.RowCount - 1].Value = Codigo[Pos];
dgvtokens[1, dgvtokens.RowCount - 1].Value = Union.ToString();
dgvtokens[2, dgvtokens.RowCount - 1].Value = Tokens[Pos];
dgvtokens[3, dgvtokens.RowCount - 1].Value = (PosEmpieza + 1).ToString();
}
else
{
Erro = true;
dgvtokens.RowCount = dgvtokens.RowCount + 1;
dgvtokens[0, dgvtokens.RowCount - 1].Value = "64";
dgvtokens[1, dgvtokens.RowCount - 1].Value = Union.ToString();
dgvtokens[2, dgvtokens.RowCount - 1].Value = "SIMBOLO DESCONOCIDO - SD";
dgvtokens[3, dgvtokens.RowCount - 1].Value = (PosEmpieza + 1).ToString();
dgvErrores.RowCount = dgvErrores.RowCount + 1;
dgvErrores[0, dgvErrores.RowCount - 1].Value = "1";
dgvErrores[1, dgvErrores.RowCount - 1].Value = Union.ToString();
dgvErrores[2, dgvErrores.RowCount - 1].Value = (PosEmpieza + 1).ToString();
}
}
private void PR(string Texto)
{
int flag = -1;
int Pos = -1;
for (int i = 0; i < Simbolo.Length; i++)
{
if (Simbolo[i] == Texto)
{
flag = 1;
Pos = i;
break;
}
}
if (flag > -1) // Confirmamos si es una PR
{
dgvtokens.RowCount = dgvtokens.RowCount + 1;
dgvtokens[0, dgvtokens.RowCount - 1].Value = Codigo[Pos];
dgvtokens[1, dgvtokens.RowCount - 1].Value = Texto.ToString();
dgvtokens[2, dgvtokens.RowCount - 1].Value = Tokens[Pos];
dgvtokens[3, dgvtokens.RowCount - 1].Value = (x + 1).ToString();
}
else
{
dgvtokens.RowCount = dgvtokens.RowCount + 1;
dgvtokens[0, dgvtokens.RowCount - 1].Value = "59";
dgvtokens[1, dgvtokens.RowCount - 1].Value = Texto.ToString();
dgvtokens[2, dgvtokens.RowCount - 1].Value = "VARIABLE O IDENTIFICADOR - ID";
dgvtokens[3, dgvtokens.RowCount - 1].Value = (x + 1).ToString();
}
}
private bool AnalizarNumero(char p)
{
bool Estado;
switch (p.ToString())
{
case "0":
case "1":
case "2":
case "3":
case "4":
case "5":
case "6":
case "7":
case "8":
case "9": Estado = true; break;
default: Estado = false; break;
}
return Estado;
}
private bool AnalizarLetra(char p)
{
return char.IsLetter(p) ? true : false;
}
}
}