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