Esempio n. 1
0
        private void guardarMovimientoPila()
        {
            pilaSintactica miPila;
            string         pila     = "[ ";
            int            contador = 1;

            foreach (var item in pila_sintactica.Reverse())
            {
                if (pila_sintactica.Count == contador)
                {
                    pila += item + "";
                }
                else
                {
                    pila += item + " , ";
                }
                contador++;
            }
            pila  += " ]";
            miPila = new pilaSintactica()
            {
                Pila = pila
            };
            movimientoPila.Add(miPila);
        }
Esempio n. 2
0
        public void analizadorLALR()
        {
            //Creamos el analizador y en este metodo llenaremos las listas que
            //se veran despues en la vista winlexico > Analizador LALR
            miPilaSintactica = new pilaSintactica()
            {
                Elemento = "0"
            };
            miListaPilaSintactica.Add(miPilaSintactica);

            miPilaM = new movimientosPila()
            {
                Num  = 1,
                Pila = "[ 0 ]"
            };
            listaPila.Add(miPilaM);

            miMovimientosEntrada = new movimientosEntrada()
            {
                Num     = 1,
                Entrada = obtenerEntradaFormatear(pilaTokensReconocidos)
            };
            listaEntrada.Add(miMovimientosEntrada);



            // Console.WriteLine(listaPila[0].Pila + " " + pilaTokensReconocidos[0].SinonimoToken);
            bool flag             = true;
            int  filaMatrizEntera = 1;
            int  num          = 2;
            int  interseccion = 0;


            while (flag)
            {
                //if (!flagReconocioRegla)
                //{
                interseccion = Convert.ToInt32(matrizLALR.Rows[filaMatrizEntera][buscarToken(pilaTokensReconocidos[0].SinonimoToken)]);
                // }


                Console.WriteLine("fila: " + filaMatrizEntera + " Columna: " + buscarToken(pilaTokensReconocidos[0].SinonimoToken));
                Console.WriteLine(pilaTokensReconocidos[0].SinonimoToken);
                Console.WriteLine("interseccion: " + interseccion);
                if (interseccion == 999)
                {
                    miAccion = new movimeintoAccion()
                    {
                        Num    = num - 1,
                        Accion = "Aceptar"
                    };
                    listaAccion.Add(miAccion);
                    flag = false;
                }
                //Aqui controlaremos errores
                else if (interseccion >= 200)
                {
                    Console.WriteLine("error");
                    flag = false;
                }
                else if (interseccion < 0)
                {
                    Console.WriteLine("Reconocio regla");



                    foreach (var item in reglasGramaticales)
                    {
                        if (item.NumeroRegla == (interseccion * -1))
                        {
                            //Agregamos accion Reconocer reglas
                            miAccion = new movimeintoAccion()
                            {
                                Num    = num - 1,
                                Accion = "R(" + (interseccion * -1) + ") " + item.ParteIzquierda + " --> " + item.ParteDerecha
                            };
                            listaAccion.Add(miAccion);
                            break;
                        }
                    }

                    foreach (var item in reglasGramaticales)
                    {
                        if (item.NumeroRegla == interseccion * -1)
                        {
                            //Removemos de la pila el contenido de la regla
                            miListaPilaSintactica.RemoveRange(miListaPilaSintactica.Count - (item.Longitud * 2), item.Longitud * 2);
                            filaMatrizEntera = Convert.ToInt32(miListaPilaSintactica[miListaPilaSintactica.Count - 1].Elemento);
                            interseccion     = Convert.ToInt32(matrizLALR.Rows[(filaMatrizEntera) + 1][buscarToken(item.ParteIzquierda)]);

                            //Y Agregamos a la pila sintactica la regla que se va a mostrar en la tabla pila
                            miPilaSintactica = new pilaSintactica()
                            {
                                Elemento = item.ParteIzquierda
                            };
                            miListaPilaSintactica.Add(miPilaSintactica);

                            miPilaSintactica = new pilaSintactica()
                            {
                                Elemento = (interseccion).ToString()
                            };
                            miListaPilaSintactica.Add(miPilaSintactica);

                            Console.WriteLine("Fila: " + filaMatrizEntera + " Col:" + item.ParteIzquierda);
                            Console.WriteLine(interseccion);
                        }
                    }


                    miMovimientosEntrada = new movimientosEntrada()
                    {
                        Num     = num,
                        Entrada = obtenerEntradaFormatear(pilaTokensReconocidos)
                    };
                    listaEntrada.Add(miMovimientosEntrada);

                    //Agregamos la lista pilaM y formatemos para mostrar en la vista tblPila
                    miPilaM = new movimientosPila()
                    {
                        Num  = num,
                        Pila = obtenerPilaFormatear(miListaPilaSintactica)
                    };
                    listaPila.Add(miPilaM);


                    //Console.WriteLine("interseccion: " + interseccion);
                    filaMatrizEntera = interseccion + 1;
                    //if (interseccion > 200) {
                    //    flag = false;
                    //}


                    num++;
                }
                else
                {
                    Console.WriteLine("Siguinte");


                    //Agregamos accion dezplazar
                    miAccion = new movimeintoAccion()
                    {
                        Num    = num - 1,
                        Accion = "Desplaza"
                    };
                    listaAccion.Add(miAccion);

                    //Agregamos a la pila sintactica lo que se va a mostrar en la tabla pila

                    miPilaSintactica = new pilaSintactica()
                    {
                        Elemento = pilaTokensReconocidos[0].SinonimoToken.ToString()
                    };
                    miListaPilaSintactica.Add(miPilaSintactica);

                    miPilaSintactica = new pilaSintactica()
                    {
                        Elemento = (Math.Abs(interseccion)).ToString()
                    };
                    miListaPilaSintactica.Add(miPilaSintactica);

                    //Removemos token de pilaTR para poder utilizar el proximo token reconocido
                    pilaTokensReconocidos.RemoveAt(0);

                    //Agregamos y formatemoslos tokens segun la pilaTR
                    miMovimientosEntrada = new movimientosEntrada()
                    {
                        Num     = num,
                        Entrada = obtenerEntradaFormatear(pilaTokensReconocidos)
                    };
                    listaEntrada.Add(miMovimientosEntrada);

                    //Agregamos la lista pilaM y formatemos para mostrar en la vista tblPila
                    miPilaM = new movimientosPila()
                    {
                        Num  = num,
                        Pila = obtenerPilaFormatear(miListaPilaSintactica)
                    };
                    listaPila.Add(miPilaM);


                    //Console.WriteLine("interseccion: " + interseccion);
                    filaMatrizEntera = interseccion + 1; //Sumamos 1 por la pocicion de la matriz
                    num++;
                }
            }
        }