public void Validacion_ER(string id) { Parea(Token.Tipo.S_DOS_PUNTOS); string lexema = tokenActual.GetValor(); lexema = lexema.Remove(0, 1); lexema = lexema.Remove(lexema.Length - 1, 1); int filaInicio = tokenActual.GetFila(); int columnaInicio = tokenActual.GetColumna() + 1; Parea(Token.Tipo.CADENA); Parea(Token.Tipo.S_PUNTO_Y_COMA); //Aqui continua la validacion del lexema. consola += "**Evaluando Expresion Regular: " + id + "**\n"; try { Simbolo simbolo = tablaSimbolos[id]; //Posible Exception. if (!simbolo.GetTipo().Equals("Estado")) { throw new KeyNotFoundException(); //Como no es compatible el tipo entonces no se puede trabajar con él. Se manda Exception. } Cerradura estado = (Cerradura)simbolo.GetValor(); int contador = 0; if (estado.Validar(lexema, ref contador, ref filaInicio, ref columnaInicio, ref ListaTokensAnalizados)) { consola += "El lexema: \"" + lexema + "\", es válido para la Expresion Regular: " + id + "\n"; } else { consola += "El lexema: \"" + lexema + "\", no es válido para la Expresion Regular: " + id + "\n"; } } catch (KeyNotFoundException) { consola += "No se pudo validar el lexema: " + lexema + ", no se encontró su expresión regular\n**Fin evaluacion**\n"; } }
public TransicionC(Terminal terminal, Cerradura next) { Terminal = terminal; EstadoSiguiente = next; Graficado = false; }
/* Declaracion_ER: Guarda en la tabla de simbolos un objeto de tipo Estructura. */ public void Declaracion_ER(string id) { Parea(Token.Tipo.S_FLECHA); try { //Se crea una ListaTerminales que se va llenando conforme se encuentra un terminal en Estructura_P. //Se crea una ListaTerminales que contiene las transiciones con el valor real para que se pueda alcanzar cierto estado. LinkedList <Terminal> ListaTerminales = new LinkedList <Terminal>(); //Se crea un ListaNodos que se va llenando conforme se realiza el AFN. LinkedList <Nodo> ListaNodos = new LinkedList <Nodo>(); //Se crea un nuevo objeto estructura. Estructura estructura = Estructura(ref ListaTerminales); Parea(Token.Tipo.S_PUNTO_Y_COMA); /***************************************************** AFN *****************************************************/ int n = 0; //Creacion de nodos y sus transiciones. estructura.Numerar(ref ListaNodos, ref n); //Creacion de grafica. String CadenaGraphviz = "digraph AFN{\n" + "\trankdir=LR;\n" + "\tGraph[label = \"AFN: " + id + "\"];\n" + "\tnode [shape = circle, fontsize = 10; style = filled fillcolor=gray, color = black, fontcolor = black];\n" + "\tI [fontsize = 1; style = filled fillcolor=white, fontcolor = white, color = white];\n" + "\tI->n" + estructura.GetFirst().Numero + "[label = Io];\n"; //Graficar nodos. Nodo First = estructura.GetFirst(); First.Graficar(ref CadenaGraphviz); CadenaGraphviz += "\tn" + estructura.GetLast().Numero + "[shape = doublecircle];\n" + "}"; Graficador graficadorAFN = new Graficador("AFN_" + id); //Creacion de archivos. RutasImagenes.AddLast(graficadorAFN.graficar(CadenaGraphviz)); /***************************************************** AFD *****************************************************/ int contadorCerraduras = 0; //A LinkedList <Nodo> c0 = new LinkedList <Nodo>(First.ObtenerCerraduras().OrderBy(nodo => nodo.Numero)); Cerradura Cerradura0 = new Cerradura(c0); Cerradura0.Estado = "n" + contadorCerraduras++; LinkedList <Cerradura> Cerraduras = new LinkedList <Cerradura>(); Cerraduras.AddLast(Cerradura0); bool nuevaEntrada; //Creacion de Estados y sus transiciones. do { nuevaEntrada = false; //Dictionary<string, Cerradura> auxiliar = new Dictionary<string, Cerradura>(Cerraduras); LinkedList <Cerradura> auxiliar = new LinkedList <Cerradura>(Cerraduras); foreach (Cerradura cerradura in Cerraduras) { if (!cerradura.Evaluado) { //a (terminal con el que se trabaja Mover). foreach (Terminal terminal in ListaTerminales) { //M(A,a) (mover). LinkedList <Nodo> Mover = new LinkedList <Nodo>(); foreach (Nodo elementoCerradura in cerradura.Elementos) { elementoCerradura.ObtenerMover(ref Mover, terminal.GetRepresentacion()); } if (Mover.Count != 0) { //C(M(A,a)) (cerradura del mover) LinkedList <Nodo> cm = new LinkedList <Nodo>(); foreach (Nodo elementoMover in Mover) { cm = new LinkedList <Nodo>(cm.Union(elementoMover.ObtenerCerraduras())); } cm = new LinkedList <Nodo>(cm.OrderBy(nodo => nodo.Numero)); bool existe = false; //Recorre el diccionario revisando si ya existe un estado igual para agregar la nueva transición. int tamano = cm.Count; foreach (Cerradura estado in auxiliar) { bool iguales = false; if (estado.Elementos.Count == cm.Count) { iguales = true; for (int i = 0; i < tamano; i++) { if (estado.Elementos.ElementAt(i).Numero != cm.ElementAt(i).Numero) { existe = false; iguales = false; break; } } if (iguales) { TransicionC transicion = new TransicionC(terminal, estado); cerradura.ListaTransiciones.AddLast(transicion); existe = true; break; } } } //Si no existe ese estado, se crea y se agrega a la lista de cerraduras auxiliar. if (!existe) { Cerradura CerraduraMover = new Cerradura(cm); CerraduraMover.Estado = "n" + contadorCerraduras++; auxiliar.AddLast(CerraduraMover); TransicionC transicion = new TransicionC(terminal, CerraduraMover); cerradura.ListaTransiciones.AddLast(transicion); nuevaEntrada = true; } } } cerradura.Evaluado = true; } } Cerraduras = auxiliar; } while (nuevaEntrada); CadenaGraphviz = "digraph AFD{\n" + "\trankdir=LR;\n" + "\tGraph[label = \"AFD: " + id + "\" fontcolor = dodgerblue4];\n" + "\tnode [shape = circle, fontsize = 10; colorscheme = pubu9, style = filled, fillcolor = 5, color = 6, fontcolor = 1];\n" + "\tI [fontsize = 1; style = filled fillcolor=white, fontcolor = white, color = white];\n" + "\tI->n0[label = Io, colorscheme = pubu9, color = 9, fontcolor = 9];\n"; //Tablas String ruta = Path.GetDirectoryName(Application.ExecutablePath); string carpeta = ruta + "\\Tablas"; if (!Directory.Exists(carpeta)) { Directory.CreateDirectory(carpeta); } ruta = carpeta; ruta += "\\Transiciones_" + id + ".pdf"; Document document = new Document(PageSize.LETTER, 10, 10, 10, 10); PdfWriter pw = PdfWriter.GetInstance(document, new FileStream(ruta, FileMode.Create)); document.Open(); Paragraph encabezado = new Paragraph("Tabla de transiciones de \"" + id + "\""); encabezado.Alignment = Element.ALIGN_CENTER; document.Add(encabezado); PdfPTable tabla = new PdfPTable(ListaTerminales.Count + 1); tabla.AddCell(""); foreach (Terminal terminal in ListaTerminales) { tabla.AddCell(terminal.GetRepresentacion()); } foreach (Cerradura estado in Cerraduras) { string nombreCelda = estado.Estado; if (estado.Elementos.Contains(estructura.GetLast())) { estado.Aceptacion = true; nombreCelda += "*"; } estado.Graficar(ref CadenaGraphviz); tabla.AddCell(nombreCelda); estado.Tablear(ref tabla, ListaTerminales); } CadenaGraphviz += "}"; document.Add(tabla); document.Close(); MessageBox.Show("Se ha creado un archivo mostrando la tabla de transiciones de " + id + " en:\n" + ruta + "\n"); Graficador graficadorAFD = new Graficador("AFD_" + id); //Creacion de archivos. RutasImagenes.AddLast(graficadorAFD.graficar(CadenaGraphviz)); //Se vincula el objeto Cerradura a un objeto simbolo que se agrega a la tablaSimbolos. Simbolo simbolo = new Simbolo(id, "Estado", Cerraduras.ElementAt(0)); //Es agregado el nuevo simbolo con su 'key' que es utilizado para evitar variables con el mismo nombre. try { tablaSimbolos.Add(id, simbolo); } catch (ArgumentException) { Console.WriteLine("Ya existe un objeto con ID = " + id); } } catch (NullReferenceException) { //Error sintactico. Manejado en Estructura. } }