예제 #1
0
        static void Main(string[] args)
        {
            var codigoFonte = File.ReadAllText(@"CodigoFonte.txt");  // Transforma o arquivo todo em string

            codigoFonte = codigoFonte.Replace(' ', '\r');

            AnalisadorLexico.AnalisadorLexico analisadorLexico = new AnalisadorLexico.AnalisadorLexico(codigoFonte);

            Simbolo simbolo = new Simbolo();

            Console.WriteLine("Aperte ENTER para solicitar o TOKEN:");

            while (simbolo.Lexema != "EOF")
            {
                string caracterDigitado = Console.ReadLine();
                if (caracterDigitado == "\n")
                {
                    ;
                }
                simbolo = analisadorLexico.RetornaToken();
                EscreveSimboloNaTela(simbolo);
            }

            Console.ReadLine();

            List <Simbolo> TabelaDeSimbolos = analisadorLexico.GetTabelaDeSimbolos();
        }
예제 #2
0
        static void Main(string[] args)
        {
            AnalisadorLexico lex = new AnalisadorLexico(@"C:\Users\ailat\Documents\DEV\AnalisadorLexico\prog.in.txt");

            Console.WriteLine(lex.nextToken());
            Console.WriteLine(lex.nextToken());
            Console.WriteLine(lex.nextToken());
        }
        public void AnaliseSintatica()
        {
            AnalisadorLexico.AnalisadorLexico analisadorLexico = new AnalisadorLexico.AnalisadorLexico(_codigoFonte); //aqui é onde ele inicializa o analisador léxico
            _pilha.Push(0);                                                                                           // Empilha o estado inicial na pilha
            int             estado          = 0;
            string          acao            = "";
            string          guardaToken     = "";
            Simbolo         simbolo         = analisadorLexico.RetornaToken();
            Stack <Simbolo> pilhaDeSimbolos = new Stack <Simbolo>();

            while (true)                                                                   // Início do procedimento de Shift - Reduce
            {                                                                              //enquanto ele não aceitar ou dar erro ele não para a execução
                if (simbolo.Token != "ERRO")                                               //CASO NÃO SEJA RETORNADO UM ERRO DO ANALISADOR LÉXICO
                {
                    acao = _tabelaShiftReduce.Rows[estado][$"{simbolo.Token}"].ToString(); //captura a ação da tabela shift-reduce de acordo com o estado e com o simbolo

                    if (acao.Contains("S"))                                                //EMPILHA
                    {
                        estado = Convert.ToInt32(acao.Substring(1));
                        _pilha.Push(estado);

                        if (pilhaDeSimbolos.Count == 0)
                        {
                            simbolo = analisadorLexico.RetornaToken(); //atualiza o simbolo com o token retornado do léxico
                        }
                        else
                        {
                            simbolo.Token = guardaToken;           //atualiza o token após o tratamento do erro
                            simbolo       = pilhaDeSimbolos.Pop(); //atualiza com o simbolo da pilha
                        }
                    }
                    else
                    {
                        if (acao.Contains("R"))                                   // REDUZ
                        {
                            int numProducao = Convert.ToInt32(acao.Substring(1)); //captura o numero da produção se for S32 PEGA SO O 32;
                            var producao    = new string[2];
                            _producoes.TryGetValue(numProducao, out producao);    //Atualiza a produção De acordo com o número da ação;
                            var Simbolos    = producao[1].Split(' ');
                            int numSimbolos = Simbolos.Count();
                            //DESEMPILHA QUANTIDADE DE SÍMBOLOS LADO DIREITO
                            for (int i = 0; i < numSimbolos; i++)
                            {
                                _pilha.Pop();
                            }

                            //EMPILHAR O VALOR DE [t,A] na pilha
                            estado = Convert.ToInt32(_tabelaShiftReduce.Rows[Convert.ToInt32(_pilha.Peek())][producao[0].ToString()]); //pula para o estado seguinte
                            _pilha.Push(estado);
                            Console.WriteLine($"{producao[0]} -> {producao[1]}");
                        }
                        else
                        {
                            if (acao.Contains("ACC")) // ACEITA
                            {
                                Console.WriteLine("P' -> P");
                                Console.ReadLine();
                                break;
                            }
                            else //EM CASO DE ERRO SINTÁTICO
                            {
                                if (Convert.ToInt32(acao.Substring(1)) < 16) //CASO O ERRO SEJA TRATÁVEL
                                {
                                    Simbolo s = CopiaSimbolo(simbolo);
                                    pilhaDeSimbolos.Push(s);                  //cria uma nova pilha para guardar os tokens já lidos
                                    var tipoDeErro = Erro(acao, s);
                                    guardaToken   = simbolo.Token;            //guarda o token do simbolo atual para atualizar depois do tratamento de erro
                                    simbolo.Token = tipoDeErro[1].ToString(); //Rotina de erro
                                }
                                else //SE O ERRO NÃO FOR TRATÁVEL A COMPILAÇÃO É PAUSADA
                                {
                                    Erro(acao, simbolo);
                                    Console.ReadLine();
                                    break;
                                }
                            }
                        }
                    }
                }
                else//EM CASO DE ERRO LÉXICO
                {
                    PrintErro(simbolo.DescricaoERRO, simbolo); //Escreve o erro na tela
                    simbolo = analisadorLexico.RetornaToken(); //Busca o próximo token
                }
            }
            List <Simbolo> TabelaDeSimbolos = analisadorLexico.GetTabelaDeSimbolos(); //busca a tabela de símbolos
        }