private bool verificar(string cadena, string exp) { int i, j, k = 0, l; for (i = 0; i < AFD_Lista.Count; i++) { if (AFD_Lista[i].titulo == exp) { break; } } if (i == AFD_Lista.Count) { salida += "EL NOMBRE DE LA EXPRESION NO EXISTE..."; return(false); } string pActual = "", palabra; bool exito = true; nlAFD = AFD_Lista[i]; nAFD = nlAFD.AFD[0]; char[] c = cadena.ToArray(); int jMax; fil = 0; for (i = 0; i < c.Length; i++) { fil++; jMax = nAFD.s_Transicion.Count; for (j = 0; j < jMax; j++) { pActual = ""; if (nAFD.s_Transicion[j].StartsWith("{")) { palabra = nAFD.s_Transicion[j].Substring(1).TrimEnd('}'); actual = getConj(palabra); if (actual[1] == "~") { try { int n1 = int.Parse(actual[2]); int n2 = int.Parse(actual[3]); for (l = n1; l <= n2; l++) { pActual = ""; palabra = l.ToString(); for (k = 0; k < palabra.Length; k++) { if (k + i >= c.Length) { break; } pActual += c[k + i]; } if (pActual == palabra) { setXMLToken(fil, col, nAFD.s_Transicion[j], pActual); nAFD = getAFD(nAFD.s_Letra[j]); fil += k - 1; i += k - 1; l = -1; break; } } if (l == -1) { break; } } catch (Exception ex) { if ((65 <= actual[2].ToCharArray()[0] && actual[2].ToCharArray()[0] <= 90) || (97 <= actual[2].ToCharArray()[0] && actual[2].ToCharArray()[0] <= 122)) { for (l = actual[2].ToCharArray()[0]; l <= actual[3].ToCharArray()[0]; l++) { pActual = c[i].ToString(); palabra = ((char)l).ToString(); if (pActual == palabra) { setXMLToken(fil, col, nAFD.s_Transicion[j], pActual); nAFD = getAFD(nAFD.s_Letra[j]); l = -1; break; } } if (l == -1) { break; } } else { for (l = actual[2].ToCharArray()[0]; l <= actual[3].ToCharArray()[0]; l++) { if (!(65 <= (char)l && (char)l <= 90) && !(97 <= (char)l && (char)l <= 122) && !(48 <= (char)l && (char)l <= 57)) { pActual = c[i].ToString(); palabra = ((char)l).ToString(); if (pActual == palabra) { setXMLToken(fil, col, nAFD.s_Transicion[j], pActual); nAFD = getAFD(nAFD.s_Letra[j]); l = -1; break; } } } if (l == -1) { break; } } } } else if (actual[1] == ",") { for (l = 2; l < actual.Count; l++) { pActual = ""; palabra = actual[l]; for (k = 0; k < palabra.Length; k++) { if (k + i >= c.Length) { break; } pActual += c[k + i]; } if (pActual == palabra) { setXMLToken(fil, col, nAFD.s_Transicion[j], pActual); nAFD = getAFD(nAFD.s_Letra[j]); fil += k - 1; i += k - 1; break; } } if (actual.Count != l) { break; } } else { palabra = actual[2]; for (k = 0; k < palabra.Length; k++) { if (k + i >= c.Length) { break; } pActual += c[k + i]; } if (pActual == palabra) { setXMLToken(fil, col, nAFD.s_Transicion[j], pActual); nAFD = getAFD(nAFD.s_Letra[j]); fil += k - 1; i += k - 1; break; } } } else if (nAFD.s_Transicion[j].StartsWith("\\")) { if (nAFD.s_Transicion[j].Length > 4) { palabra = nAFD.s_Transicion[j].Substring(3).TrimEnd('"').TrimEnd('\\'); for (k = 0; k < palabra.Length; k++) { if (k + i >= c.Length) { break; } pActual += c[k + i]; } if (pActual == palabra) { setXMLToken(fil, col, nAFD.s_Transicion[j], pActual); nAFD = getAFD(nAFD.s_Letra[j]); fil += k - 1; i += k - 1; break; } } else { if (nAFD.s_Transicion[j].EndsWith("t")) { if (c[i] == '\t') { setXMLToken(fil, col, "Tabulacion", "\\t"); nAFD = getAFD(nAFD.s_Letra[j]); break; } } else if (nAFD.s_Transicion[j].EndsWith("n")) { if (c[i] == '\n') { setXMLToken(fil, col, "Salto de linea", "\\n"); nAFD = getAFD(nAFD.s_Letra[j]); fil = 0; col++; break; } } else if (nAFD.s_Transicion[j].EndsWith("\"")) { if (c[i] == '"') { setXMLToken(fil, col, "Comilla doble", "\""); nAFD = getAFD(nAFD.s_Letra[j]); break; } } else if (nAFD.s_Transicion[j].EndsWith("'")) { if (c[i] == '\'') { setXMLToken(fil, col, "Comilla simple", "'"); nAFD = getAFD(nAFD.s_Letra[j]); break; } } } } else if (nAFD.s_Transicion[j].StartsWith("[")) { i++; while (i < c.Length) { if (c[i] == '\n') { break; } pActual += c[i++]; } setXMLToken(fil, col, "[:todo:]", pActual); nAFD = getAFD(nAFD.s_Letra[j]); col++; fil = 0; break; } } if (j == jMax) { setXMLError(fil, col, c[i].ToString()); if (c[i] == '\n') { fil = 0; col++; } exito = false; } if (i >= c.Length - 1 && exito == true) { exito = nAFD.finalizador; } } col++; return(exito); }
public void Generar() { if (verificarConjuntos()) { Inicializar(); for (int i = 0; i < vExpReg.Count; i++) { actual = vExpReg[i]; if (actual.Count > 1) { Automata n1 = new Automata(); Automata n2 = new Automata(); Automata n3 = new Automata(); Automata n4 = new Automata(); k = 2; index = 1; n1.setN(0); n1.setT1(actual[0]); n1.setS1(n2); n2.setT1("ε"); n2.setN(1); n2.setS1(Insertar(n3, n4)); n4.setN(k); OperacionCerradura.Add(n1); } } string dir = g.dir; for (int i = 0; i < OperacionCerradura.Count; i++) { ultimo = getUltimo(OperacionCerradura[i].getS1()); visitados = new List <int>(); codigo = "digraph AFN{\nrankdir=LR;\n"; codigo += "labelloc=t;\nlabel=\"" + OperacionCerradura[i].getT1() + "\";\n"; AFN(OperacionCerradura[i].getS1()); g.Grafica(codigo + "}", OperacionCerradura[i].getT1() + "_AFN"); pathAFN.Add(@dir + "\\G_" + OperacionCerradura[i].getT1() + "_AFN"); codigo = "digraph Cerradura{\n"; codigo += "labelloc=t;\nlabel=\"" + OperacionCerradura[i].getT1() + "\";\n"; codigo += "node [shape=plaintext];\n"; codigo += "tabla [label=<<table>\n"; Tabla_Cerradura_2(OperacionCerradura[i].getS1()); codigo += "</table>>];\n}"; g.Grafica(codigo, OperacionCerradura[i].getT1() + "_Cerradura"); pathCerradura.Add(@dir + "\\G_" + OperacionCerradura[i].getT1() + "_Cerradura"); codigo = "digraph Siguientes{\n"; codigo += "labelloc=t;\nlabel=\"" + OperacionCerradura[i].getT1() + "\";\n"; codigo += "node [shape=plaintext];\n"; codigo += "tabla [label=<<table>\n"; Tabla_Siguientes(); codigo += "</table>>];\n}"; g.Grafica(codigo, OperacionCerradura[i].getT1() + "_Siguientes"); pathSiguientes.Add(@dir + "\\G_" + OperacionCerradura[i].getT1() + "_Siguientes"); codigo = "digraph AFD{\nrankdir=LR;\n"; codigo += "labelloc=t;\nlabel=\"" + OperacionCerradura[i].getT1() + "\";\n"; nlAFD = new AFD_Lista(); nlAFD.titulo = OperacionCerradura[i].getT1(); AFD(); AFD_Lista.Add(nlAFD); g.Grafica(codigo + "}", OperacionCerradura[i].getT1() + "_AFD"); pathAFD.Add(@dir + "\\G_" + OperacionCerradura[i].getT1() + "_AFD"); } gramatica(); } }