private Automata getNodo(Automata actual, int id) { if (actual.getN() == id) { return(actual); } visitados.Add(actual.getN()); if (actual.getS2() != null) { if (!visitados.Contains(actual.getS2().getN())) { if (actual.getS2().getN() <= id) { Automata a = getNodo(actual.getS2(), id); if (a != null) { return(a); } } } } if (actual.getS1() != null) { if (!visitados.Contains(actual.getS1().getN())) { if (actual.getS1().getN() <= id) { return(getNodo(actual.getS1(), id)); } } } return(null); }
private void TablaCerradura_Siguientes(Automata a, int idOrigen) { if (!siguientes.Contains(a.getN()) && a.getN() != idOrigen) { siguientes.Add(a.getN()); } if (a.getS1() != null) { if (!siguientes.Contains(a.getS1().getN())) { if (a.getT1() == "ε") { TablaCerradura_Siguientes(a.getS1(), idOrigen); } } } if (a.getS2() != null) { if (!siguientes.Contains(a.getS2().getN())) { if (a.getT2() == "ε") { TablaCerradura_Siguientes(a.getS2(), idOrigen); } } } }
private int getUltimo(Automata actual) { if (actual.getS1() != null) { return(getUltimo(actual.getS1())); } return(actual.getN()); }
private void TablaCerradura_Ir(Automata a) { visitados.Add(a.getN()); if (a.getS1() != null) { if (!visitados.Contains(a.getS1().getN())) { if (a.getT1() == "ε") { TablaCerradura_Ir(a.getS1()); } else { siguientes.Add(a.getN()); } } } if (a.getS2() != null) { if (!visitados.Contains(a.getS2().getN())) { if (a.getT2() == "ε") { TablaCerradura_Ir(a.getS2()); } else { siguientes.Add(a.getN()); } } } if (a.getS1() == null && a.getS2() == null) { siguientes.Add(a.getN()); } }
private void AFN(Automata a) { visitados.Add(a.getN()); if (a.getS1() != null) { codigo += a.getN() + " -> " + a.getS1().getN() + " [label=\"" + a.getT1() + "\"];\n"; if (!visitados.Contains(a.getS1().getN())) { AFN(a.getS1()); } } if (a.getS2() != null) { codigo += a.getN() + " -> " + a.getS2().getN() + " [label=\"" + a.getT2() + "\"];\n"; if (!visitados.Contains(a.getS2().getN())) { AFN(a.getS2()); } } if (a.getS1() == null && a.getS2() == null) { codigo += a.getN() + " [shape=doublecircle];\n"; } }
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(); } }
private void Tabla_Cerradura(Automata ini) { TablaCerradura = new List <Cerradura>(); Cerradura c = new Cerradura(); c.Epsilon.Add(1); char letra = 'B'; c.Letra = "A"; TablaCerradura.Add(c); Automata act; int ir, t2; for (int t = 0; t < TablaCerradura.Count; t++) { siguientes = new List <int>(); for (int ep = 0; ep < TablaCerradura[t].Epsilon.Count; ep++) { visitados = new List <int>(); TablaCerradura_Siguientes(getNodo(ini, TablaCerradura[t].Epsilon[ep]), TablaCerradura[t].Epsilon[ep]); } TablaCerradura[t].Siguientes = siguientes; for (int si = 0; si < TablaCerradura[t].Siguientes.Count; si++) { visitados = new List <int>(); act = getNodo(ini, TablaCerradura[t].Siguientes[si]); siguientes = new List <int>(); visitados = new List <int>(); TablaCerradura_Ir(act); for (int s = 0; s < siguientes.Count; s++) { visitados = new List <int>(); act = getNodo(ini, siguientes[s]); for (ir = 0; ir < TablaCerradura[t].Ir.Count; ir++) { if (TablaCerradura[t].Ir[ir].Letra_I.ToString() == "--") { break; } if (TablaCerradura[t].Ir[ir].Letra_I.ToString() == act.getT1()) { if (!TablaCerradura[t].Ir[ir].Siguientes.Contains(act.getS1().getN())) { TablaCerradura[t].Ir[ir].Siguientes.Add(act.getS1().getN()); } break; } } if (ir == TablaCerradura[t].Ir.Count) { Ir nir = new Ir(); if (act.getS1() == null && act.getS2() == null) { nir.Letra_I = "--"; } else { nir.Letra_I = act.getT1(); nir.Siguientes.Add(act.getS1().getN()); } TablaCerradura[t].Ir.Add(nir); } } } for (ir = 0; ir < TablaCerradura[t].Ir.Count; ir++) { for (t2 = 0; t2 < TablaCerradura.Count; t2++) { if (Iguales(TablaCerradura[t2].Epsilon, TablaCerradura[t].Ir[ir].Siguientes)) { TablaCerradura[t].Ir[ir].Letra_C = TablaCerradura[t2].Letra; break; } } if (t2 == TablaCerradura.Count) { c = new Cerradura(); c.Letra = ((char)letra).ToString(); TablaCerradura[t].Ir[ir].Letra_C = c.Letra; c.Epsilon = TablaCerradura[t].Ir[ir].Siguientes; TablaCerradura.Add(c); letra++; } } } for (int t = 0; t < TablaCerradura.Count; t++) { codigo += "<tr>"; codigo += "<td>" + TablaCerradura[t].Letra + " - Cerradura ("; if (TablaCerradura[t].Epsilon.Count == 0) { codigo += "--)</td>"; } for (int e = 0; e < TablaCerradura[t].Epsilon.Count; e++) { codigo += TablaCerradura[t].Epsilon[e]; if (e == TablaCerradura[t].Epsilon.Count - 1) { codigo += ")</td>"; } else { codigo += ", "; } } if (TablaCerradura[t].Siguientes.Count > 0) { codigo += "<td>"; } for (int s = 0; s < TablaCerradura[t].Siguientes.Count; s++) { codigo += TablaCerradura[t].Siguientes[s]; if (s == TablaCerradura[t].Siguientes.Count - 1) { codigo += "</td>"; } else { codigo += ", "; } } codigo += "</tr>\n"; for (ir = 0; ir < TablaCerradura[t].Ir.Count; ir++) { codigo += "<tr>"; codigo += "<td>Ir (" + TablaCerradura[t].Ir[ir].Letra_I + ")" + " - " + TablaCerradura[t].Ir[ir].Letra_C + "</td>"; if (TablaCerradura[t].Ir[ir].Siguientes.Count > 0) { codigo += "<td>"; } for (int irS = 0; irS < TablaCerradura[t].Ir[ir].Siguientes.Count; irS++) { codigo += TablaCerradura[t].Ir[ir].Siguientes[irS]; if (irS == TablaCerradura[t].Ir[ir].Siguientes.Count - 1) { codigo += "</td>"; } else { codigo += ", "; } } codigo += "</tr>\n"; } } }
private Automata Insertar(Automata ini, Automata fin) { if (actual[index] == ".") { Automata A = new Automata(); Automata B = new Automata(); Automata epA = new Automata(); ini.setN(k); ini.setT1("ε"); index++; k++; ini.setS1(Insertar(A, epA)); epA.setT1("ε"); epA.setN(k); k++; epA.setS1(Insertar(B, fin)); } else if (actual[index] == "|") { Automata A = new Automata(); Automata B = new Automata(); Automata epA = new Automata(); Automata epB = new Automata(); ini.setN(k); ini.setT1("ε"); ini.setT2("ε"); index++; k++; ini.setS1(Insertar(A, epA)); epA.setT1("ε"); epA.setN(k); k++; ini.setS2(Insertar(B, epB)); epB.setT1("ε"); epB.setN(k); k++; epA.setS1(fin); epB.setS1(fin); } else if (actual[index] == "*") { Automata A = new Automata(); Automata epA = new Automata(); ini.setN(k); ini.setT1("ε"); ini.setT2("ε"); index++; k++; ini.setS1(Insertar(A, epA)); ini.setS2(epA); epA.setT1("ε"); epA.setT2("ε"); epA.setN(k); k++; epA.setS1(fin); epA.setS2(A); } else if (actual[index] == "+") { Automata A = new Automata(); Automata epA = new Automata(); ini.setN(k); ini.setT1("ε"); index++; k++; ini.setS1(Insertar(A, epA)); epA.setT1("ε"); epA.setT2("ε"); epA.setN(k); k++; epA.setS1(fin); epA.setS2(A); } else if (actual[index] == "?") { Automata A = new Automata(); Automata epA = new Automata(); ini.setN(k); ini.setT1("ε"); ini.setT2("ε"); index++; k++; ini.setS1(Insertar(A, epA)); ini.setS2(epA); epA.setT1("ε"); epA.setN(k); k++; epA.setS1(fin); } else if (actual[index].StartsWith("{")) { ini.setN(k); ini.setT1(actual[index] + "}"); ini.setS1(fin); index++; k++; } else if (actual[index].StartsWith("[")) { ini.setN(k); ini.setT1(actual[index]); ini.setS1(fin); index++; k++; } else if (actual[index].StartsWith("\\")) { ini.setN(k); ini.setT1("\\" + actual[index]); ini.setS1(fin); index++; k++; } else if (actual[index].Length > 2) { ini.setN(k); ini.setT1("\\" + actual[index] + "\\\""); ini.setS1(fin); index++; k++; } else { ini.setN(k); ini.setT1(actual[index]); ini.setS1(fin); index++; k++; } return(ini); }
public void setS2(Automata s2) { this.s2 = s2; }
public void setS1(Automata s1) { this.s1 = s1; }
public Automata() { s1 = s2 = null; t1 = t2 = null; n = -1; }