Exemple #1
0
        public void comienzo(List <Token> t, Token nombre)
        {
            this.tokens = t;
            this.nombre = nombre;

            primero = new NodoG(id);
            nodos.Add(primero);
            id++;
            recursivo();

            //primero = llenar();
            //graficar();
        }
Exemple #2
0
        public void graficar()
        {
            StreamWriter escribir = new StreamWriter("Reportes\\" + nombre.lexema + "-AFN.txt");

            escribir.WriteLine("digraph D{\nrankdir=LR;");

            for (int j = 0; j < nodos.Count; j++)
            {
                NodoG n = nodos[j];

                escribir.WriteLine(n.nombre + "[label=\"" + n.nombre + "\"];");
                if (n.primero != null)
                {
                    if (n.p.Length == 1 && n.p[0] == 10)
                    {
                        escribir.WriteLine(n.nombre + "->" + n.primero.nombre + "[label=\"-Salto de linea-\"];");
                    }
                    else if (n.p.Length == 1 && n.p[0] == 9)
                    {
                        escribir.WriteLine(n.nombre + "->" + n.primero.nombre + "[label=\"-Tabulacion-\"];");
                    }
                    else
                    {
                        escribir.WriteLine(n.nombre + "->" + n.primero.nombre + "[label=\"" + n.p + "\"];");
                    }
                }
                if (n.segundo != null)
                {
                    escribir.WriteLine(n.nombre + "->" + n.segundo.nombre + "[label=\"" + n.s + "\"];");
                }
            }
            escribir.WriteLine("}");

            escribir.Close();

            string texto = "/K dot -Tpng Reportes\\" + nombre.lexema + "-AFN.txt -o Reportes\\" + nombre.lexema + "-AFN.jpg";

            //System.Diagnostics.Process.Start("CMD.exe", "/K dot -Tpng Ella.txt -o UML.png");

            Process.Start("CMD.exe", texto).Close();
            //System.Diagnostics.Process.Start("Reportes\\"+nombre.lexema+"Grafo.jpg");
        }
Exemple #3
0
        public NodoG orR()
        {
            if (tokens[i].idToken == 15 || tokens[i].idToken == 19)
            {
                NodoG temp = new NodoG(id);
                nodos[id - 1].p = tokens[i].lexema;
                agregart(tokens[i]);
                nodos[id - 1].primero = temp;
                nodos[id - 1].idp     = tokens[i].idToken;
                //temp.atrasp = nodos[id - 1];
                nodos.Add(temp);
                id++;

                i++;
                return(temp);
            }
            else
            {
                return(recursivo());
            }
        }
Exemple #4
0
        public NodoG recursivo()
        {
            if (tokens[i].idToken == 1)
            {
                i++;

                NodoG m = puntoR();

                NodoG u = puntoR();

                return(m);
            }
            else if (tokens[i].idToken == 4)
            {
                i++;

                int pri = id - 1;

                NodoG s   = new NodoG(id);
                int   seg = id;
                nodos[pri].p       = "ε";
                nodos[pri].primero = s;
                //s.atrasp = nodos[pri];
                nodos.Add(s);
                id++;

                NodoG t = asteriscoR();

                NodoG c = new NodoG(id);
                nodos[id - 1].p       = "ε";
                nodos[id - 1].primero = s;
                //s.atrasp = nodos[id - 1];
                nodos[id - 1].s       = "ε";
                nodos[id - 1].segundo = c;
                //c.atrass = nodos[id - 1];
                nodos[pri].s       = "ε";
                nodos[pri].segundo = c;
                //c.atrass = nodos[pri];
                nodos.Add(c);
                id++;

                return(s);
            }
            else if (tokens[i].idToken == 2)
            {
                i++;
                int p = id - 1;

                NodoG s1 = new NodoG(id);
                nodos[p].p       = "ε";
                nodos[p].primero = s1;
                //s1.atrasp = nodos[p];

                nodos.Add(s1);
                id++;

                NodoG t1 = orR();

                NodoG c = new NodoG(-1);
                nodos[id - 1].p       = "ε";
                nodos[id - 1].primero = c;
                //c.atrasp = nodos[id - 1];

                NodoG s2 = new NodoG(id);
                nodos[p].s       = "ε";
                nodos[p].segundo = s2;
                //s1.atrass = nodos[p];
                nodos.Add(s2);
                id++;

                NodoG t2 = orR();

                c.id                  = id;
                c.nombre              = id.ToString();
                nodos[id - 1].p       = "ε";
                nodos[id - 1].primero = c;
                //c.atrass = nodos[id - 1];
                nodos.Add(c);
                id++;

                return(nodos[p]);
            }
            else if (tokens[i].idToken == 3)
            {
                i++;
                int p = id - 1;

                NodoG s1 = new NodoG(id);
                nodos[p].p       = "ε";
                nodos[p].primero = s1;
                nodos.Add(s1);
                id++;

                NodoG t1 = orR();

                NodoG c = new NodoG(-1);
                nodos[id - 1].p       = "ε";
                nodos[id - 1].primero = c;

                //comentar s2 y t2 para omitir epxilons y ser directo
                NodoG s2 = new NodoG(id);
                nodos[p].s       = "ε";
                nodos[p].segundo = s2;
                nodos.Add(s2);
                id++;

                NodoG t2 = new NodoG(id);
                nodos[id - 1].p       = "ε";
                nodos[id - 1].primero = t2;
                nodos.Add(t2);
                id++;

                //cambiar tambien (id-1 por p) y (p por s) y (primero por segundo)
                c.nombre              = id.ToString();
                c.id                  = id;
                nodos[id - 1].p       = "ε";
                nodos[id - 1].primero = c;
                nodos.Add(c);
                id++;

                return(nodos[p]);
            }
            else if (tokens[i].idToken == 5)
            {
                i++;
                int iant = i;

                //int cominezo = i;
                int   pri = id;
                NodoG p   = puntoR();

                List <Token> cop = new List <Token>();
                for (int j = iant; j < i; j++)
                {
                    cop.Add(tokens[j]);
                }

                //graficar();

                int   seg   = id - 1;
                Grafo copia = copiar(cop);

                for (int i = 0; i < copia.nodos.Count; i++)
                {
                    int k = copia.nodos[i].id + id;
                    copia.nodos[i].id     = k;
                    copia.nodos[i].nombre = k.ToString();
                    nodos.Add(copia.nodos[i]);
                }
                id += copia.nodos.Count;

                //for (int i = seg+1; i < nodos.Count; i++)
                //{
                //    if (nodos[i].pid != -1)
                //    {
                //        nodos[i].primero = nodos[nodos[i].pid];
                //    }

                //    if (nodos[i].sid != -1)
                //    {
                //        nodos[i].segundo = nodos[nodos[i].sid];
                //    }
                //}

                nodos[seg].p       = "ε";
                nodos[seg].primero = copia.primero;
                //copia.atrasp = nodos[seg];

                //graficar();

                NodoG c = new NodoG(id);

                nodos[seg].s       = "ε";
                nodos[seg].segundo = c;
                //c.atrass = nodos[seg];

                nodos[id - 1].p       = "ε";
                nodos[id - 1].primero = copia.primero;
                //copia.atrasp = nodos[id - 1];

                nodos[id - 1].s       = "ε";
                nodos[id - 1].segundo = c;
                //c.atrass = nodos[id - 1];

                //nodos[pri].s = "ε";
                //nodos[pri].segundo = c;

                nodos.Add(c);
                id++;
                //graficar();

                return(p);
            }
            else
            {
                puntoR();
            }
            return(null);
        }