示例#1
0
        /// <summary>
        /// Processo de redução.
        /// </summary>
        /// <param name="pilha"></param>
        /// <param name="tabelaSLR"></param>
        /// <param name="producao"></param>
        /// <returns></returns>
        public int Reduzir(Stack <string> pilha, List <List <string> > tabelaSLR, Producao producao)
        {
            string ladoDireito = "";
            bool   achou       = false;
            int    count       = -1;

            foreach (var simbolo in pilha)
            {
                // Quantidade de simbolos que serão removidos da pilha.
                count++;

                if (Int32.TryParse(simbolo, out int estadoAnterior))
                {
                    if (!achou)
                    {
                        continue;
                    }

                    for (int i = 0; i < count; i++)
                    {
                        pilha.Pop();
                    }

                    string proximoEstado =
                        tabelaSLR[estadoAnterior + 1][tabelaSLR[0].FindIndex(x => x == producao.Gerador)];

                    pilha.Push(producao.Gerador);
                    pilha.Push(proximoEstado);

                    return(Convert.ToInt32(proximoEstado));
                }
                else
                {
                    // Lê o símbolo ao contrário, por isso insere no início ao invés de concatenar.
                    ladoDireito = ladoDireito.Insert(0, simbolo);

                    if (producao.Valor == ladoDireito && ladoDireito.Length == producao.Valor.Length)
                    {
                        achou = true;
                    }
                }
            }

            return(count);
        }
示例#2
0
        private List <string> ProducoesParaLista(Producao producao)
        {
            var lista = new List <string>();

            string simbolo = "";

            for (int i = producao.Valor.Length - 1; i >= 0; i--)
            {
                simbolo = simbolo.Insert(0, producao.Valor[i].ToString());

                if (Terminais.Any(t => t.Valor.Equals(simbolo)) ||
                    NaoTerminais.Any(nt => nt.Valor.Equals(simbolo)))
                {
                    lista.Add(simbolo);
                    simbolo = "";
                }
            }

            lista.Reverse();
            lista.Insert(0, ".");
            return(lista);
        }