Пример #1
0
        /// <summary>
        /// Valida uma produção, antes de adicionar à gramática.
        /// </summary>
        /// <param name="p">A produção a ser validada.</param>
        /// <returns>Verdadeiro se a produção é válida; senão, falso.</returns>
        public bool ValidarProducao(string p)
        {
            var    lista   = new List <string>();
            string simbolo = "";

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

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

            if (simbolo.Length > 0)
            {
                return(false);
            }

            if (lista.Count >= 3)
            {
                if (!IsTerminal(lista[0]) && IsTerminal(lista[1]) && !IsTerminal(lista[2]) && lista[0].Equals(lista[1]))
                {
                    return(false);
                }
            }

            bool achou;

            foreach (var s in lista)
            {
                achou = false;

                foreach (var nt in NaoTerminais)
                {
                    if (nt.Valor.Equals(s))
                    {
                        achou = true;
                    }
                }

                foreach (var t in Terminais)
                {
                    if (t.Valor.Equals(s))
                    {
                        achou = true;
                    }
                }

                if (!achou)
                {
                    return(false);
                }
            }

            return(true);
        }
Пример #2
0
        /// <summary>
        /// Ordena os terminais de forma alfabética.
        /// </summary>
        public void OrdenarTerminaisAlfabeticamente()
        {
            Terminais = Terminais.OrderByDescending(t => t.Valor).ToList();

            int i1 = Terminais.FindIndex(t => t.Valor == "(");

            if (i1 != -1)
            {
                int i2 = Terminais.FindIndex(t => t.Valor == ")");

                if (i2 != -1)
                {
                    T tmp = Terminais[i1];
                    Terminais[i1] = Terminais[i2];
                    Terminais[i2] = tmp;
                }
            }
        }
Пример #3
0
        /// <summary>
        /// Enpilha os caracteres de uma string.
        /// </summary>
        /// <param name="entrada">A string a ser empilhada.</param>
        /// <returns>Uma pilha com o conteúdo da string.</returns>
        public Stack <string> EntradaParaPilha(string entrada)
        {
            var pilha = new Stack <string>();

            pilha.Push("$");

            string simbolo = "";

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

                if (Terminais.Any(nt => nt.Valor.Equals(simbolo)))
                {
                    pilha.Push(simbolo);
                    simbolo = "";
                }
            }

            return(pilha);
        }
Пример #4
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);
        }