/// <summary> /// Processo de redução. /// </summary> /// <param name="pilha"></param> /// <param name="tabelaSLR"></param> /// <param name="producao"></param> /// <returns></returns> public int Reduzir(Stack <string> pilha, List <List <string> > tabelaSLR, Producao producao) { string ladoDireito = ""; bool achou = false; int count = -1; foreach (var simbolo in pilha) { // Quantidade de simbolos que serão removidos da pilha. count++; if (Int32.TryParse(simbolo, out int estadoAnterior)) { if (!achou) { continue; } for (int i = 0; i < count; i++) { pilha.Pop(); } string proximoEstado = tabelaSLR[estadoAnterior + 1][tabelaSLR[0].FindIndex(x => x == producao.Gerador)]; pilha.Push(producao.Gerador); pilha.Push(proximoEstado); return(Convert.ToInt32(proximoEstado)); } else { // Lê o símbolo ao contrário, por isso insere no início ao invés de concatenar. ladoDireito = ladoDireito.Insert(0, simbolo); if (producao.Valor == ladoDireito && ladoDireito.Length == producao.Valor.Length) { achou = true; } } } return(count); }
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); }