Example #1
0
        public void analisarConteudo(string arquivoEntrada, AutomatoFinito automatoFinito, ref List <TabelaSimbolos> tokensReconhecidos, ref List <string> erros)
        {
            lerArquivo(arquivoEntrada);
            string textoLinha;

            for (int numeroLinha = 0; numeroLinha < _listaEntrada.Count; numeroLinha++)
            {
                // passa cada linha
                textoLinha = _listaEntrada[numeroLinha];
                textoLinha = textoLinha.Replace(System.Environment.NewLine, " "); // remove quebra de linha e poe espaço
                List <string> matches = new List <string>();
                // insere espaço antes dos operadores para separar
                foreach (System.Text.RegularExpressions.Match m in Utils.expressaoOperadores.Matches(textoLinha))
                {
                    if (matches.Contains(m.Value))
                    {
                        continue;
                    }
                    matches.Insert(0, m.Value);
                    textoLinha = textoLinha.Replace(matches[0], " " + matches[0] + " ");
                }
                _listaEntrada[numeroLinha] = Utils.expressaoEspacosDuplos.Replace(textoLinha, " ").Trim(); // remove espaços duplos
                string[] tokens = _listaEntrada[numeroLinha].Split(' ');                                   // separa cada token pelo separador
                foreach (var token in tokens)
                {
                    // passa cada token da linha
                    Estado estadoAtual = automatoFinito.estados[0]; // estado inicial
                    for (int i = 0; i < token.Length; i++)
                    {
                        // passa cada caractere do token
                        // verifica se tem uma transição para esse caractere/simbolo
                        // como ta determinizado, só tem uma ou nenhuma trasição por esse caractere/simbolo
                        Transicao transicaoSimbolo = (estadoAtual.transicoes.Where(x => x.simbolo.Equals(token[i]))).FirstOrDefault();
                        if (transicaoSimbolo == null)
                        {
                            // não encontrou transição, leva o índice para a última posição
                            i = token.Length - 1;
                        }
                        else
                        {
                            estadoAtual = transicaoSimbolo.estadoDestino;
                        }

                        if (i == token.Length - 1)   // encontrou um separador
                        {
                            if (!estadoAtual.final || transicaoSimbolo == null)
                            {
                                // erro
                                erros.Add("Linha " + (numeroLinha + 1) + ": a sequência de símbolos " + token + " não é reconhecida como sentença...");
                            }
                            else
                            {
                                // token reconhecido
                                tokensReconhecidos.Add(new TabelaSimbolos(tokensReconhecidos.Count(), token, estadoAtual, numeroLinha + 1));
                            }
                        }
                    }
                }
            }
        }
Example #2
0
        private bool BuscaLargura(AutomatoFinito automatoFinito, Estado estadoInicial)
        {
            // retorna true se encontra um estado final, senão false
            Queue <Estado> fila = new Queue <Estado>();
            List <Estado>  estadosAlcancados = new List <Estado>();

            fila.Enqueue(estadoInicial);
            while (fila.Count > 0)
            {
                Estado estadoDesempilhado = fila.Dequeue();
                foreach (Transicao transicao in estadoDesempilhado.transicoes)
                {
                    if (transicao.estadoDestino != null)
                    {
                        if (!estadosAlcancados.Contains(transicao.estadoDestino))
                        {
                            if (transicao.estadoDestino.final)
                            {
                                return(true);
                            }
                            fila.Enqueue(transicao.estadoDestino);
                            estadosAlcancados.Add(transicao.estadoDestino);
                        }
                    }
                }
            }
            return(false);
        }
Example #3
0
 private void analisarTokens(List <string> tokens, AutomatoFinito automatoFinito)
 {
     if (automatoFinito.estados.Count == 0)
     {                                                                  // se não tem produções, só tokens
         automatoFinito.estados.Add(new Estado((0).ToString(), false)); // primeiro estado: S
     }
     foreach (var token in tokens)
     {
         Estado estadoAtual = automatoFinito.estados[0]; // estado S
         foreach (var simbolo in token)
         {
             // cria um novo estado para transição
             int    idEstado   = automatoFinito.estados.Count();
             Estado estadoNovo = new Estado(idEstado.ToString(), false);
             automatoFinito.estados.Add(estadoNovo);
             // cria a transição para o novo estado
             estadoAtual.transicoes.Add(new Transicao(simbolo, estadoNovo));
             if (!automatoFinito.alfabeto.Contains(simbolo))
             {
                 automatoFinito.alfabeto.Add(simbolo);
             }
             estadoAtual = estadoNovo;
         }
         estadoAtual.final = true;
     }
 }
Example #4
0
 private void escreverArquivoCSV(AutomatoFinito automatoFinito)
 {
     if (Path.GetExtension(this.arquivoSaidaCSV).Contains("csv"))
     {
         StreamWriter stream = new StreamWriter(this.arquivoSaidaCSV);
         stream.Write(automatoFinito.ToCsv(";"));
         stream.Close();
         stream.Dispose();
     }
 }
Example #5
0
        public AutomatoFinito CarregarAutomatoFinito()
        {
            lerArquivo();
            AutomatoFinito automatoFinito = gerarAutomatoFinitoInicial();

            automatoFinito = determinizarAutomato(automatoFinito);
            removerMortos(automatoFinito);
            escreverArquivoCSV(automatoFinito);

            return(automatoFinito);
        }
Example #6
0
        private AutomatoFinito determinizarAutomato(AutomatoFinito automatoFinito)
        {
            AutomatoFinito   automatoFinitoDeterministico = new AutomatoFinito();
            List <Estado>    estadosPendentes             = new List <Estado>();
            List <Estado>    estadosCombinados            = new List <Estado>();
            List <Transicao> transicoes = new List <Transicao>();

            automatoFinitoDeterministico.alfabeto = automatoFinito.alfabeto;
            estadosPendentes.Add(automatoFinito.estados[0]);
            while (estadosPendentes.Count > 0)
            {
                List <string> labelsCombinados = estadosPendentes[0].nome.Split(',').ToList();
                estadosCombinados = (from obj in automatoFinito.estados where labelsCombinados.Contains(obj.nome) select obj).ToList();

                Estado novoEstado = (from obj in automatoFinitoDeterministico.estados where obj.nome.Equals(estadosPendentes[0].nome) select obj).FirstOrDefault();
                if (novoEstado == null)
                {
                    novoEstado = new Estado(estadosPendentes[0].nome, estadosCombinados.Exists(x => x.final));
                    automatoFinitoDeterministico.estados.Add(novoEstado);
                }
                else
                {
                    novoEstado.final = estadosCombinados.Exists(x => x.final);
                }

                foreach (var estado in estadosCombinados)
                {
                    transicoes.AddRange(estado.transicoes);
                }

                List <char> simbolosDistintos = transicoes.Select(x => x.simbolo).Distinct().ToList();
                simbolosDistintos.Sort();
                foreach (var simbolo in simbolosDistintos)
                {
                    List <string> estadosAlcancadosPeloSimbolo = transicoes.Where(x => x.simbolo.Equals(simbolo)).Select(x => x.estadoDestino.nome).Distinct().ToList();
                    estadosAlcancadosPeloSimbolo.Sort();
                    string labelEstadoDestino = string.Join(",", estadosAlcancadosPeloSimbolo);
                    Estado estadoDestino      = (from obj in automatoFinitoDeterministico.estados where obj.nome.Equals(labelEstadoDestino) select obj).FirstOrDefault();
                    if (estadoDestino == null)
                    {
                        estadoDestino = new Estado(labelEstadoDestino, false);
                        automatoFinitoDeterministico.estados.Add(estadoDestino);
                        estadosPendentes.Add(estadoDestino);
                    }
                    novoEstado.transicoes.Add(new Transicao(simbolo, estadoDestino));
                }

                transicoes.Clear();
                estadosPendentes.RemoveAt(0);
            }
            return(automatoFinitoDeterministico);
        }
Example #7
0
        private AutomatoFinito gerarAutomatoFinitoInicial()
        {
            List <string> producoes, tokens;

            producoes = (from linha in listaEntrada where linha.Contains(Utils.simboloAtribuicao) select linha.Replace(" ", string.Empty)).ToList();
            listaEntrada.RemoveAll(x => producoes.Contains(x.Replace(" ", string.Empty)));
            tokens = (from linha in listaEntrada select linha.Replace(" ", string.Empty)).ToList();

            AutomatoFinito automatoFinitoInicial = new AutomatoFinito();

            analisarProducoes(producoes, automatoFinitoInicial);
            analisarTokens(tokens, automatoFinitoInicial);

            return(automatoFinitoInicial);
        }
Example #8
0
        static void Main(string[] args)
        {
            string txtEntradaGramatica, txtSaidaAutomato, txtCodigoFonte, txtSaidaAutomatoCSV;

            txtEntradaGramatica = @"Entrada\entrada.txt";
            txtSaidaAutomato    = @"Saida\saida.txt";
            txtSaidaAutomatoCSV = @"Automato\sai.csv";
            txtCodigoFonte      = @"Entrada\fonte.txt";

            StreamWriter arquivoSaida = new StreamWriter(txtSaidaAutomato, false, Encoding.UTF8);

            ViewAutomatoFinito CriadorAutomato = new ViewAutomatoFinito();
            AutomatoFinito     automatoFinito  = new AutomatoFinito();

            CriadorAutomato.arquivoEntrada  = txtEntradaGramatica;
            CriadorAutomato.arquivoSaidaCSV = txtSaidaAutomatoCSV;
            automatoFinito = CriadorAutomato.CarregarAutomatoFinito();

            Console.WriteLine("Autômato finito gerado.");
            arquivoSaida.WriteLine("Autômato finito gerado.");
            arquivoSaida.WriteLine(automatoFinito.criaListaSaida());

            AnalisadorLexico      Lexico      = new AnalisadorLexico();
            List <TabelaSimbolos> tokensLidos = new List <TabelaSimbolos>();
            List <string>         erros       = new List <string>();

            Lexico.analisarConteudo(txtCodigoFonte, automatoFinito, ref tokensLidos, ref erros);

            arquivoSaida.WriteLine("Tabela Símbolos:\r\n" +
                                   String.Join(Environment.NewLine,
                                               tokensLidos.Select(token => String.Format("id: {0}, estado: {1}, rotulo: {2}, {3}",
                                                                                         token.identificador,
                                                                                         token.estadoReconhecedor.nome,
                                                                                         token.rotulo,
                                                                                         token.linha))));

            arquivoSaida.WriteLine("\n\nErros:\r\n" + (erros == null || erros.Count == 0 ? "\nNenhum.\n" : String.Join(Environment.NewLine, erros)));

            Console.WriteLine("\nAnálise léxica foi feita com sucesso...\n. . . . . . . .\n");
            arquivoSaida.WriteLine("Análise léxica foi feita com sucesso...\n");
            arquivoSaida.Close();
            arquivoSaida.Dispose();
            Console.WriteLine("Arquivo de saída gerado foi gerado.\n\n\n");
        }
Example #9
0
        static void Main(string[] args)
        {
            AutomatoFinito.Iniciar_AutomatoFinito("<a>quem esta ai?</a>");

            if (AutomatoFinito.entradaValida)
            {
                Console.WriteLine("Entrada validada");
            }
            else
            {
                Console.WriteLine("A sequencia incorreta");
            }

            foreach (var elementoValido in AutomatoFinito.SequenciaValidada())
            {
                Console.WriteLine(elementoValido);
            }

            Console.ReadKey();
        }
Example #10
0
        private void removerMortos(AutomatoFinito automatoFinito)
        {
            List <Estado> estadosRemover = new List <Estado>();

            foreach (Estado estado in automatoFinito.estados)
            {
                if (estado.final)
                {
                    continue;
                }
                bool vivo = BuscaLargura(automatoFinito, estado);
                if (!vivo)
                {
                    estadosRemover.Add(estado);
                }
            }
            automatoFinito.estados.RemoveAll(x => estadosRemover.Contains(x));
            foreach (Estado estado in automatoFinito.estados)
            {
                estado.transicoes = estado.transicoes.Where(x => automatoFinito.estados.Contains(x.estadoDestino)).ToList();
            }
        }
Example #11
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);
                        }
                    }
                }
            }
        }