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; }
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; }
//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; }
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; }