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(); }
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(); }