Ejemplo n.º 1
0
 public Transicao(char Psimbolo, Estado PEstadoDestino)
 {
     this.simbolo       = Psimbolo;
     this.estadoDestino = PEstadoDestino;
 }
Ejemplo n.º 2
0
        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);
                        }
                    }
                }
            }
        }