コード例 #1
0
ファイル: symbol.cpp プロジェクト: BigEd/Cores
SYM *insert_symbol(SYM *sym)
{
    SYM *p;

    if (!(p=(SYM *)htInsert(&HashInfo, sym)))
       printf("failed to insert symbol\r\n");
    if (p)
       p->ord = p-(SYM *)(HashInfo.table);
    return p;
}
コード例 #2
0
ファイル: frame.c プロジェクト: adamVass/IFJ
tChyba copyTable( TFunction *source )
{
	TItem *tmp;
	int ret;
	for (int i = 0; i < MAX_HTSIZE; ++i){
		tmp = (*(source->table))[i];
		if( tmp ){
			//dmnce karlova
			if( tmp->druh == ID_FUNCTION ){
				ret = htInsert( ptrhtLocal, tmp->key, copyData( tmp->druh, tmp->data), tmp->type, tmp->druh );
			}
			else if( tmp->druh == ID_PARAM ){
				ret = htInsert( ptrhtLocal, tmp->key, NULL, tmp->type, tmp->druh );
			}
			else ret = htInsert( ptrhtLocal, tmp->key, copyData( tmp->type, tmp->data), tmp->type, tmp->druh );

			if(ret != S_BEZ_CHYB) {
				return ret;
			}
			//ret = htCompleteInsert(ptrhtLocal, tmp->key, tmp->druh, tmp->type, tmp->init);
			//if(ret != S_BEZ_CHYB) {
			//	return ret;
			//}
		}
	}
	//zkopiruje cely list instrukci
	ret = CopyList( &(source->instrList) );
	if(ret != S_BEZ_CHYB) {
		return ret;
	}
	//ustanoveni dat
	tItemPtr ptr = listIntrukci->First;
	while(ptr){
		TItem *item;
		if( ptr->instruction.instructionType == OC_COLL ){
			ptr->instruction.instructionType = OC_CALL;
			//nastaveni navratovky
			item = (TItem*)ptr->instruction.address1;
			ptr->instruction.address3 = htSearch( ptrhtLocal, item->key );
		}
		else if( ptr->instruction.instructionType == OC_NEPRIRAZENI ){
			ptr->instruction.instructionType = OC_PRIRAZENI;
			//navratovka je zdroj
			ptr->instruction.address1 = item;
			//htSearch( ptrhtLastLocal, id )
			//dodelat nalezeni cile ulozeni
		}
		else{
			if( ptr->instruction.address1 ){
				TItem *tmp1 = (TItem*)ptr->instruction.address1;
				//write
				if( tmp1->druh != PRINTSTR ){
					ptr->instruction.address1 = htSearch( ptrhtLocal, tmp1->key );
				}
			}
			if( ptr->instruction.address2 ){
	        	TItem *tmp2 = (TItem*)ptr->instruction.address2;
				ptr->instruction.address2 = htSearch( ptrhtLocal, tmp2->key );
			}
			if( ptr->instruction.address3 ){
	        	TItem *tmp3 = (TItem*)ptr->instruction.address3;
				ptr->instruction.address3 = htSearch( ptrhtLocal, tmp3->key );
			}
		}
		ptr = ptr->nextItem;
	}
	return S_BEZ_CHYB;
}
コード例 #3
0
ファイル: syntakticka_analyza.c プロジェクト: adamVass/IFJ
//funkce na vkladani parametru
tChyba PARAMS() {
	int analyza;
	//PARAMS->( id : DTYPE PARAMS
	if(token.stav == s_leva_zavorka) {
		token = getNextToken();
		if(token.stav == s_lex_error) {
			return S_LEXIKALNI_CHYBA;
		}

		else if(token.stav == s_identifikator) {
			if((params = malloc(strlen(token.data)+1)) == NULL) {
				return S_INTERNI_CHYBA;
			}
			//do globalni promenne params nacteme id parametru funkce
			strcpy(params, token.data);			
		
			token = getNextToken();
			if(token.stav == s_lex_error) {
				return S_LEXIKALNI_CHYBA;
			}

			if(token.stav == s_dvojtecka) {
				token = getNextToken();
				if(token.stav == s_lex_error) {
					return S_LEXIKALNI_CHYBA;
				}

				analyza = DTYPE();
				if(analyza != S_BEZ_CHYB) {
					return analyza;
				}

				if(!strcmp(token.data, "integer")) {
					dtype = TYPEINT;
				}
				else if(!strcmp(token.data, "real")) {
					dtype = TYPEDOUBLE;
				}
				else if(!strcmp(token.data, "string")) {
					dtype = TYPESTR;
				}
				else if(!strcmp(token.data, "boolean")) {
					dtype = TYPEBOOL;
				}
				//vlozeni do pole parametru
				htParamInsert(ptrhtGlobal,funkce, params, dtype);
				//vlozeni parametru do lokalni hash
				htInsert(func[currFuncSize].table, params, NULL, dtype, ID_PARAM);			
				free(params);
				
				token = getNextToken();
				if(token.stav == s_lex_error) {
					return S_LEXIKALNI_CHYBA;
				}
				//rekurzivni volani
		        return PARAMS();
			}
			return S_SYNTAKTICKA_CHYBA;
		}
	}//PARAMS->; id : DTYPE PARAMS	
	else if(token.stav == s_strednik) {
		token = getNextToken();
		if(token.stav == s_lex_error) {
			return S_LEXIKALNI_CHYBA;
		}
		
		if(token.stav == s_identifikator) {
			
			if((params = malloc(strlen(token.data)+1)) == NULL) {
				return S_INTERNI_CHYBA;
			}
			//vlozeni klice do globalni promenne
			strcpy(params, token.data);
			token = getNextToken();
			if(token.stav == s_lex_error) {
				return S_LEXIKALNI_CHYBA;
			}

			else if(token.stav == s_dvojtecka) {
				token = getNextToken();
				if(token.stav == s_lex_error) {
					return S_LEXIKALNI_CHYBA;
				}
				
				analyza = DTYPE();
				if(analyza != S_BEZ_CHYB) {
					return analyza;
				}
				
				if(!strcmp(token.data, "integer")) {
				dtype = TYPEINT;
				}
				else if(!strcmp(token.data, "string")) {
					dtype = TYPESTR;
				}
				else if(!strcmp(token.data, "real")) {
					dtype = TYPEDOUBLE;
				}
				else if(!strcmp(token.data, "boolean")){
					dtype = TYPEBOOL;
				}
				//vlozeni do globalni, do pole parametru funkce	
				htParamInsert(ptrhtGlobal,funkce, params, dtype);
				htInsert(func[currFuncSize].table, params, NULL, dtype, ID_PARAM);
				free(params);
				token = getNextToken();
				if(token.stav == s_lex_error) {
					return S_LEXIKALNI_CHYBA;
				}	
				return PARAMS();
			}
		}
		return S_SYNTAKTICKA_CHYBA;
	}
	else if(token.stav == s_prava_zavorka) {
		token = getNextToken();
		if(token.stav == s_lex_error) {
			return S_LEXIKALNI_CHYBA;
		}

		return S_BEZ_CHYB;
	}
	return S_SYNTAKTICKA_CHYBA;
}
コード例 #4
0
ファイル: syntakticka_analyza.c プロジェクト: adamVass/IFJ
tChyba FUNKCE() {
	int analyza;
	//opet lokalni promenna, stejna funkce jako ve funkci nahore
	TItem *nasel;
	// FUNKCE-> begin ACT_LIST
	if(!strcmp(token.data, "begin") && token.stav == s_klicove) {
		token = getNextToken();			//pres strcmp porovnavam data tokenu (prakticky primo to, co se nacte)
		if(token.stav == s_lex_error) {
			return S_LEXIKALNI_CHYBA;
		}
		//po zavolani funkce se getToken nevola, protoze kazda funkce, nez vrati hodnotu, nacte dalsi token
		analyza = ACT_LIST();			
		if(analyza != S_BEZ_CHYB) {
			return analyza;
		}
		return S_BEZ_CHYB;
	}
	//FUNKCE->function id PARAMS : DTYPE ; DOPREDNE ; FUNKCE
	else if(!strcmp(token.data, "function") && token.stav == s_klicove) {
		//pamatujeme si, ze jsme v definici funkce
		byla_funkce = true;				
		token = getNextToken();
		if(token.stav == s_lex_error) {
			return S_LEXIKALNI_CHYBA;
		}

		if(token.stav == s_identifikator) {	
			//pokud id ma nazev stejny jako tyto 2 funkce, jedna se o chybu
			if(!strcmp(token.data, "length") || !strcmp(token.data, "copy")) {
				return S_SEMANTICKA_CHYBA_NEDEF;
			}

			if((funkce = malloc(strlen(token.data)+1)) == NULL) {	
				return S_INTERNI_CHYBA;
			}
			//nulovani poctu parametru funkce
			TData *dat = (TData*)malloc(sizeof(TData));
			dat->param.numParam = 0;
			
			strcpy(funkce, token.data);
			//pokud id funkce j*z je v globalni hash tabulce a nejedna se o doprednou deklaraci -> chyba
			nasel = htSearch(ptrhtGlobal,funkce);		
			if(nasel != NULL ) {
				if(nasel->init == true) {
					return S_SEMANTICKA_CHYBA_NEDEF;
				}
				nasel->init = true;
			}
			//vlozeni nazvu funkce do globalni hash
			htInsert(ptrhtGlobal,funkce,dat, TYPEUNDEF , ID_FUNCTION);		

			token = getNextToken();
			if(token.stav == s_lex_error) {
			return S_LEXIKALNI_CHYBA;
			}
			//funkce na kontrolu a ukladani parametru funkce
			analyza = PARAMS();
			if(analyza != S_BEZ_CHYB) {
				return analyza;
			}
				
			else if(token.stav == s_dvojtecka) {
				token = getNextToken();
				if(token.stav == s_lex_error) {
					return S_LEXIKALNI_CHYBA;
				}
				//funkce na kontrolu datovych typu	
				analyza = DTYPE();
				if(analyza != S_BEZ_CHYB) {
					return analyza;
				}
										
				if(!strcmp(token.data, "integer")) {
					dtype = TYPEINT;
				}
				else if(!strcmp(token.data, "real")) {				//do docasne promene nacteme datovy typ funkce
					dtype = TYPEDOUBLE;
				}
				else if(!strcmp(token.data, "string")) {
					dtype = TYPESTR;
				}
				else if(!strcmp(token.data, "boolean")) {
					dtype = TYPEBOOL;
				}
					
				token = getNextToken();
				if(token.stav == s_lex_error) {
					return S_LEXIKALNI_CHYBA;
				}
	
				else if(token.stav == s_strednik) {
					token = getNextToken();
					if(token.stav == s_lex_error) {
						return S_LEXIKALNI_CHYBA;
					}
					//zjisteni, zda se jedna o doprednou deklaraci funkces
					analyza = DOPREDNE();
					if(analyza != S_BEZ_CHYB) {
						return analyza;
					}
					//pokud neni dopredna, vkladame do globalni hash tabulky a zaroven i do lokalni hash tabulky
					if(init == true) {
						htCompleteInsert(ptrhtGlobal,funkce, ID_FUNCTION, dtype, true);				
						htInsert(func[currFuncSize-1].table, funkce, dat, dtype, ID_FUNCTION);
							
					}//pokud se jedna o doprednou deklaraci, ukladame jen do globalky hlavicku funkce																			
					else if (init == false) {
						htCompleteInsert(ptrhtGlobal,funkce, ID_FUNCTION, dtype, false);	
						

							//vlozeni navratove hodnoty do lokalni tabulky
					}
						
					if(token.stav == s_strednik) {
							
						token = getNextToken();
						if(token.stav == s_lex_error) {
							return S_LEXIKALNI_CHYBA;
						}
						else {
							//nastaveni ukazatele lokalni tabulky na vrchol zasobniku
							ptrhtLocal = ptrStack->top->ptrht;
							listIntrukci = &(ptrStack->top->field);
							// nastaveni tabulky instrukci v mainu
							byla_funkce = false;
							//rekurzivni volani 
							return FUNKCE();
						}								
					}
				}
			}
		}
		//pokud se nacte token, ktery podle pravidla tam nepatri, vrati se syntakticka chyba
		return S_SYNTAKTICKA_CHYBA;		
	}
	//FUNKCE->var DEKLARACE FUNKCE
	else if(!strcmp(token.data, "var") && token.stav == s_klicove) {
		token = getNextToken();
		if(token.stav == s_lex_error) {
			return S_LEXIKALNI_CHYBA;
		}
		//volani funkce na kontrolu a ukladani globalnich id
		analyza = DEKLARACE();
		if(analyza != S_BEZ_CHYB) {
			return analyza;
		}
		return FUNKCE();
	}
	return S_SYNTAKTICKA_CHYBA;
}