Ejemplo n.º 1
0
        private bool validaCadena(List <string> listTokens)
        {
            Stack <PilaASTokens> stack = new Stack <PilaASTokens>();
            string       accion        = "";
            PilaASTokens sPila         = new PilaASTokens("$", 0, "$0");
            bool         valido        = false;
            Produccion   p;
            string       tabla;
            int          i = 0;

            listTokens.Add("$");
            stack.Push(sPila);
            while (i < listTokens.Count && valido == false)
            {
                sPila  = stack.Peek();
                accion = this.buscaEnTabla(sPila.numEdo, listTokens.ElementAt(i) /*cadValidar[0].ToString()*/);
                if (accion != "")
                {
                    dgvTAcciones.Rows.Add(stack.Peek().pila, listTokens.ElementAt(i), accion);
                    switch (accion[0])
                    {
                    case 's':      //desplazamiento
                        stack.Push(new PilaASTokens(listTokens.ElementAt(i),
                                                    int.Parse(accion.Substring(1)), stack.Peek().pila + listTokens.ElementAt(i) + accion.Remove(0, 1)));
                        i++;
                        break;

                    case 'r':      //reduccion
                        p = this.afd.buscaProduccion(int.Parse(accion.Substring(1).ToString()));
                        for (int j = 0; j < p.listProd.Count; j++)
                        {
                            stack.Pop();
                        }
                        tabla = p.nT.token + int.Parse(this.buscaEnTabla(stack.Peek().numEdo, p.nT.token));
                        stack.Push(new PilaASTokens(p.nT.token, int.Parse(this.buscaEnTabla(stack.Peek().numEdo, p.nT.token)), stack.Peek().pila + tabla));
                        break;

                    case 'A':     //aceptar
                    case 'a':
                        valido = true;
                        break;
                    }
                }
                else
                {
                    break;
                }
            }


            return(valido);
        }
Ejemplo n.º 2
0
        private bool validaCadena(List<string> listTokens)
        {
            Stack<PilaASTokens> stack = new Stack<PilaASTokens>();
            string accion="";
            PilaASTokens sPila = new PilaASTokens("$",0,"$0");
            bool valido = false;
            Produccion p;
            string tabla;
            int i = 0;

            listTokens.Add("$");
            stack.Push(sPila);
            while(i<listTokens.Count && valido == false)
            {
                sPila = stack.Peek();
                accion = this.buscaEnTabla(sPila.numEdo, listTokens.ElementAt(i)/*cadValidar[0].ToString()*/);
                if (accion != "")
                {
                    dgvTAcciones.Rows.Add(stack.Peek().pila, listTokens.ElementAt(i), accion);
                    switch (accion[0])
                    {
                        case 's' : //desplazamiento
                            stack.Push(new PilaASTokens(listTokens.ElementAt(i),
                                                        int.Parse(accion.Substring(1)),stack.Peek().pila+ listTokens.ElementAt(i) + accion.Remove(0,1)));
                            i++;
                        break;
                        case 'r' : //reduccion
                            p = this.afd.buscaProduccion(int.Parse(accion.Substring(1).ToString()));
                            for(int j =0;j<p.listProd.Count;j++)
                            {
                                stack.Pop();
                            }
                            tabla =  p.nT.token + int.Parse(this.buscaEnTabla(stack.Peek().numEdo, p.nT.token));
                            stack.Push(new PilaASTokens(p.nT.token, int.Parse(this.buscaEnTabla(stack.Peek().numEdo, p.nT.token)),stack.Peek().pila+tabla));
                        break;
                        case 'A' ://aceptar
                        case 'a' :
                            valido = true;
                        break;
                    }
                }
                else
                {
                    break;
                }
            }


            return valido;
        }