Exemplo n.º 1
0
//lookup
Table_Entry 
bvs_lookup ( bvs_ptr tree, string  * name )
{

  node_ptr ptr = tree->root; //pomocny ukazatel
  
  while ( ptr != NULL )
  {
    if (  strCmpString(name, ptr->data.id_name) < 0 )
      ptr=ptr->left;
    else
    if (  strCmpString(name, ptr->data.id_name) > 0 )
      ptr=ptr->right;
    else
      return &(ptr->data);
  }
  return NULL;
}
Exemplo n.º 2
0
int main() {
	//obsah souboru nas zajimat nebude
	FILE* f = fopen("test-1.txt", "r");
	tToken t;
	
	
	printDescription("Do fronty tlacim bool = true");
	t = malloc(sizeof(struct stToken));
	t->typ = TYPE_BOOL;
	t->value.boolVal = true;
	ungetToken(&t);

	printDescription("Zkusim zavolat scanner ocekavam bool = true");
	getToken(&t, f);
	if (t->typ == TYPE_BOOL && t->value.boolVal) {
		printDescription("TEST OK");
	}
	else {
		printDescription("TEST FAILED");
	}
	freeTokenMem(t);
	printDescription("Od ted testuji jen pomoci fce void TQDequeue(tToken*);");
	printDescription("protoze jestli se vola skrz scanner j*z vime");

	printDescription("Do fronty tlacim int = 42");
	t = malloc(sizeof(struct stToken));
	t->typ = TYPE_INTEGER;
	t->value.intVal = 42;
	ungetToken(&t);
	printDescription("Do fronty tlacim KEYW_RETURN");
	t = malloc(sizeof(struct stToken));
	t->typ = KEYW_RETURN;
	ungetToken(&t);

	printDescription("Ocekavam int = 42 fronta by nemela byt deinicializovana");
	TQDequeue(&t);
	if (t->typ == TYPE_INTEGER && t->value.intVal == 42 && TQueue) {
		printDescription("TEST OK");
	}
	else {
		printDescription("TEST FAILED");
	}
	freeTokenMem(t);

	printDescription("Ocekavam return keyword fronta by mela byt deinicializovana");
	TQDequeue(&t);
	if (t->typ == KEYW_RETURN && !TQueue) {
		printDescription("TEST OK");
	}
	else {
		printDescription("TEST FAILED");
	}
	freeTokenMem(t);

	printDescription("Do fronty tlacim string = 'HuaHuaString'");
	t = malloc(sizeof(struct stToken));
	t->typ = TYPE_STRING;
	strInit(&t->value.stringVal);
	strConConstString(&t->value.stringVal, "HuaHuaString");
	ungetToken(&t);



	printDescription("Ocekavam string = 'HuaHuaString' fronta by mela byt deinicializovana");
	string s;
	strInit(&s);
	strConConstString(&s, "HuaHuaString");


	TQDequeue(&t);
	if (t->typ == TYPE_STRING && !strCmpString(&t->value.stringVal, &s) && !TQueue) {
		printDescription("TEST OK");
	}
	else {
		printDescription("TEST FAILED");
	}
	strFree(&s);
	freeTokenMem(t);

	printDescription("Zavolam void freeTokenMem(tToken); nad NULL");
	printDescription("Nemela by nastat chyba");
	printDescription("Test zrusen je to blbost");
	//freeTokenMem(t);
	printDescription("Mam deinicializovanou frontu zkusim z ni neco vytahnout");
	printDescription("behem programu nebude volano, ale pro jistotu");
	TQDequeue(&t);
	if (!TQueue/* && !t*/) {
		printDescription("TEST OK");
	}
	else {
		printDescription("TEST FAILED");
	}
	//freeTokenMem(t);//pro jistotu




	getchar();
	fclose(f);
	return 0;
}
Exemplo n.º 3
0
int LokTableInsert(tGlobSymbolTable *T, string *nazev, int typ,Tridic *ridic){/*vlození noveho uzlu do lok table*/
    sLokTableItem *novy;
    sLokTableItem *pomloka;
    int koren=0;
    if ((novy = (sLokTableItem*) malloc(sizeof(sLokTableItem)))==NULL) error(T,OTHER_RUNN_ERR,ridic);/*alokace mista na novy lokalni prvek*/
    ridic->aktiv=novy;/*nastaveni aktivity na novy prvek*/
    novy->data.def=1;/*plneni prvku*/
    strInit(&(novy->data.nazev));
    novy->data.typ=typ;
    novy->lptr=NULL;
    novy->rptr=NULL;

    if ( ridic->pomlog || ridic->deklaration){/*pokud se jedna o hlavicku fce*/
            ridic->pocet_argumentu++;
            novy->data.def=1;/*argument je inicialyzovany*/
            novy->poradi_argumentu=ridic->pocet_argumentu;/*poradí argumentu*/
    }else {
        novy->data.def=0;/*lokalni promenna neni inicializovana*/
        novy->poradi_argumentu=0;/*nejedna se o argument funkce*/
    }
     if (nazev!=NULL){/*pokud se  nejedna o  navratovy typ*/
        strCopyString((&novy->data.nazev), nazev);/*naplnim nazev*/
    }else {
        strCopyString((&novy->data.nazev), &(ridic->nazev_func));/*jinak ziskam nazev z globalni tabulky z aktualniho prvku*/
         novy->data.def=3;
    }
       sGlobTableItem *pomgl;
         koren=0;
        pomgl = T->first;/*nastavime koren stromu*/
        koren= tableSearchGlob(ridic,&pomgl,&(novy->data.nazev));/*prohledame glob tabulku kvuli shodnym nazvum fci*/
         if (koren==0 && nazev!=NULL){/*pokud byl prvek nalezen a lok promenna neni navratovy typ*/
            if (pomgl->data.typ==FUNCTION_HEADER){/*pokud byla nalezena glob uzel ktery je funkce*/
                ItemFreeAktu(NULL, novy);/*uvolni pridavany prvek*/
                error(T,TAB_ERR,ridic);/*chyba v ramci tabulky*/
            }
        }
    if (ridic->deklaration>0){/*pokud jsme v hlavicce funkce*/
        sLokTableItem *poml;
        sGlobTableItem *pomgl;
        pomgl = ridic->aktivG;/*jako pomocný glob uzel nastavime aktivni glob uzel*/
        poml=pomgl->link;/*jako pomocnou lok. tabulku nastavime odkaz z aktivniho glob  uzlu*/
        koren=0;
        koren=tableSearchLok(ridic,&poml,&(novy->data.nazev));
        if (koren){
            ItemFreeAktu(NULL, novy);/*uvolnime pridávany prvek*/
            error(T,TAB_ERR,ridic);/*chyba v ramci tabulky*/
        }

        ridic->deklaration++;/*kontrola poctu argumentu*/
        if (ridic->deklaration==strGetLength(&(pomgl->arg))+1) {ridic->deklaration=0;}/*pocet prvku deklrovane a definovane funkce je jiny*/
        if (poml->data.typ==typ){/*pokud sedi typ argumentu deklarovane a definovane funkce*/
            if (poml->poradi_argumentu==novy->poradi_argumentu){/*pokud je na stejnem miste*/
                if (nazev!=NULL){/*pokud se nejedna o navratovy parametr*/
                    if ((strCmpString(&(poml->data.nazev), nazev)==0)) {/*pokud sedi nazvy*/
                        ItemFreeAktu(NULL, novy);/*uvolnime vkladany argument*/
                        return 1;/*agrumnet je totozny*/
                    }else {

                        ItemFreeAktu(NULL, novy);/*uvolnime vkladany argument*/
                        error(T,TAB_ERR,ridic);/*error v ramci tabulky*/
                    }
                }else{/*pokud se jedna o navratovy parametr*/
                    if (ridic->deklaration==strGetLength(&(ridic->aktivG->arg))) {/*pokud neni stejny pocet argumentu*/

                        ItemFreeAktu(NULL, novy);/*uvolnime vkladany argument*/
                        error(T,TAB_ERR,ridic);/*error v ramci tabulky*/
                    }
                    ridic->aktivG=pomgl;/*uvolnime vkládaný argument*/
                    ItemFreeAktu(NULL,novy);/*error v ramci tabulky*/
                    return 1;/*agrumnet je totozny*/
                }
            }else {/*nejedna se o stejny typ*/
                ItemFreeAktu(NULL, novy);/*uvolníme vkladany argument*/
                error(T,TAB_ERR,ridic);/*error v ramci tabulky*/
            }
        }
    }
    else{/*pokud pridavame lokalni promennou*/

     if (ridic->aktivG->link==NULL){/*pokud je strom prazdny*/
            ridic->aktivG->link=novy;/*pridame jako koren*/
    }else{
        pomloka=ridic->aktivG->link;
        koren=0;
        koren=tableSearchLok(ridic,&pomloka,&(novy->data.nazev));
        if (koren==0){/*pokud j*z prvek se stejnym klicem  existuje*/
                ItemFreeAktu(NULL, novy);/*uvolnime vkladany argument*/
                error(T,TAB_ERR,ridic);/*error v ramci tabulky*/

        }
        if (koren==1){/*pridame do leveho podstromu*/
            pomloka->lptr=novy;
        }else if (koren==2) {pomloka->rptr=novy;}/*pridáme do praveho podstromu*/
    }

    if ( (ridic->pomlog ) || (nazev==NULL) ){/*pokud jsme v hlavicce funkce*/


        switch(typ){/*pridame typ argumnetu do glob tabulky*/
            case TP_INT:
                if (strAddChar(&(ridic->aktivG->arg),'i'));
            break;
            case TP_REAL:
                if (strAddChar(&(ridic->aktivG->arg),'r'));
            break;
            case TP_STRING:
                if (strAddChar(&(ridic->aktivG->arg),'s'));
            break;
            case BOOLEAN:
                if (strAddChar(&(ridic->aktivG->arg),'b'));
            break;

        }

    }
    if (nazev==NULL)  {/*pokud uz byl predan i navratovy typ*/

            ridic->pocet_argumentu=0; /*nasleduji lok promenne*/
            ridic->pomlog=0;/*nejsme j*z v hlavicce funkce*/
    }
    return 1;
    }
    return 0;
}
Exemplo n.º 4
0
Table_Entry
bvs_insert ( bvs_ptr tree, string *name )
{

  node_ptr back_ptr; //ukazatel na predchadzajuci prvok /otca
  node_ptr ptr;   //pomocny ukazatel
  bool iter_end;       //flag konca

  if (tree->root == NULL) //vytvorenie korena ak neexistuje
  {
    ptr = create_node( name );
    if (ptr == NULL)
      return NULL;
      
    ptr -> left = NULL;
    ptr -> right = NULL; 
    
    tree->root = ptr;
     
  } else
  {
    //pred vkladanim lokalizujeme
    iter_end = false;
    back_ptr = NULL;
    ptr = tree->root;
    do
    {
      back_ptr = ptr;
      if (  strCmpString(name, ptr->data.id_name) < 0 )
      {
        ptr=back_ptr->left;
      } else
      if (strCmpString(name, ptr->data.id_name ) > 0)
      {
        ptr=back_ptr->right;
      } else
      {
        iter_end = true;  //nasli sme
      }
    
    } while (iter_end!=true && (ptr!=NULL));
    
    if ( iter_end == false)  //ak sa nenaslo pridame
    {
      ptr = create_node( name );
      
      ptr -> left = NULL;
      ptr -> right = NULL; 
      
      if ( strCmpString(name, back_ptr->data.id_name) < 0)
        back_ptr->left = ptr;
      else
        back_ptr->right = ptr;  
      
    } else
      return NULL; //ak tam uz existuje vrat null;
  
  }

  return &(ptr->data);

}