y en el siguiente enlace hize unos videitos sobre los patrones de las variables y/o palabras reservadas: http://www.youtube.com/watch?v=X50-vn-5h0E
bueno si les agrada buen provecho
Código
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 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; } } }