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; } }
// 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); } }
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); }
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; } }
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 }
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); }