Пример #1
0
        void AnalisaEnquanto()
        {
            ulong aux1, aux2;
            Token old = token;

            aux1 = contadorEnquanto;
            gerador.NULL("WHILE_" + contadorEnquanto.ToString());
            contadorEnquanto++;
            Lexico();
            semantico.ReinicializaPosFixa();
            SimboloTipo tipo = AnalisaExpressao();

            if (!MesmoTipo(tipo, SimboloTipo.BOOLEANO))
            {
                throw new ExceptionTipoInvalido("", SimboloTipo.BOOLEANO, tipo, old);
            }
            semantico.FinalizaPosFixa();

            ChecaSimboloEsperado(Simbolo.S_FACA);
            FinalizaExpressao();
            aux2 = contadorEnquanto;
            gerador.JMPF("END_WHILE_" + contadorEnquanto.ToString());
            contadorEnquanto++;

            Lexico();
            AnalisaComandoSimples();
            gerador.JMP("WHILE_" + aux1.ToString());
            gerador.NULL("END_WHILE_" + aux2.ToString());
        }
Пример #2
0
 public ExceptionTipoInvalido(string info, SimboloTipo esperado, SimboloTipo recebido, Token token)
 {
     this.token    = token;
     this.info     = info;
     this.recebido = recebido;
     this.esperado = esperado;
 }
Пример #3
0
 public SimboloInfo(string lexema, SimboloTipo tipo, bool marca, int endereco)
 {
     this.lexema   = lexema;
     this.tipo     = tipo;
     this.marca    = marca;
     this.endereco = endereco;
     this.label    = "{**invalida**}";
 }
Пример #4
0
 bool MesmoTipo(SimboloTipo tipo1, SimboloTipo tipo2)
 {
     if (tipo1 == SimboloTipo.INTEIRO || tipo1 == SimboloTipo.FUNCAO_INTEIRO)
     {
         return(tipo2 == SimboloTipo.INTEIRO || tipo2 == SimboloTipo.FUNCAO_INTEIRO);
     }
     else if (tipo1 == SimboloTipo.BOOLEANO || tipo1 == SimboloTipo.FUNCAO_BOOLEANO)
     {
         return(tipo2 == SimboloTipo.BOOLEANO || tipo2 == SimboloTipo.FUNCAO_BOOLEANO);
     }
     return(false);
 }
Пример #5
0
        void AnalisaAtribuicao(Token old)
        {
            SimboloInfo simbolo = semantico.tabelaSimbolo.Pesquisa(old.lexema);

            if (simbolo == null)
            {
                throw new ExceptionVariavelNaoDeclarada("", old);
            }

            Lexico();

            /*ChecaSimboloEsperado(Simbolo.S_IDENTIFICADOR);
             * Lexico();
             * ChecaSimboloInesperado(Simbolo.S_ATRIBUICAO);
             * Lexico();*/
            semantico.ReinicializaPosFixa();

            SimboloTipo tipo2 = AnalisaExpressao();

            if (!MesmoTipo(simbolo.tipo, tipo2))
            {
                throw new ExceptionTipoInvalido("", simbolo.tipo, tipo2, old);
            }

            semantico.FinalizaPosFixa();
            FinalizaExpressao();

            if (simbolo.tipo == SimboloTipo.FUNCAO_BOOLEANO || simbolo.tipo == SimboloTipo.FUNCAO_INTEIRO)
            {
                // Analisa retorno
                SimboloInfo escopo = semantico.tabelaSimbolo.PesquisaEscopo();

                if (escopo == null || escopo.tipo != SimboloTipo.FUNCAO_BOOLEANO && escopo.tipo != SimboloTipo.FUNCAO_INTEIRO)
                {
                    throw new ExceptionRetornoDeFuncaoInesperado("", old);
                }
                if (escopo.lexema != old.lexema)
                {
                    throw new ExceptionRetornoDeFuncaoInesperado("", old);
                }

                int count  = semantico.tabelaSimbolo.NumeroDeVariaveisAlocadas();
                int offset = semantico.tabelaSimbolo.NumeroDeVariaveisAlocadasNoTotal() - count;

                gerador.RETURNF(offset.ToString(), count.ToString(), "", "RETURNF da funcao " + escopo.lexema);
            }
            else
            {
                gerador.STR(simbolo.endereco.ToString(), "", "STR " + simbolo.lexema);
            }
        }
Пример #6
0
        SimboloTipo AnalisaExpressaoSimples()
        {
            if (token.simbolo == Simbolo.S_MAIS)
            {
                Lexico();
            }

            if (token.simbolo == Simbolo.S_MENOS)
            {
                semantico.ParaPosFixa(new Token(Simbolo.S_MENOS_U, "-", 0, 0));
                Lexico();
            }

            SimboloTipo tipo1 = AnalisaTermo();

            while (token.simbolo == Simbolo.S_MAIS || token.simbolo == Simbolo.S_MENOS || token.simbolo == Simbolo.S_OU)
            {
                semantico.ParaPosFixa(token);
                Token old = token;
                Lexico();
                SimboloTipo tipo2 = AnalisaTermo();

                if (old.simbolo == Simbolo.S_MAIS || old.simbolo == Simbolo.S_MENOS)
                {
                    if (!MesmoTipo(tipo1, SimboloTipo.INTEIRO))
                    {
                        throw new ExceptionTipoInvalido("", SimboloTipo.INTEIRO, tipo1, old);
                    }
                    if (!MesmoTipo(tipo2, SimboloTipo.INTEIRO))
                    {
                        throw new ExceptionTipoInvalido("", SimboloTipo.INTEIRO, tipo2, old);
                    }
                    tipo1 = SimboloTipo.INTEIRO;
                }
                else if (old.simbolo == Simbolo.S_OU)
                {
                    if (!MesmoTipo(tipo1, SimboloTipo.BOOLEANO))
                    {
                        throw new ExceptionTipoInvalido("", SimboloTipo.BOOLEANO, tipo1, old);
                    }
                    if (!MesmoTipo(tipo2, SimboloTipo.BOOLEANO))
                    {
                        throw new ExceptionTipoInvalido("", SimboloTipo.BOOLEANO, tipo2, old);
                    }
                    tipo1 = SimboloTipo.BOOLEANO;
                }
            }

            return(tipo1);
        }
Пример #7
0
        public void Insere(List <string> lexemas, SimboloTipo tipo, bool marca, int enderecoPilha = -1)
        {
            foreach (var item in lexemas)
            {
                simbolos.Add(new SimboloInfo(item, tipo, marca, enderecoPilha));

                if (enderecoPilha != -1)
                {
                    enderecoPilha++;
                }

                if (tipo == SimboloTipo.PROCEDIMENTO || tipo == SimboloTipo.PROGRAMA || tipo == SimboloTipo.FUNCAO_INTEIRO || tipo == SimboloTipo.FUNCAO_BOOLEANO)
                {
                    simbolos[simbolos.Count - 1].label = item + "_" + numeroDeProcFuncUsados;
                    numeroDeProcFuncUsados++;
                }
            }
        }
Пример #8
0
        SimboloTipo AnalisaTermo()
        {
            SimboloTipo tipo1 = AnalisaFator();

            while (token.simbolo == Simbolo.S_MULT || token.simbolo == Simbolo.S_DIV || token.simbolo == Simbolo.S_E)
            {
                semantico.ParaPosFixa(token);
                Token old = token;
                Lexico();
                SimboloTipo tipo2 = AnalisaFator();

                if (old.simbolo == Simbolo.S_MULT || old.simbolo == Simbolo.S_DIV)
                {
                    if (!MesmoTipo(tipo1, SimboloTipo.INTEIRO))
                    {
                        throw new ExceptionTipoInvalido("", SimboloTipo.INTEIRO, tipo1, old);
                    }
                    if (!MesmoTipo(tipo2, SimboloTipo.INTEIRO))
                    {
                        throw new ExceptionTipoInvalido("", SimboloTipo.INTEIRO, tipo2, old);
                    }
                    tipo1 = SimboloTipo.INTEIRO;
                }
                else if (old.simbolo == Simbolo.S_E)
                {
                    if (!MesmoTipo(tipo1, SimboloTipo.BOOLEANO))
                    {
                        throw new ExceptionTipoInvalido("", SimboloTipo.BOOLEANO, tipo1, old);
                    }
                    if (!MesmoTipo(tipo2, SimboloTipo.BOOLEANO))
                    {
                        throw new ExceptionTipoInvalido("", SimboloTipo.BOOLEANO, tipo2, old);
                    }
                    tipo1 = SimboloTipo.BOOLEANO;
                }
            }

            return(tipo1);
        }
Пример #9
0
        /*
         *  cma
         *  jmpf senao
         *  COMANDOS ENTAO
         *  JMP PULA_SENAO
         *  COMANDOS SENAO
         *  JMP PULA_SENAO
         *
         */


        void AnalisaSe()
        {
            ulong aux;
            Token old = token;

            Lexico();

            semantico.ReinicializaPosFixa();

            SimboloTipo tipo = AnalisaExpressao();

            if (!MesmoTipo(tipo, SimboloTipo.BOOLEANO))
            {
                throw new ExceptionTipoInvalido("", SimboloTipo.BOOLEANO, tipo, old);
            }

            semantico.FinalizaPosFixa();
            ChecaSimboloEsperado(Simbolo.S_ENTAO);
            FinalizaExpressao();
            gerador.JMPF("END_IF_" + contadorSe.ToString());

            Lexico();

            aux         = contadorSe;
            contadorSe += 2;

            AnalisaComandoSimples();

            if (token.simbolo == Simbolo.S_SENAO)
            {
                gerador.JMP("END_IF_" + (aux + 1).ToString());
                gerador.NULL("END_IF_" + aux.ToString());
                aux++;
                Lexico();
                AnalisaComandoSimples();
            }
            gerador.NULL("END_IF_" + aux.ToString());
        }
Пример #10
0
        SimboloTipo AnalisaFator()
        {
            semantico.ParaPosFixa(token);

            if (token.simbolo == Simbolo.S_IDENTIFICADOR)
            {
                return(AnalisaChamadaFuncao());
            }
            else if (token.simbolo == Simbolo.S_NUMERO)
            {
                Lexico();
                return(SimboloTipo.INTEIRO);
            }
            else if (token.simbolo == Simbolo.S_NAO)
            {
                Lexico();
                return(AnalisaFator());
            }
            else if (token.simbolo == Simbolo.S_ABRE_PARENTESES)
            {
                Lexico();
                SimboloTipo tipo = AnalisaExpressao();
                ChecaSimboloEsperado(Simbolo.S_FECHA_PARENTESES);
                semantico.ParaPosFixa(token);
                Lexico();
                return(tipo);
            }
            else if (token.lexema == "verdadeiro" || token.lexema == "falso")
            {
                Lexico();
                return(SimboloTipo.BOOLEANO);
            }
            else
            {
                throw new ExceptionSimboloInesperado("", token);
            }
        }
Пример #11
0
        SimboloTipo AnalisaExpressao()
        {
            SimboloTipo tipo1 = AnalisaExpressaoSimples();

            if (token.simbolo == Simbolo.S_MAIOR ||
                token.simbolo == Simbolo.S_MENOR ||
                token.simbolo == Simbolo.S_MAIOR_IG ||
                token.simbolo == Simbolo.S_MENOR_IG ||
                token.simbolo == Simbolo.S_DIF ||
                token.simbolo == Simbolo.S_IG)
            {
                semantico.ParaPosFixa(token);
                Lexico();
                SimboloTipo tipo2 = AnalisaExpressaoSimples();

                if (!MesmoTipo(tipo1, tipo2))
                {
                    throw new ExceptionTipoInvalido("", tipo1, tipo2, token);
                }
                tipo1 = SimboloTipo.BOOLEANO;
            }

            return(tipo1);
        }