public Transicao(char Psimbolo, Estado PEstadoDestino) { this.simbolo = Psimbolo; this.estadoDestino = PEstadoDestino; }
private void analisarProducoes(List <string> producoes, AutomatoFinito automatoFinito) { int indiceDoSeparador; string[] transicoes; char simbolo; Estado estadoAtual; Dictionary <string, string> mapeamentoEstados = new Dictionary <string, string>(); automatoFinito.estados.Add(new Estado((0).ToString(), false)); // primeiro estado: S foreach (var producao in producoes) { indiceDoSeparador = producao.IndexOf(Utils.simboloAtribuicao); string labelEstado = producao.Substring(0, indiceDoSeparador).Replace("<", String.Empty).Replace(">", String.Empty); if (labelEstado.Equals("S")) { // indica que uma nova gramatica ta comecando mapeamentoEstados.Clear(); mapeamentoEstados.Add("S", (0).ToString()); } if (mapeamentoEstados.ContainsKey(labelEstado)) { // se o estado ja ta mapeado busca o estado string valor; mapeamentoEstados.TryGetValue(labelEstado, out valor); estadoAtual = (from obj in automatoFinito.estados where obj.nome.Equals(valor) select obj).FirstOrDefault(); } else { // senao mapeia e cria um estado novo int idEstado = automatoFinito.estados.Count(); mapeamentoEstados.Add(labelEstado, idEstado.ToString()); estadoAtual = new Estado(idEstado.ToString(), false); automatoFinito.estados.Add(estadoAtual); } transicoes = producao.Substring(indiceDoSeparador + Utils.simboloAtribuicao.Length).Replace("<", String.Empty).Replace(">", String.Empty).Split('|'); foreach (var transicao in transicoes) { // transicao(0) é simbolo // transicao(1), se tiver, é estado, se não tiver cria um final sem transição // se o estado nao ta no mapeamento, cria um e poe no map simbolo = transicao[0]; if (simbolo.Equals(Utils.epsolon)) { // se o símbolo é o epsolon, o estado é final estadoAtual.final = true; } else { Estado estadoDestino; if (simbolo.ToString().Equals(transicao)) { // se só tem um símbolo, sem transição, cria um novo estado final int idEstado = automatoFinito.estados.Count(); //mapeamentoEstados.Add(labelEstado, idEstado); não mapeia pq não vai ter outra referencia para este estado estadoDestino = new Estado(idEstado.ToString(), true); automatoFinito.estados.Add(estadoDestino); } else { // se tem simbolo e transição para outro estado // verifica se o estado existe, senao cria um e mapeia string lblEstadoTransicao = transicao.Substring(1); if (mapeamentoEstados.ContainsKey(lblEstadoTransicao)) { // se o estado ja ta mapeado busca o estado string valor; mapeamentoEstados.TryGetValue(lblEstadoTransicao, out valor); estadoDestino = (from obj in automatoFinito.estados where obj.nome.Equals(valor) select obj).FirstOrDefault(); } else { // senao mapeia e cria um estado novo int idEstado = automatoFinito.estados.Count(); mapeamentoEstados.Add(lblEstadoTransicao, idEstado.ToString()); estadoDestino = new Estado(idEstado.ToString(), false); automatoFinito.estados.Add(estadoDestino); } } estadoAtual.transicoes.Add(new Transicao(simbolo, estadoDestino)); if (!automatoFinito.alfabeto.Contains(simbolo)) { automatoFinito.alfabeto.Add(simbolo); } } } } }