Beispiel #1
0
        private void produzir(string producao, Random rnd, int max, int index, Label label)
        {
            foreach (char c in producao)
            {
                if (Regex.Matches(c.ToString(), @"[A-Z]").Count == 1 && index != max)
                {
                    Producao p = Gramatica.getProducoes().Find(x => x.esquerdo == c.ToString());

                    int    pos  = rnd.Next(p.direitos.Count);
                    string novo = (p.direitos[pos] == "&") ? "" : p.direitos[pos];

                    producao   = producao.Replace(c.ToString(), novo);
                    label.Text = producao;

                    produzir(producao, rnd, max, index + 1, label);
                }
                else if (Regex.Matches(c.ToString(), @"[A-Z]").Count == 1 && index == max)
                {
                    Producao p = Gramatica.getProducoes().Find(x => x.esquerdo == c.ToString());

                    foreach (string s in p.direitos)
                    {
                        if (Regex.Matches(s, @"[A-Z]").Count == 0)
                        {
                            producao   = producao.Replace(c.ToString(), s);
                            label.Text = producao;
                            break;
                        }
                    }
                }
            }
        }
 public static void adicionarNaoTerminal(string simbolo)
 {
     if (String.IsNullOrEmpty(simbolo))
     {
         MessageBox.Show("Símbolos não podem estar vazios.", "Verifique seu símbolo");
         return;
     }
     if (simbolo.Length > 1)
     {
         MessageBox.Show("Símbolos não terminais devem conter apenas uma letra.", "Verifique seu símbolo");
         return;
     }
     else if (Regex.Matches(simbolo, @"[A-Z]").Count == 0)
     {
         MessageBox.Show("Símbolos não terminais devem conter apenas letras maiúsculas.", "Verifique seu símbolo");
         return;
     }
     else
     {
         bool adicionado = Gramatica.adicionarNaoTerminal(simbolo);
         if (adicionado)
         {
             MessageBox.Show("Símbolos não terminal adicionado com sucesso!", "Símbolo adicionado");
         }
         else
         {
             MessageBox.Show("Símbolos já adicionado! Tente novamente.", "Verifique seu símbolo");
         }
         return;
     }
 }
Beispiel #3
0
        // Métodos próprios

        private void OnSimboloAdicionado()
        {
            labelGramatica.Text = Gramatica.atualizarLabelGramatica();
            comboGerador.Items.Clear();
            comboLadoEsquerdo.Items.Clear();
            foreach (string s in Gramatica.getNaoTerminais())
            {
                comboGerador.Items.Add(s);
                comboLadoEsquerdo.Items.Add(s);
            }
        }
Beispiel #4
0
        public static bool adicionarProducaoLC(string ladoEsquerdo, string ladoDireito)
        {
            if (String.IsNullOrWhiteSpace(ladoEsquerdo) || String.IsNullOrWhiteSpace(ladoDireito))
            {
                MessageBox.Show("Produções não podem estar vazias.", "Verifique sua produção");
                return(false);
            }
            foreach (Producao p in Gramatica.getProducoes())
            {
                if (p.direitos[0] == ladoDireito && p.esquerdo == ladoEsquerdo)
                {
                    MessageBox.Show("Produção já adicionada, tente novamente!", "Verifique sua produção.");
                    return(false);
                }
            }
            if (!Gramatica.getNaoTerminais().Contains(ladoEsquerdo))
            {
                MessageBox.Show("Símbolo não terminal não está na gramática, tente com um símbolo adicionado previamente.", "Verifique seu símbolo");
                return(false);
            }



            foreach (char c in ladoDireito)
            {
                if (!c.ToString().Contains("&")) // Afim de realizar a remoção de palavra vazia será permitido que adicione palavra vazia
                {
                    if (!Gramatica.getTerminais().Contains(c.ToString()) && !Gramatica.getNaoTerminais().Contains(c.ToString()))
                    {
                        MessageBox.Show("Símbolo " + c.ToString() + " não está na gramática, tente com um símbolo adicionado previamente.", "Verifique seus símbolo");
                        return(false);
                    }
                }
                else
                {
                    MessageBox.Show("Simbolo Vazio adicionado");
                }
            }

            Producao prod = Gramatica.getProducoes().Find(x => x.esquerdo == ladoEsquerdo);

            if (prod == null)
            {
                Gramatica.getProducoes().Add(new Producao(ladoEsquerdo, ladoDireito));
            }
            else
            {
                prod.direitos.Add(ladoDireito);
            }


            return(true);
        }
Beispiel #5
0
        public string gerarProducoesRegulares(Label label, int maximo)
        {
            producao = "";
            Random rnd = new Random();

            Producao geradora = Gramatica.getProducoes().Find(x => x.esquerdo == Gramatica.simboloGerador);

            int pos = rnd.Next(geradora.direitos.Count);

            producao += geradora.direitos[pos];

            produzir(producao, rnd, maximo, 0, label);

            return(producao);
        }
        ///TODO: Consertar o símbolo vazio (&) não aparecendo no label de produções por alguma treta malígna
        public static void adicionarTerminal(string simbolo, bool regular)
        {
            if (String.IsNullOrEmpty(simbolo))
            {
                MessageBox.Show("Símbolos não podem estar vazios.", "Verifique seu símbolo");
                return;
            }
            if (simbolo.Length > 1)
            {
                MessageBox.Show("Símbolos terminais devem conter apenas uma letra ou dígito.", "Verifique seu símbolo");
                return;
            }
            else if (regular && Regex.Matches(simbolo[0].ToString(), @"[0-9a-z&]").Count == 0)
            {
                MessageBox.Show("Símbolos terminais devem conter apenas letras minúsculas ou digitos.", "Verifique seu símbolo");

                return;
            }
            else if (!regular && Regex.Matches(simbolo[0].ToString(), @"[0-9a-z]").Count == 0)
            {
                MessageBox.Show("Símbolos terminais devem conter apenas letras minúsculas ou digitos e não devem conter sentença vazia(&).", "Verifique seu símbolo");
            }
            else
            {
                bool adicionado = Gramatica.adicionarTerminal(simbolo);
                if (adicionado)
                {
                    MessageBox.Show("Símbolos terminal adicionado com sucesso!", "Símbolo adicionado");
                }
                else
                {
                    MessageBox.Show("Símbolos já adicionado! Tente novamente.", "Verifique seu símbolo");
                }
                return;
            }
        }
Beispiel #7
0
        public static void Remover(DataGridView tabela, DataGridView outraTabela)
        {
            //ESTEREIS
            List <Producao> producoes = Gramatica.getProducoes(); // retorna as produções já adicionadas

            List <Producao> producoesParaRemover = new List <Producao>();


            bool achouEsteril = false;

            foreach (Producao p in producoes)      // para cada produção, ou seja, para cada lado esquerdo
            {
                int prodComNaoTerminais     = 0;   // variavel utilizada para contar quantos nao terminais existem do lado direito
                int prodComMesmoNaoTerminal = 0;   // variavel utilizada para ver quantos desses nao terminais sao iguais ao lado direito

                foreach (string dir in p.direitos) // Para cada lado direito
                {
                    if (dir.Any(char.IsUpper))     // Checando se tem NT
                    {
                        prodComNaoTerminais++;
                        if (dir.Contains(p.esquerdo)) // Checa se o NT é igual ao lado esquerdo
                        {
                            prodComMesmoNaoTerminal++;
                        }
                    }
                }

                if (prodComNaoTerminais == p.direitos.Count) //se o numero de produções com NT é igual ao numero total de produções daquele lado esquerdo
                {
                    if (prodComNaoTerminais == prodComMesmoNaoTerminal)
                    {
                        // QUER DIZER QUE TEM SIMBOLOS ESTEREIS
                        //TODO REMOVER OS SIMBOLOS
                        //Gramatica.removerProducao(p);
                        achouEsteril = true;
                        producoesParaRemover.Add(p); // Guarda as producoes para remover depois
                    }
                }
            }



            #region Remoção de Estereis
            if (achouEsteril)                                            // Se achou estéril
            {
                List <string> direitosParaRemover = new List <string>(); // Lista para armazenar os direitos que serão removidos
                //Remove Producoes Estereis
                foreach (Producao remover in producoesParaRemover)       // Para cada uma que tem que ser removida
                {
                    foreach (Producao prod in producoes)                 // Para cada produção restante das originais
                    {
                        foreach (string dir in prod.direitos)            // Para cada lado direito das produções originais
                        {
                            if (dir.Contains(remover.esquerdo))          // Se cada lado direito contem o simbolo que esta sendo removido
                            {
                                direitosParaRemover.Add(dir);            // Adiciona na lista de direitos para remover
                            }
                        }
                        Gramatica.removerLadoDireito(prod, direitosParaRemover); // Remove os lados direitos que tinham o simbolo removido
                    }
                    Gramatica.removerProducao(remover);                          // Remove a produção da Gramática
                }
            }
            else
            {
                MessageBox.Show("Não foram encontrados simbolos estereis");
            }
            #endregion


            //INALCANÇAVEIS
            producoes            = Gramatica.getProducoes(); // Produções depois de serem verificados simbolos estereis
            producoesParaRemover = new List <Producao>();
            bool houveInalcancaveis = false;

            for (int i = 0; i < producoes.Count; i++)
            {
                bool temInalcancavel = true;
                if (producoes[i].esquerdo != Gramatica.simboloGerador) //Se Não for analizar o simbolo gerador
                {
                    for (int j = 0; j < producoes.Count; j++)          // Para cada lado esquerdo que terá seu lado direito comparado
                    {
                        if (producoes[i].esquerdo != producoes[j].esquerdo)
                        {
                            foreach (string dir in producoes[j].direitos) // Cada lado direito que será comparado
                            {
                                if (dir.Contains(producoes[i].esquerdo))  // Se algum lado direito contem o lado esquerdo em questao
                                {
                                    temInalcancavel = false;              // Possui simbolo alcançavel
                                }
                            }
                        }
                    }
                }
                else
                {
                    temInalcancavel = false; // Para evitar de ser removido o simbolo gerador
                }

                if (temInalcancavel)                         // Se nao for constatado que nao existe inalcançavel
                {
                    Gramatica.removerProducao(producoes[i]); // Remove produção inalcançavel
                    houveInalcancaveis = true;
                }
            }

            if (!houveInalcancaveis)
            {
                MessageBox.Show("Não houve produções inalcançáveis");
            }

            #region Repopula a Grid
            //Repopular a Grid com as produções novas
            InicializadorUI.resetarGrid(tabela);

            foreach (Producao producoesNovas in Gramatica.getProducoes())
            {
                InicializadorUI.adicionarHeadersGrid(tabela, new string[] { "Lado Esquerdo", "Lado Direito" });
                foreach (string dir in producoesNovas.direitos)
                {
                    InicializadorUI.adicionarItemsGrid(tabela, new string[] { producoesNovas.esquerdo, dir });
                }
            }
            #endregion
        }
Beispiel #8
0
        public static bool adicionarProducaoRegular(string ladoEsquerdo, string ladoDireito)
        {
            //Verifica se o usuário não está tentando adicionar uma produção vazia ou se o usuário não está tentando adicionar uma produção inválida
            if (String.IsNullOrWhiteSpace(ladoEsquerdo) || String.IsNullOrWhiteSpace(ladoDireito))
            {
                MessageBox.Show("Produções não podem estar vazias.", "Verifique sua produção");
                return(false);
            }
            else if (ladoEsquerdo.Length > 1 || ladoDireito.Length > 2)
            {
                MessageBox.Show("Lado esquerdo deve conter apenas um símbolo.\nLado direito deve conter no máximo dois símbolos.", "Verifique sua produção");
                return(false);
            }

            //Verifica se a produção já existe
            foreach (Producao p in Gramatica.getProducoes())
            {
                if (p.direitos[0] == ladoDireito && p.esquerdo == ladoEsquerdo)
                {
                    MessageBox.Show("Produção já adicionada, tente novamente!", "Verifique sua produção.");
                    return(false);
                }
            }

            //Verifica se o lado esquerdo está nos não terminais
            if (!Gramatica.getNaoTerminais().Contains(ladoEsquerdo))
            {
                MessageBox.Show("Símbolo não terminal não está na gramática, tente com um símbolo adicionado previamente.", "Verifique seu símbolo");
                return(false);
            }

            //Verifica se o primeiro símbolo é um não terminal que foi adicionado ao conjunto de gramáticas anteriormente
            if (!Gramatica.getTerminais().Contains(ladoDireito[0].ToString()))
            {
                MessageBox.Show("Primeiro símbolo da produção não está na gramática, tente novamente.", "Verifique sua produção.");
                return(false);
            }

            //E se for uma produção com dois símbolos ex: aS verifica se o segundo símbolo é um não terminal que foi adicionado à gramática anteriormente
            if (ladoDireito.Length > 1)
            {
                if (!Gramatica.getNaoTerminais().Contains(ladoDireito[1].ToString()))
                {
                    MessageBox.Show("Segundo símbolo da produção não está na gramática, tente novamente.", "Verifique sua produção.");
                    return(false);
                }
            }


            //Adiciona a produção ao conjunto de produções pois passou por todas as verificações.
            Producao prod = Gramatica.getProducoes().Find(x => x.esquerdo == ladoEsquerdo);

            if (prod == null)
            {
                Gramatica.getProducoes().Add(new Producao(ladoEsquerdo, ladoDireito));
            }
            else
            {
                prod.direitos.Add(ladoDireito);
            }


            return(true);
        }