示例#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;
                        }
                    }
                }
            }
        }
示例#2
0
        //Metodo para remover lados direitos
        public static void removerLadoDireito(Producao ladoEsquerdo, List <string> ladoDireito)
        {
            //producoes.Find(ladoEsquerdo).direitos.Remove(ladoDireito);
            int a = producoes.IndexOf(ladoEsquerdo);

            for (int i = 0; i < ladoDireito.Count; i++)
            {
                producoes[producoes.IndexOf(ladoEsquerdo)].direitos.Remove(ladoDireito[i]);
            }
        }
示例#3
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);
        }
示例#4
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);
        }
示例#5
0
        public static void adicionarProducao(string ladoEsquerdo, string ladoDireito)
        {
            //Variável usada pra verificar se uma produção com o mesmo NT já existe
            bool existe = false;

            foreach (Producao p in producoes)
            {
                if (p.esquerdo[0].ToString() == ladoEsquerdo)
                {
                    p.direitos.Add(ladoDireito);
                    return;
                }
            }

            if (!existe)
            {
                Producao p = new Producao(ladoEsquerdo, ladoDireito);
                producoes.Add(p);
            }
        }
示例#6
0
 //METODO PARA REMOVER PRODUÇÕES
 public static void removerProducao(Producao producaoParaRemover)
 {
     producoes.Remove(producaoParaRemover);
 }
示例#7
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);
        }