Beispiel #1
0
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
//ORIGINAL LINE: public GrafoL<N> KruskalGrafoLista(IGrafo<N> grafo) throws Excepciones.ExcepcionAristaImposible
		public virtual GrafoL<N> KruskalGrafoLista(IGrafo<N> grafo)
		{

			GrafoL<N> graph = null;

			if (grafo.esDirigido())
			{
				graph = new GrafoL<N>(true, true);
			}
			else
			{
				graph = new GrafoL<N>(false, true);
			}

			List<Arista<N>> aristas = grafo.generarAristas();

			aristas.sort(null);

			List<N> nodos = grafo.darValorNodos();

			for (int i = 0; i < nodos.Count; i++)
			{
				graph.agregarNodo(nodos[i]);
			}

			List<Conjunto<N>> conjuntos = new List<Conjunto<N>>();

			for (int i = 0; i < nodos.Count; i++)
			{
				conjuntos.Add(new Conjunto<N>(nodos[i]));
			}

			for (int i = 0; i < aristas.Count && conjuntos.Count > 1; i++)
			{
				int n = conjuntos.Count;
				Arista<N> arista = aristas[i];
				N nodo1 = arista.NodoInicial.Valor;
				N nodo2 = arista.NodoFinal.Valor;
				for (int j = 0; j < conjuntos.Count; j++)
				{
					if (conjuntos[j].existeNodoEnElConjunto(nodo1) && !conjuntos[j].existeNodoEnElConjunto(nodo2))
					{
						Conjunto<N> c1 = conjuntos[j];
						Conjunto<N> c2 = null;
						int l = -1;
						for (int h = 0; c2 == null && h < conjuntos.Count; h++)
						{
							if (conjuntos[h].existeNodoEnElConjunto(nodo2))
							{
								c2 = conjuntos[h];
								l = h;
							}
						}
						if (c2 != null)
						{
							c1.unirConjuntos(c2);
							conjuntos.RemoveAt(l);
						}
					}
				}
				if (n > conjuntos.Count)
				{
					graph.agregarArista(nodo1, nodo2, arista.Peso);
				}
			}

			return graph;

		}
Beispiel #2
0
        public void ExprecionesYConjuntos()
        {
            //epsilon ε

            Token     temp   = null;
            Exprecion nuevo  = null;
            Conjunto  nuevoC = null;
            Entrada   nuevoE = null;
            int       estado = 0;
            int       i      = 0;

            while (i < listaT.Count)
            {
                temp = listaT[i];
                int no = temp.idToken;
                switch (estado)
                {
                case 0:
                    if (no == 14)
                    {
                        i++;
                        estado = 5;
                    }
                    else if (no == 15)
                    {
                        i++;
                        estado = 2;
                        nuevo  = new Exprecion(temp);
                        nuevoE = new Entrada(temp);
                    }
                    else
                    {
                        i++;
                    }
                    break;

                case 1:
                    if (no == 9)
                    {
                        i++;
                        estado = 0;
                    }
                    else
                    {
                        i++;
                    }
                    break;

                case 2:
                    if (no == 20)
                    {
                        i++;
                        estado = 3;
                    }
                    else if (no == 8)
                    {
                        i++;
                        estado = 17;
                    }
                    else
                    {
                        estado = 1;
                    }
                    break;

                case 3:
                    if (no == 1 || no == 2 || no == 3 || no == 4 || no == 5 || no == 19)
                    {
                        nuevo.tokens.Add(temp);
                        i++;
                        estado = 3;
                    }
                    else if (no == 6)
                    {
                        i++;
                        estado = 4;
                    }
                    else if (no == 9)
                    {
                        expreciones.Add(nuevo);
                        nuevo.grafo.comienzo(nuevo.tokens, nuevo.nombre);
                        nuevo.grafo.graficar();
                        nuevo.comienzo();
                        seleccion.Items.Add(nuevo.nombre.lexema + "-AFN");
                        seleccion.Items.Add(nuevo.nombre.lexema + "-Tabla");
                        seleccion.Items.Add(nuevo.nombre.lexema + "-AFD");
                        i++;
                        estado = 0;
                    }
                    else
                    {
                        estado = 1;
                    }
                    break;

                case 4:
                    if (no == 15)
                    {
                        nuevo.tokens.Add(temp);
                        i++;
                        estado = 4;
                    }
                    else if (no == 7)
                    {
                        i++;
                        estado = 3;
                    }
                    else
                    {
                        estado = 1;
                    }
                    break;

                case 5:
                    if (no == 8)
                    {
                        i++;
                        estado = 6;
                    }
                    else
                    {
                        estado = 1;
                        i++;
                    }
                    break;

                case 6:
                    if (no == 15)
                    {
                        nuevoC = new Conjunto(temp);
                        i++;
                        estado = 7;
                    }
                    else
                    {
                        estado = 1;
                        i++;
                    }
                    break;

                case 7:
                    if (no == 20)
                    {
                        i++;
                        estado = 8;
                    }
                    else
                    {
                        estado = 1;
                        i++;
                    }
                    break;

                case 8:
                    if (no == 15)
                    {
                        i++;
                        nuevoC.caracteres.Add(temp.lexema);
                        estado = 9;
                    }
                    else if (no == 19)
                    {
                        i++;
                        nuevoC.caracteres.Add(temp.lexema);
                        estado = 11;
                    }
                    else if (no == 21)
                    {
                        i++;
                        for (int j = 0; j < temp.lexema.Length; j++)
                        {
                            nuevoC.caracteres.Add(temp.lexema[j].ToString());
                        }
                        estado = 11;
                    }
                    else if (no == 18)
                    {
                        i++;
                        nuevoC.caracteres.Add(temp.lexema);
                        estado = 13;
                    }
                    else if (no == 16 || no == 17)
                    {
                        i++;
                        nuevoC.caracteres.Add(temp.lexema);
                        estado = 15;
                    }
                    else
                    {
                        estado = 1;
                        i++;
                    }
                    break;

                case 9:
                    if (no == 9)
                    {
                        i++;
                        conjuntos.Add(nuevoC);
                        estado = 0;
                    }
                    else if (no == 10)
                    {
                        i++;
                        estado = 10;
                    }
                    else if (no == 11)
                    {
                        estado = 11;
                    }
                    else
                    {
                        estado = 1;
                        i++;
                    }
                    break;

                case 10:
                    if (no == 15)
                    {
                        i++;

                        if (nuevoC.caracteres[0].Length == 1 && temp.lexema.Length == 1 && nuevoC.caracteres[0][0] < temp.lexema[0])
                        {
                            char inter = nuevoC.caracteres[0][0];

                            while (inter < temp.lexema[0])
                            {
                                inter++;
                                nuevoC.caracteres.Add(inter.ToString());
                            }

                            estado = 100;
                        }
                        else
                        {
                            estado = 1;
                        }
                    }
                    else
                    {
                        estado = 1;
                        i++;
                    }
                    break;

                case 11:
                    if (no == 11)
                    {
                        i++;
                        estado = 12;
                    }
                    else if (no == 9)
                    {
                        i++;
                        conjuntos.Add(nuevoC);
                        estado = 0;
                    }
                    else
                    {
                        estado = 1;
                        i++;
                    }
                    break;

                case 12:
                    if (no == 15 || no == 16 || no == 17 || no == 18 || no == 19)
                    {
                        i++;
                        nuevoC.caracteres.Add(temp.lexema);
                        estado = 11;
                    }
                    else if (no == 21)
                    {
                        i++;
                        for (int j = 0; j < temp.lexema.Length; j++)
                        {
                            nuevoC.caracteres.Add(temp.lexema[j].ToString());
                        }
                        estado = 11;
                    }
                    else
                    {
                        estado = 1;
                        i++;
                    }
                    break;

                case 13:
                    if (no == 9)
                    {
                        i++;
                        conjuntos.Add(nuevoC);
                        estado = 0;
                    }
                    else if (no == 10)
                    {
                        i++;
                        estado = 14;
                    }
                    else if (no == 11)
                    {
                        estado = 11;
                    }
                    else
                    {
                        estado = 1;
                        i++;
                    }
                    break;

                case 14:
                    if (no == 18)
                    {
                        i++;

                        if (nuevoC.caracteres[0][0] < temp.lexema[0])
                        {
                            char inter = nuevoC.caracteres[0][0];

                            while (inter < temp.lexema[0])
                            {
                                inter++;
                                if (!char.IsLetterOrDigit(inter))
                                {
                                    nuevoC.caracteres.Add(inter.ToString());
                                }
                            }

                            estado = 100;
                        }
                        else
                        {
                            i++;
                            estado = 1;
                        }
                    }
                    else
                    {
                        estado = 1;
                        i++;
                    }
                    break;

                case 15:
                    if (no == 9)
                    {
                        i++;
                        conjuntos.Add(nuevoC);
                        estado = 0;
                    }
                    else if (no == 10)
                    {
                        i++;
                        estado = 16;
                    }
                    else if (no == 11)
                    {
                        estado = 11;
                    }
                    else
                    {
                        estado = 1;
                        i++;
                    }
                    break;

                case 16:
                    if (no == 16 || no == 17)
                    {
                        i++;

                        int uno, dos;

                        if (Int32.TryParse(nuevoC.caracteres[0], out uno) && Int32.TryParse(temp.lexema, out dos))
                        {
                            if (uno < dos)
                            {
                                while (uno < dos)
                                {
                                    uno++;
                                    nuevoC.caracteres.Add(uno.ToString());
                                }

                                estado = 100;
                            }
                            else
                            {
                                estado = 1;
                            }
                        }
                        else
                        {
                            estado = 1;
                        }
                    }
                    else
                    {
                        estado = 1;
                        i++;
                    }
                    break;

                case 17:
                    if (no == 19)
                    {
                        i++;
                        nuevoE.texto = temp.lexema;
                        estado       = 18;
                    }
                    else
                    {
                        estado = 1;
                    }
                    break;

                case 18:
                    if (no == 9)
                    {
                        i++;
                        entradas.Add(nuevoE);
                        estado = 0;
                    }
                    else
                    {
                        estado = 1;
                    }
                    break;

                case 100:
                    if (no == 9)
                    {
                        i++;
                        estado = 0;
                        conjuntos.Add(nuevoC);
                    }
                    else
                    {
                        estado = 1;
                        i++;
                    }
                    break;

                default:
                    break;
                }
            }

            for (int j = 0; j < expreciones.Count; j++)
            {
                expreciones[j].conjuntos = conjuntos;
            }

            for (int j = 0; j < entradas.Count; j++)
            {
                //entradas[j].id = j;
                for (int k = 0; k < expreciones.Count; k++)
                {
                    if (entradas[j].nombre.lexema == expreciones[k].nombre.lexema)
                    {
                        entradas[j].exprecion = expreciones[k];
                        break;
                    }
                }
            }

            for (int j = 0; j < entradas.Count; j++)
            {
                if (entradas[j].exprecion == null)
                {
                    salida.AppendText("La exprecion regular: " + entradas[j].nombre.lexema + " no existe para la entrada: \"" + entradas[j].texto + "\"\n");
                }
                else if (entradas[j].Comienzo(j))
                {
                    documentos.Items.Add("ListaTokens-" + entradas[j].exprecion.nombre.lexema + "-" + j);
                    salida.AppendText("La entrada: \"" + entradas[j].texto + "\" SI es valida con la exprecion regular: " + entradas[j].exprecion.nombre.lexema + "\n");
                }
                else
                {
                    documentos.Items.Add("ListaTokens-" + entradas[j].exprecion.nombre.lexema + "-" + j);
                    documentos.Items.Add("ListaErrores-" + entradas[j].exprecion.nombre.lexema + "-" + j);
                    salida.AppendText("La entrada: \"" + entradas[j].texto + "\" NO  es valida con la exprecion regular: " + entradas[j].exprecion.nombre.lexema + "\n");
                }
            }
        }
        private void guardarConjuntos()
        {
            String nombre = "";
            //Bandeara para saber si esta dentro de un conjunto o no
            Boolean dentroC = false;
            //Bandera para saber si es conjunto o macro
            // macro = 0   CONJ: ID -> char ~ char ;
            //conjunto = 1  CONJ: ID -> char,char,char ;
            //conjunto =
            int      tipo  = 3;
            Boolean  ayuda = false;
            Conjunto temp  = null;
            Token    salida;
            Token    t = null;
            Token    temporal;

            for (int i = 0; i < simbolos.Count; i++)
            {
                salida = (Token)simbolos[i];
                if (salida.getToken() == 20)
                {
                    dentroC = true;
                    //Determino el tipo
                    temporal = (Token)simbolos[i + 5];
                    t        = (Token)simbolos[i + 4];
                    if (temporal.getToken() == 13)
                    {
                        tipo  = 0;
                        ayuda = false;
                    }
                    else if (temporal.getToken() == 12)
                    {
                        tipo = 1;
                    }
                    else if (t.getToken() == 27)
                    {
                        tipo = 2;
                    }
                }
                else if (salida.getToken() == 5)
                {
                    nombre = salida.getLexema();
                }
                if (dentroC)
                {
                    //esta dentro tiene que evaluar entre los dos casos
                    if (tipo == 0)
                    {
                        if (salida.getToken() == 13)
                        {
                            //Si es virgulilla ignora
                            ayuda = true;
                        }
                        else if (salida.getToken() == 10)
                        { //Si es punto y coma termino de guardar conjuntos
                            dentroC = false;
                        }
                        else
                        {//Debe guardar
                            if (ayuda)
                            {
                                Conjunto n = new Conjunto(nombre);
                                temporal = (Token)simbolos[i - 2];
                                n.llenar(temporal.getLexema()[0], salida.getLexema()[0]);
                                conjuntos.Add(n);
                                ayuda = false;
                            }
                        }
                    }
                    else if (tipo == 1)
                    {
                        if (salida.getToken() == 12)
                        {
                            //Si es coma ignora
                        }
                        else if (salida.getToken() == 10)
                        { //Si es punto y coma termino de guardar conjuntos
                            dentroC = false;
                            conjuntos.Add(temp);
                        }
                        else if (salida.getToken() == 6)
                        {
                            ayuda = true;
                            temp  = new Conjunto(nombre);
                        }
                        else
                        {//Debe guardar
                            if (ayuda)
                            {
                                if (salida.getToken() == 23)//salto de linea
                                {
                                    temp.add(10);
                                }
                                else if (salida.getToken() == 24)//tabulacion
                                {
                                    temp.add(9);
                                }
                                else if (salida.getToken() == 25)//comilla simples
                                {
                                    temp.add(39);
                                }
                                else if (salida.getToken() == 26)//comillas dobles
                                {
                                    temp.add(34);
                                }
                                else
                                {
                                    temp.agregar(salida.getLexema()[0]);
                                }
                            }
                        }
                    }
                    else if (tipo == 2)
                    {
                        char[] arr = t.getLexema().ToArray();
                        //Guarde y sali
                        t      = (Token)simbolos[i + 2];
                        nombre = t.getLexema();
                        Conjunto n = new Conjunto(nombre);

                        foreach (char item in arr)
                        {
                            n.agregar(item);
                        }
                        conjuntos.Add(n);
                        dentroC = false;
                    }
                }
            }
        }