public Automato(FileIterator iteradorArquivo)
        {
            this.iteradorArquivo = iteradorArquivo;
            this.tabelaSimbolos  = new Dictionary <StateValueObject, dynamic>();

            s0 = new StateValueObject(false, 0);

            s0.addTransition(' ', s0);
            s0.addTransition('\t', s0);
            s0.addTransition('\n', s0);
            s0.addTransition('\r', s0);

            if (!File.Exists("Arquivos/Dicionario_lexemas.txt"))
            {
                throw new FileNotFoundException("Arquivo específicado não encontrado");
            }

            var lines = File.ReadLines("Arquivos/Dicionario_lexemas.txt");

            foreach (var item in lines)
            {
                var split = item.Split("|&!");

                tabelaSimbolos.criarTransicaoPalavra(s0, split[0], split[1]);
            }
            tabelaSimbolos.criarTransicaoNumerica(s0);
        }
        private static StateValueObject criarEstadoTransicaoUnica(int identificador,
                                                                  StateValueObject estadoAnterior, char caracterTransicao,
                                                                  bool marcado)
        {
            StateValueObject s = new StateValueObject(marcado, identificador);

            if (!estadoAnterior.existsTransition(caracterTransicao))
            {
                estadoAnterior.addTransition(caracterTransicao, s);
            }
            else
            {
                return(estadoAnterior.getTransition(caracterTransicao));
            }
            return(s);
        }
        public TokenLexeme recuperarProximoTokenLexema()
        {
            TokenLexeme tokenLexema;
            string      lexema = "";

            StateValueObject estadoAtual = s0;
            char             c = ' ';
            bool             podeSerNumerico = false, eNumerico = false, podeSerString = false, eString = false;

            while (
                //Enquanto for token
                (eNumerico && (c = iteradorArquivo.nextChar()) != '¨' && !IsSpace(c)) ||
                //Enquanto for lexema
                (estadoAtual != null && !estadoAtual.isChecked() && (c = iteradorArquivo.nextChar()) != '¨') ||
                //Enquanto for string
                (eString && estadoAtual is null && (c = iteradorArquivo.nextChar()) != '¨' && !IsSpace(c)) ||
                //Palavra completa que não é string, nem lexema nem inteiro
                (eNumerico is false && eString is false && estadoAtual is null && (c = iteradorArquivo.nextChar()) != '¨' && !IsSpace(c))
                )
            {
                // Validação se o primeiro caracter é uma letra minuscula
                if ((int)c > 96 && (int)c < 123 && s0.Equals(estadoAtual))
                {
                    eString = true;
                }

                try
                {
                    if (!eNumerico)
                    {
                        estadoAtual = estadoAtual.getNextState(c);
                    }
                }
                catch (Exception x)
                {
                    //ignored
                }

                if (eString is false && estadoAtual == null && char.IsNumber(c))
                {
                    eNumerico = true;
                }
        public static void criarTransicaoPalavra(this Dictionary <StateValueObject, dynamic> tabelaSimbolos, StateValueObject s0, string lexema, string token)
        {
            StateValueObject last = s0;

            if (lexema.Length == 1)
            {
                last = criarEstadoTransicaoUnica(1, last, lexema[0], false);
            }
            else
            {
                for (int i = 0; i <= lexema.Length - 1; i++)
                {
                    last = criarEstadoTransicaoUnica((i + 1), last, lexema[i], false);
                }
            }


            StateValueObject estadoFinal = new StateValueObject(true, lexema.Length);

            last.addTransition(' ', estadoFinal);
            last.addTransition('\t', estadoFinal);
            last.addTransition('\r', estadoFinal);
            tabelaSimbolos.Add(estadoFinal, token.ToUpper());
        }
 public static void criarTransicaoNumerica(this Dictionary <StateValueObject, dynamic> tabelaSimbolos, StateValueObject s0)
 {
     for (int i = 0; i <= 9; i++)
     {
         criarEstadoTransicaoUnica((i + 1), s0, (char)i, false);
     }
 }