public static void PROVJERI_definicija_funkcije(){
		String linija = mParser.ParsirajNovuLiniju(); // ucitaj <ime_tipa>
		Tip_Const ime_tipa = Izrazi_Sem.PROVJERI_ime_tipa();
		Boolean writeToOutputEnabledWasTrue = Utilities_Sem.mWriteToOutputEnabled;
		Boolean bezGreskeZasad = true;
		if (ime_tipa.mTip != Tip._void && ime_tipa.mTip != Tip._int && ime_tipa.mTip != Tip._char){
			Utilities_Sem.mWriteToOutputEnabled = false;
			bezGreskeZasad = false;
		}
		
		linija = mParser.ParsirajNovuLiniju(); // ucitaj IDN
		UniformniZnak uz_idn = UniformniZnak.SigurnoStvaranje(linija);
		ClanTabliceZnakova clTablice = mSTZ.DohvatiClanIzTabliceZnakova(uz_idn.mLeksickaJedinka);
		if (clTablice != null && clTablice.mDefinirano == true){
			Utilities_Sem.mWriteToOutputEnabled = false;
			bezGreskeZasad = false;
		}
		
		linija = mParser.ParsirajNovuLiniju(); // ucitaj L_ZAGRADA
		UniformniZnak uz_l_zagrada = UniformniZnak.SigurnoStvaranje(linija);
		linija = mParser.ParsirajNovuLiniju();
		
		// <<<<<<<<<<<<   funkcija koja nije f(void), vec prima parametre   >>>>>>>>>>>>
		if (linija.equals("<lista_parametara>")){ 
			List<Tip_LIzraz_Const_Niz_Ime> lista_parametara = PROVJERI_lista_parametara();
			
			if (clTablice != null){
				if (clTablice.mDefinirano) bezGreskeZasad = false;
				if ((clTablice.mTipFunkcija.mPov != ime_tipa.mTip)) bezGreskeZasad = false;
				if (lista_parametara.size() != clTablice.mTipFunkcija.mParam.size()) bezGreskeZasad = false;
				else {
					for (int i = 0; i < lista_parametara.size(); ++i)
						if (lista_parametara.get(i).mT.mTip != clTablice.mTipFunkcija.mParam.get(i).mTip ||
								lista_parametara.get(i).mT.mNiz != clTablice.mTipFunkcija.mParam.get(i).mNiz ||
								lista_parametara.get(i).mT.mConst != clTablice.mTipFunkcija.mParam.get(i).mConst ||
								lista_parametara.get(i).mT.mNiz){
							bezGreskeZasad = false;
							break;
						}
				}
			}
			linija = mParser.ParsirajNovuLiniju(); // ucitaj D_ZAGRADA
			UniformniZnak uz_d_zagrada = UniformniZnak.SigurnoStvaranje(linija);
			if (writeToOutputEnabledWasTrue) Utilities_Sem.mWriteToOutputEnabled = true;
			if (!bezGreskeZasad){
				String greska = "<definicija_funkcije> ::= <ime_tipa> " + uz_idn.FormatZaIspis() + " " + uz_l_zagrada.FormatZaIspis() +
						" <lista_parametara> " + uz_d_zagrada.FormatZaIspis() + " <slozena_naredba>";
				Utilities_Sem.WriteStringLineToOutputAndExit(greska);
			}
			// definiraj funkciju
			ClanTabliceZnakova clTab = new ClanTabliceZnakova();
			clTab.mTip = Tip._funkcija;
			clTab.mConst = false;
			clTab.mL_izraz = false;
			clTab.mNiz = false;
			clTab.mDefinirano = true;
			clTab.mTipFunkcija = new TipFunkcija();
			clTab.mTipFunkcija.mPov = ime_tipa.mTip;
			for (int i = 0; i < lista_parametara.size(); ++i){
				Tip_Const_Niz tcn = new Tip_Const_Niz();
				tcn.mTip = lista_parametara.get(i).mT.mTip;
				tcn.mConst = lista_parametara.get(i).mT.mConst;
				tcn.mNiz = lista_parametara.get(i).mT.mNiz;
				clTab.mTipFunkcija.mParam.add(tcn);
			}
			mSTZ.DodajClanUTablicuZnakova(uz_idn.mLeksickaJedinka, clTab);
			mSTZ.UpravoDefiniranaFunkcija(uz_idn.mLeksickaJedinka, clTab);
			
			// ulazak u funkciju i deklaracija parametara u novom cvoru STZ
			mSTZ.UdjiUNoviCvor(clTab);
			for (int i = 0; i < lista_parametara.size(); ++i){
				ClanTabliceZnakova clTabPara = new ClanTabliceZnakova();
				clTabPara.mTip = lista_parametara.get(i).mT.mTip;
				clTabPara.mConst = lista_parametara.get(i).mT.mConst;
				clTabPara.mL_izraz = lista_parametara.get(i).mT.mL_izraz;
				clTabPara.mNiz = lista_parametara.get(i).mT.mNiz;
				clTabPara.mDefinirano = true;
				clTabPara.mTipFunkcija = null;
				mSTZ.DodajClanUTablicuZnakova(lista_parametara.get(i).mIme, clTabPara);
			}
			linija = mParser.ParsirajNovuLiniju(); // ucitaj <slozena_naredba>
			NaredbenaStrukturaPrograma_Sem.PROVJERI_slozena_naredba();
			mSTZ.IzadjiIzCvora();
			return;
		}
		
		// <<<<<<<<<<<<   funkcija koja ne prima parametre   >>>>>>>>>>>>
		UniformniZnak uz_void = UniformniZnak.SigurnoStvaranje(linija);
		if (uz_void.mNaziv.equals("KR_VOID")){ 
			if (clTablice != null && clTablice.mTip == Tip._funkcija){
				if ((clTablice.mTipFunkcija.mPov) != ime_tipa.mTip) bezGreskeZasad = false;
				if (clTablice.mTipFunkcija.mParam.size() != 0) bezGreskeZasad = false;
			}
			linija = mParser.ParsirajNovuLiniju(); // ucitaj D_ZAGRADA
			UniformniZnak uz_d_zagrada = UniformniZnak.SigurnoStvaranje(linija);
			if (writeToOutputEnabledWasTrue) Utilities_Sem.mWriteToOutputEnabled = true;
			if (!bezGreskeZasad){
				String greska = "<definicija_funkcije> ::= <ime_tipa> " + uz_idn.FormatZaIspis() + " " + uz_l_zagrada.FormatZaIspis() +
						" " + uz_void.FormatZaIspis() + " " + uz_d_zagrada.FormatZaIspis() + " <slozena_naredba>";
				Utilities_Sem.WriteStringLineToOutputAndExit(greska);
			}
			// definiraj funkciju
			ClanTabliceZnakova clTab = new ClanTabliceZnakova();
			clTab.mTip = Tip._funkcija;
			clTab.mConst = false;
			clTab.mL_izraz = false;
			clTab.mNiz = false;
			clTab.mDefinirano = true;
			clTab.mTipFunkcija = new TipFunkcija();
			clTab.mTipFunkcija.mPov = ime_tipa.mTip;
			// clTab.mTipFunkcija.mParam ostavim na 0
			mSTZ.DodajClanUTablicuZnakova(uz_idn.mLeksickaJedinka, clTab);
			mSTZ.UpravoDefiniranaFunkcija(uz_idn.mLeksickaJedinka, clTab);
			
			// ulazak u funkciju
			mSTZ.UdjiUNoviCvor(clTab);
			linija = mParser.ParsirajNovuLiniju(); // ucitaj <slozena_naredba>
			NaredbenaStrukturaPrograma_Sem.PROVJERI_slozena_naredba();
			mSTZ.IzadjiIzCvora();
			return;
		}
	}