public void Graficar(ref string cadenaGraphviz) { foreach (Transicion transicion in Transiciones) { if (!transicion.Graficado) { Terminal terminal = transicion.Terminal; Nodo nodoDestino = transicion.NodoDestino; if (terminal.GetTipoTerminal() == Terminal.Tipo.EPSILON) { this.Cerradura.AddLast(nodoDestino); } cadenaGraphviz += "\tn" + Numero + "->n" + nodoDestino.Numero + "[label = \"" + terminal.GetRepresentacion() + "\"];\n"; transicion.Graficado = true; transicion.NodoDestino.Graficar(ref cadenaGraphviz); } } }
/* Estructura_P: * */ public Estructura Estructura_P(ref LinkedList <Terminal> terminals) { if (Comparador(Token.Tipo.S_LLAVE_IZQ)) { Parea(Token.Tipo.S_LLAVE_IZQ); Terminal id = new Terminal(Terminal.Tipo.ID, tokenActual.GetValor()); bool existe = this.ComprobarExistenciaEnLista(terminals, id); if (!existe) { try { //Revisa en la tabla de simbolos si existe un conjunto con el id solicitado y añade los elementos del conjunto a su lista de valores. Simbolo simbolo = tablaSimbolos[tokenActual.GetValor()]; Conjunto conjunto = (Conjunto)simbolo.GetValor(); id.ListaValores = new LinkedList <string>(conjunto.GetElementos()); terminals.AddLast(id); consola += "*Elementos para conjunto " + id.GetRepresentacion() + ":"; foreach (string elemento in id.ListaValores) { consola += "-" + elemento; } consola += "-*\n"; } catch (KeyNotFoundException) { //No se pudo obtener el conjunto de la tabla de simbolos, asi que no se guarda el Terminal en la lista de Terminales para la validacion. } } Parea(Token.Tipo.ID); Parea(Token.Tipo.S_LLAVE_DER); return(id); } else if (Comparador(Token.Tipo.CADENA)) { Terminal cadena = new Terminal(Terminal.Tipo.CADENA, tokenActual.GetValor()); bool existe = this.ComprobarExistenciaEnLista(terminals, cadena); if (!existe) { terminals.AddLast(cadena); } Parea(Token.Tipo.CADENA); return(cadena); } else if (Comparador(Token.Tipo.CARACTER_ESPECIAL)) { Terminal c_especial = new Terminal(Terminal.Tipo.CARACTER_ESPECIAL, tokenActual.GetValor()); bool existe = this.ComprobarExistenciaEnLista(terminals, c_especial); if (!existe) { terminals.AddLast(c_especial); } Parea(Token.Tipo.CARACTER_ESPECIAL); return(c_especial); } else if (Comparador(Token.Tipo.C_TODO)) { Terminal c_todo = new Terminal(Terminal.Tipo.C_TODO, tokenActual.GetValor()); bool existe = this.ComprobarExistenciaEnLista(terminals, c_todo); if (!existe) { terminals.AddLast(c_todo); } Parea(Token.Tipo.C_TODO); return(c_todo); } else if (Comparador(Token.Tipo.S_PUNTO) || Comparador(Token.Tipo.S_PLECA) || Comparador(Token.Tipo.S_INTERROGACION) || Comparador(Token.Tipo.S_ASTERISCO) || Comparador(Token.Tipo.S_SUMA)) { return(Estructura(ref terminals)); } else { Console.WriteLine("Error Sintactico\nEn ID_Token: " + controlToken + "\nSe esperaba [S_LLAVE_IZQ|CADENA|CARACTER_ESPECIAL|C_TODO|S_PUNTO|S_PLECA|S_INTERROGACION|S_ASTERISCO|S_SUMA] en lugar de [" + tokenActual.GetTipo() + ", " + tokenActual.GetValor() + "]"); consola += "*Error Sintactico*\nEn ID_Token: " + controlToken + "\nSe esperaba [S_LLAVE_IZQ|CADENA|CARACTER_ESPECIAL|C_TODO|S_PUNTO|S_PLECA|S_INTERROGACION|S_ASTERISCO|S_SUMA] en lugar de [" + tokenActual.GetTipo() + ", " + tokenActual.GetValor() + "]\n"; errorSintactico = true; existenciaErrorSintactico = true; return(null); } }