private void AFD() { string l1, l2; for (int t = 0; t < TablaCerradura.Count; t++) { nAFD = new AFD(); visitados = new List <int>(); nAFD.letra = TablaCerradura[t].Letra; if (TablaCerradura[t].Siguientes.Contains(ultimo) || TablaCerradura[t].Epsilon.Contains(ultimo)) { codigo += TablaCerradura[t].Letra + " [shape=doublecircle];\n"; nAFD.finalizador = true; } for (int v = 0; v < actual.Count; v++) { visitados.Add(-1); } for (int ir = 0; ir < TablaCerradura[t].Ir.Count; ir++) { visitados[actual.IndexOf(TablaCerradura[t].Ir[ir].Letra_I)] = ir; } foreach (int v in visitados) { if (v != -1) { l1 = TablaCerradura[t].Letra; l2 = TablaCerradura[t].Ir[v].Letra_C; codigo += l1 + " -> " + l2 + " [label=\"" + TablaCerradura[t].Ir[v].Letra_I + "\"];\n"; nAFD.s_Letra.Add(l2); nAFD.s_Transicion.Add(TablaCerradura[t].Ir[v].Letra_I); } } nlAFD.AFD.Add(nAFD); } }
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); }