예제 #1
0
 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);
 }
예제 #2
0
 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);
             }
         }
     }
 }
예제 #3
0
 private int getUltimo(Automata actual)
 {
     if (actual.getS1() != null)
     {
         return(getUltimo(actual.getS1()));
     }
     return(actual.getN());
 }
예제 #4
0
 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());
     }
 }
예제 #5
0
 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";
     }
 }
예제 #6
0
        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();
            }
        }
예제 #7
0
        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";
                }
            }
        }
예제 #8
0
        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);
        }
예제 #9
0
 public void setS2(Automata s2)
 {
     this.s2 = s2;
 }
예제 #10
0
 public void setS1(Automata s1)
 {
     this.s1 = s1;
 }
예제 #11
0
 public Automata()
 {
     s1 = s2 = null;
     t1 = t2 = null;
     n  = -1;
 }