예제 #1
0
        void AnalisaEscreva()
        {
            Lexico();
            ChecaSimboloEsperado(Simbolo.S_ABRE_PARENTESES);
            Lexico();
            ChecaSimboloEsperado(Simbolo.S_IDENTIFICADOR);
            SimboloInfo s = semantico.tabelaSimbolo.Pesquisa(token.lexema);

            if (!semantico.tabelaSimbolo.PesquisaVariavelInteiro(token.lexema) &&
                !semantico.tabelaSimbolo.PesquisaFuncaoInteiro(token.lexema))
            {
                if (s != null)
                {
                    throw new ExceptionTipoInvalido("", SimboloTipo.INTEIRO, s.tipo, token);
                }
                else
                {
                    throw new ExceptionVariavelNaoDeclarada("", token);
                }
            }
            if (s.tipo == SimboloTipo.FUNCAO_INTEIRO)
            {
                gerador.CALL(s.label);
            }
            else
            {
                gerador.LDV(s.endereco.ToString());
            }
            Lexico();
            ChecaSimboloEsperado(Simbolo.S_FECHA_PARENTESES);
            gerador.PRN();
            Lexico();
        }
예제 #2
0
        void AnalisaBloco()
        {
            Lexico();
            AnalisaEtapaDeclaracaoVariaveis();
            AnalisaSubRotinas();

            SimboloInfo escopo = semantico.tabelaSimbolo.PesquisaEscopo();

            string nome   = escopo.lexema;
            int    count  = semantico.tabelaSimbolo.NumeroDeVariaveisAlocadas();
            int    offset = semantico.tabelaSimbolo.NumeroDeVariaveisAlocadasNoTotal() - count;

            if (escopo != null)
            {
                if (escopo.tipo == SimboloTipo.PROGRAMA)
                {
                    if (count > 0)
                    {
                        gerador.ALLOC(offset.ToString(), count.ToString(), escopo.label, "inicio do programa " + nome);
                    }
                    else
                    {
                        gerador.NULL(escopo.label, "inicio do programa " + nome);
                    }
                }
                if (escopo.tipo == SimboloTipo.FUNCAO_BOOLEANO || escopo.tipo == SimboloTipo.FUNCAO_INTEIRO)
                {
                    GeraJmpInicial();
                    if (count > 0)
                    {
                        gerador.ALLOC(offset.ToString(), count.ToString(), escopo.label, "inicio da funcao " + nome + ":" + escopo.tipo.ToString());
                    }
                    else
                    {
                        gerador.NULL(escopo.label, "inicio da funcao " + nome + ":" + escopo.tipo.ToString());
                    }
                }
                if (escopo.tipo == SimboloTipo.PROCEDIMENTO)
                {
                    GeraJmpInicial();
                    if (count > 0)
                    {
                        gerador.ALLOC(offset.ToString(), count.ToString(), escopo.label, "inicio do procedimento " + nome + ":" + escopo.tipo.ToString());
                    }
                    else
                    {
                        gerador.NULL(escopo.label, "inicio do procedimento " + nome + ":" + escopo.tipo.ToString());
                    }
                }
            }
            AnalisaComandos();
        }
예제 #3
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);
            }
        }
예제 #4
0
        void AnalisaLeia()
        {
            Lexico();
            ChecaSimboloEsperado(Simbolo.S_ABRE_PARENTESES);
            Lexico();
            ChecaSimboloEsperado(Simbolo.S_IDENTIFICADOR);
            SimboloInfo s = semantico.tabelaSimbolo.Pesquisa(token.lexema);

            if (!semantico.tabelaSimbolo.PesquisaVariavelInteiro(token.lexema))
            {
                throw new ExceptionVariavelNaoDeclarada("", token);
            }

            Lexico();
            ChecaSimboloEsperado(Simbolo.S_FECHA_PARENTESES);
            gerador.RD();
            gerador.STR(s.endereco.ToString());
            Lexico();
        }
예제 #5
0
        SimboloTipo AnalisaChamadaFuncao()
        {
            ChecaSimboloEsperado(Simbolo.S_IDENTIFICADOR);

            SimboloInfo simbolo = semantico.tabelaSimbolo.Pesquisa(token.lexema);

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

            if (simbolo.tipo == SimboloTipo.FUNCAO_INTEIRO || simbolo.tipo == SimboloTipo.FUNCAO_BOOLEANO)
            {
                gerador.CALL(simbolo.label);
            }

            Lexico();
            return(simbolo.tipo);
        }
예제 #6
0
        void ChamadaProcedimento(Token old)
        {
            SimboloInfo simbolo = semantico.tabelaSimbolo.Pesquisa(old.lexema);

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

            if (simbolo.tipo != SimboloTipo.PROCEDIMENTO)
            {
                throw new ExceptionTipoInvalido("", SimboloTipo.PROCEDIMENTO, simbolo.tipo, old);
            }

            gerador.CALL(simbolo.label);

            //Lexico();
            //ChecaSimboloEsperado(Simbolo.S_IDENTIFICADOR);
            // Lexico();
        }
예제 #7
0
        void FinalizaExpressao()
        {
            /*string comment = "expressao: ";
             *
             * foreach (var token in semantico.posFixa)
             *  comment += token.lexema + " ";
             * gerador.NULL("", comment);*/            /* se (a + b) > (5 * x)
             *
             *                                        ab+5x*>
             *                                        ldv a
             *                                        ldv b
             *                                        add
             *                                        ldc 5
             *                                        ldv x
             *                                        muçt
             *                                        cma
             */

            foreach (var token in semantico.posFixa)
            {
                if (token.simbolo == Simbolo.S_IDENTIFICADOR)
                {
                    SimboloInfo simbolo = semantico.tabelaSimbolo.Pesquisa(token.lexema);
                    if (simbolo.tipo == SimboloTipo.INTEIRO || simbolo.tipo == SimboloTipo.BOOLEANO)
                    {
                        gerador.LDV(simbolo.endereco.ToString(), "", "LDV " + simbolo.lexema);
                    }
                }
                if (token.simbolo == Simbolo.S_NUMERO)
                {
                    gerador.LDC(token.lexema);
                }
                else if (token.simbolo == Simbolo.S_VERDADEIRO)
                {
                    gerador.LDC("1");
                }
                else if (token.simbolo == Simbolo.S_FALSO)
                {
                    gerador.LDC("0");
                }
                else if (token.simbolo == Simbolo.S_MAIOR)
                {
                    gerador.CMA();
                }
                else if (token.simbolo == Simbolo.S_MENOR)
                {
                    gerador.CME();
                }
                else if (token.simbolo == Simbolo.S_MENOR_IG)
                {
                    gerador.CMEQ();
                }
                else if (token.simbolo == Simbolo.S_MAIOR_IG)
                {
                    gerador.CMAQ();
                }
                else if (token.simbolo == Simbolo.S_IG)
                {
                    gerador.CMEQ();
                }
                else if (token.simbolo == Simbolo.S_DIF)
                {
                    gerador.CDIF();
                }
                else if (token.simbolo == Simbolo.S_E)
                {
                    gerador.AND();
                }
                else if (token.simbolo == Simbolo.S_OU)
                {
                    gerador.OR();
                }
                else if (token.simbolo == Simbolo.S_MAIS)
                {
                    gerador.ADD();
                }
                else if (token.simbolo == Simbolo.S_MENOS)
                {
                    gerador.SUB();
                }
                else if (token.simbolo == Simbolo.S_DIV)
                {
                    gerador.DIVI();
                }
                else if (token.simbolo == Simbolo.S_MULT)
                {
                    gerador.MULT();
                }
                else if (token.simbolo == Simbolo.S_NAO)
                {
                    gerador.NEG();
                }
                else if (token.simbolo == Simbolo.S_MENOS_U)
                {
                    gerador.INV();
                }
            }
        }