Ejemplo n.º 1
0
        private void analisaDeclaracaoProcedimento()
        {
            updateToken();

            if (!hasEndedTokens && isSimbol(IDENTIFICADOR))
            {
                if (!Semantico.pesquisaDeclProcTabela(actualToken.lexem))
                {
                    Semantico.insereTabela(actualToken.lexem, NOME_PROCEDIMENTO, rotulo);
                    CodeGenerator.gera(rotulo.ToString(), NULL, EMPTY_STRING, EMPTY_STRING);
                    rotulo++;

                    Semantico.increaseLevel();
                    updateToken();

                    if (!hasEndedTokens && isSimbol(PONTO_VIRGULA))
                    {
                        analisaBloco();
                    }
                    else
                    {
                        throwError(new CompiladorException(ERRO_SINTATICO), ERRO_PV);
                    }
                }
                else
                {
                    throwError(new CompiladorException(ERRO_SEMANTICO), DECL_PROC_ERROR);
                }
            }
            else
            {
                throwError(new CompiladorException(ERRO_SINTATICO), ERRO_FALTA);
            }

            Semantico.voltaNivel();
        }
Ejemplo n.º 2
0
        private void analisaDeclaracaoFuncao()
        {
            updateToken();

            if (!hasEndedTokens && isSimbol(IDENTIFICADOR))
            {
                actualFunctionName.Push(actualToken.lexem);

                if (!Semantico.pesquisaDeclFuncTabela(actualToken.lexem))
                {
                    Semantico.insereTabela(actualToken.lexem, NOME_FUNCAO, rotulo);
                    CodeGenerator.gera(rotulo.ToString(), NULL, EMPTY_STRING, EMPTY_STRING);
                    rotulo++;

                    Semantico.increaseLevel();
                    functionLine.Push(actualToken.line);
                    updateToken();

                    if (!hasEndedTokens && isSimbol(DOIS_PONTOS))
                    {
                        updateToken();

                        if (!hasEndedTokens && (isSimbol(INTEIRO) || isSimbol(BOOLEANO)))
                        {
                            string type = isSimbol(INTEIRO) ? TIPO_INTEIRO : TIPO_BOOLEANO;
                            Semantico.colocaTipoTabela(type);
                            updateToken();

                            if (!hasEndedTokens && isSimbol(PONTO_VIRGULA))
                            {
                                functionReturnsExpected++;
                                analisaBloco();
                                functionReturnsExpected--;

                                if (!returnMade)
                                {
                                    throwError(new CompiladorException(ERRO_SEMANTICO, new CompiladorException(actualFunctionName.Peek())), returnsMade > 0 ? FUNCTION_LAST_LINE_NOT_RETURN : EXPECTED_FUNCTION_RETURN, functionLine.Peek());
                                }

                                actualFunctionName.Pop();
                                functionLine.Pop();
                            }
                        }
                        else
                        {
                            throwError(new CompiladorException(ERRO_SINTATICO), ERRO_TIPO);
                        }
                    }
                    else
                    {
                        throwError(new CompiladorException(ERRO_SINTATICO), ERRO_FALTA);
                    }
                }
                else
                {
                    throwError(new CompiladorException(ERRO_SEMANTICO), DECL_FUNC_ERROR);
                }
            }
            else
            {
                throwError(new CompiladorException(ERRO_SINTATICO), ERRO_NOME);
            }

            Semantico.voltaNivel();
        }