Ejemplo n.º 1
0
int globalDecl() { //za decl nebrat token
		if ((error = testToken(T_ID)) != E_OK) return error; //ID
		if(BSTSearch(TempTree, T.s) != NULL){
			return E_SEMA;
		}
		strInit(&IDstr);
		strCopystring(&IDstr, &T.s);
		gettoken();
		if ((error = testToken(T_COLON)) != E_OK) return error;
		    gettoken();
		if ((error = testToken(T_DATATYPE)) != E_OK) return error;

/******************************************INSERT***************************************************************/

		if(!(strCmpConstStr(&(T.s), "boolean"))) TempVar->type = O_BOOL;
		if(!(strCmpConstStr(&(T.s), "integer"))) TempVar->type = O_INT;		
		if(!(strCmpConstStr(&(T.s), "real")))    TempVar->type = O_REAL;
		if(!(strCmpConstStr(&(T.s), "string"))){
			TempVar->type = O_STRING;
			strInit(&TempVar->value.sval);
		}
		BSTInsert (&TempTree, IDstr, TempVar); 
		
/******************************************INSERT***************************************************************/

		gettoken();
		if ((error = testToken(T_SEMICOLON)) != E_OK) return error; // ";"
		gettoken();
		//strFree(&IDstr);
		if (testToken(T_ID) == E_OK)
		    if ((error = globalDecl()) != E_OK) return error;	//dalsia promena?
		return E_OK;
}
Ejemplo n.º 2
0
void GlobItemInsert(tGlobSymbolTable *T,string *nazev, int typ,Tridic *ridic, sGlobTableItem **novy){
    int koren=0;
    if (((*novy) = (sGlobTableItem*) malloc(sizeof(sGlobTableItem)))==NULL) error(T,OTHER_RUNN_ERR,ridic);/*alokovani mista pro novy globálni uzel*/
    sGlobTableItem *pomglob;
    strInit(&((*novy)->data.nazev));/*plneni uzlu*/
    strCopyString(&((*novy)->data.nazev), nazev);
    (*novy)->data.typ = typ;
    (*novy)->lptr=NULL;
    (*novy)->rptr=NULL;
    (*novy)->data.def=1;
    strInit(&((*novy)->arg));
    //strInit(&((*novy)->hodnota->stringh));
    ridic->aktivG=(*novy);
    ridic->aktivG->link=NULL;
    if (T->first==NULL){/*pokud je strom prazdny*/
        T->first=(*novy);/*pridame novy uzel na vrchol stromu*/
     }else{
        pomglob=T->first;/*nastavime pomocny ukazatel na vrchol stromu*/
        koren=tableSearchGlob(ridic,&pomglob,&((*novy)->data.nazev));/*projdeme strom*/
     }
      if (koren==1){
            pomglob->lptr=(*novy);/*uzel vlozime nalevo*/
        }else if (koren==2) {
            pomglob->rptr=(*novy);/*uzel vlozime napravo*/
        }
}
Ejemplo n.º 3
0
void PridatPom(sRamec *ramec, string *nazev, int typ, double cisloh, string *stringh){
    int koren=0;
    sRamec *novy;
    while (!koren){/*dokud nezjistime kam podle nazvu novou pomocnou zaradit, tak cyklime*/
        if( key(nazev, &ramec->nazev) == 2) {/*rozhodne, zda mame jit do praveho podstromu*/
            if(ramec->rptr != NULL) ramec = ramec->rptr;/*kdyz neni pravy podstrom prazdny, tak opakujeme dalsi cyklus pro novy ramec*/
            else {
                if((novy = (sRamec*) malloc(sizeof(sRamec)))==NULL) error(NULL,OTHER_RUNN_ERR,NULL);/*kdyz je pravy podstrom prazdny, tak malokujeme novy prvek a nastavime pravy ukazatel aktualniho prvku na novy*/
                strInit(&novy->nazev);
                strCopyString(&(novy->nazev),nazev);
                ramec->rptr = novy;

                PridatHodnotu(novy, typ, cisloh, stringh); /*pomoci funkce PridatHodnotu vyplnime hodnotu prvku*/
                return;                                     /*ukoncime funkci*/
            }
        }
        if( key(nazev, &ramec->nazev) == 1){/*rozhodne, zda mame jit do leveho podstromu*/
            if(ramec->lptr != NULL) ramec = ramec->lptr;  /*kdyz neni levy podstrom prazdny, tak opakujeme dalsi cyklus pro novy ramec*/
            else {
                if((novy = (sRamec*) malloc(sizeof(sRamec)))==NULL) error(NULL,OTHER_RUNN_ERR,NULL);/*kdyz je levy podstrom prazdny, tak malokujeme novy prvek a nastavime levy ukazatel aktualniho prvku na novy*/
                strInit(&novy->nazev);
                strCopyString(&(novy->nazev),nazev);
                ramec->lptr = novy;
                PridatHodnotu(novy, typ, cisloh, stringh); /*pomoci funkce PridatHodnotu vyplnime hodnotu prvku*/
                return;                                       /*ukoncime funkci*/
            }
        }
        if( key(nazev, &ramec->nazev) == 0){ /*v pripade, ze se prvek shoduje, tak pouze nahradime jeho hodnotu volanim funkce PridatHodnotu*/
            PridatHodnotu(ramec, typ, cisloh, stringh);
            return;                          /*ukoncime funkci*/
        }
    }
}
Ejemplo n.º 4
0
tErrors printTape(tTape *tape) {

    if(tape == NULL) return E_INTERN;
    if(tape->first == NULL) return E_INTERN;

    tTapeItem *iter = tape->first;
    string inst;
    string op1;
    string op2;
    string result;

    if(strInit(&inst) != STR_SUCCESS) return E_INTERN;
    if(strInit(&op1) != STR_SUCCESS) return E_INTERN;
    if(strInit(&op2) != STR_SUCCESS) return E_INTERN;
    if(strInit(&result) != STR_SUCCESS) return E_INTERN;

    printf("||======================================================================||\n");
    printf("||\tINST\t|\tOP1\t|\tOP2\t|\tRESULT\t||\n");
    printf("||======================================================================||\n");

    while(iter != NULL) {

        // Line 1
        strClear(&inst);
        strClear(&op1);
        strClear(&op2);
        strClear(&result);

        constructInstStringLine1(&inst, iter->instruction);
        if(iter->op1 != NULL) constructOpStringLine1(&op1, iter->op1);
        if(iter->op2 != NULL) constructOpStringLine1(&op2, iter->op2);
        if(iter->result != NULL) constructOpStringLine1(&result, iter->result);
        printf("||\t%s\t|\t%s\t|\t%s\t|\t%s\t\t||\n", inst.str, op1.str, op2.str, result.str);

        // Line 2
        strClear(&inst);
        strClear(&op1);
        strClear(&op2);
        strClear(&result);

        constructInstStringLine2(&inst, iter);
        if(iter->op1 != NULL) constructOpStringLine2(&op1, iter->op1);
        if(iter->op2 != NULL) constructOpStringLine2(&op2, iter->op2);
        if(iter->result != NULL) constructOpStringLine2(&result, iter->result);
        printf("||\t%s\t|\t%s\t|\t%s\t|\t%s\t\t||\n", inst.str, op1.str, op2.str, result.str);
		



        printf("||======================================================================||\n");
        iter = iter->next;
    }

    strFree(&inst);
    strFree(&op1);
    strFree(&op2);
    strFree(&result);
	return E_OK;
}
Ejemplo n.º 5
0
void VytvorRamec(sLokTableItem *koren, sRamec *novy){

    if(koren != NULL){
        novy->lptr = NULL; /*nastavi defaultne kazdemu novemu prvku ukazatele na NULL*/
        novy->rptr = NULL;
        sRamec *pom;/*vytvori si pomocnou promenou*/

        strInit(&(novy->nazev));
        strCopyString((&novy->nazev), (&koren->data.nazev));/*kopiruje informace z tabulky symbolu*/
        novy->typ = koren->data.typ;
        novy->hodnota.def = 0; /*nastavi definovanost prvku na 0 (tzn. neobsahuje hodnotu)*/
        novy->hodnota.porarg = koren->poradi_argumentu;

        if(koren->lptr != NULL){ /*kdyz ma ukazatel na levy podstrom, tak:*/
            if((pom = (sRamec*) malloc(sizeof(sRamec)))==NULL) error(NULL,OTHER_RUNN_ERR,NULL); /*malokuje misto pro novy prvek ramce*/
            novy->lptr = pom; /*a aktualnimu prvku nastavi ukazatel na novy levy podstrom*/
            VytvorRamec(koren->lptr, novy->lptr);  /*a dale rekurzivne vola funkci VytvorRamec*/
        } else novy->lptr = NULL; /*kdyz nema levy podstrom, pta se na pravy podstrom u ktereho postupuje obdobne jako u leveho*/
        if(koren->rptr != NULL){
            if((pom = (sRamec*) malloc(sizeof(sRamec)))==NULL) error(NULL,OTHER_RUNN_ERR,NULL);
            novy->rptr = pom;
            VytvorRamec(koren->rptr, novy->rptr);
        } else  novy->rptr = NULL;
    } /*v pripade, ze nema ani jeden podstrom, tak se funkce ukonci a vraci se do rekurzivni funkce, v ktere byla predtim volana*/
}
Ejemplo n.º 6
0
void GlobTableInit(tGlobSymbolTable *T,Tridic *ridic)/*inicializace globalni tabilky*/
{
    string pom;

    sGlobTableItem *novy;
    Rfirst=NULL;/* zasobnik ramcu je prazdny*/

    T->first = NULL;/*globalni tabulka je prazdna*/
    ridic->aktiv= NULL;/*ukazatel na aktivni uzel globalni tabulky*/
    ridic->pomlog = 0;/*pomocna promenna*/
    ridic->pocet_argumentu=0;/*pocet argumentu fce je nula*/
    ridic->deklaration=0;/*pomocna promenna pro definici funkci*/
    strInit(&pom);

    strAddStr(&pom,"length");
    GlobItemInsert(T,&pom,FUNCTION_HEADER,ridic,&novy);
    strAddStr(&(novy->arg),"si");
    strClear(&pom);
    strAddStr(&pom,"copy");
    GlobItemInsert(T,&pom,FUNCTION_HEADER,ridic,&novy);
    strAddStr(&(novy->arg),"siis");
    strClear(&pom);
    strAddStr(&pom,"find");
    GlobItemInsert(T,&pom,FUNCTION_HEADER,ridic,&novy);
    strAddStr(&(novy->arg),"ssi");
    strClear(&pom);
    strAddStr(&pom,"sort");
    GlobItemInsert(T,&pom,FUNCTION_HEADER,ridic,&novy);
    strAddStr(&(novy->arg),"ss");

}
Ejemplo n.º 7
0
void ungetToken(tToken* token) {
	if (token == NULL) {
		return;
	}
	if (!TQueue) {
		TQInit();
	}
	tToken newTok = (tToken)malloc(sizeof(struct stToken));
	tTokenQueueElem elm = (tTokenQueueElem)malloc(sizeof(struct tTQelem));
	if (!newTok || !elm) {
		FatalError(99, ERR_MESSAGES[ERR_ALLOC]);
	}
	newTok->typ = (*token)->typ;
	if ((*token)->typ == TYPE_IDENTIFICATOR || (*token)->typ == TYPE_STRING) {
		strInit(&newTok->value.stringVal);
		strCopyString(&newTok->value.stringVal, &(*token)->value.stringVal);
	}
	else {
		newTok->value = (*token)->value;
	}
	freeTokenMem(token);
	elm->token = newTok;
	elm->rptr = elm->lptr= NULL;
	if (!TQueue->First) {//ve fronte nikdo neni
		TQueue->First = TQueue->Last = elm;
	}
	else {//nekdo ceka
		TQueue->Last->rptr = elm;
		elm->lptr = TQueue->Last;
		TQueue->Last = elm;
	}


}
Ejemplo n.º 8
0
void TQDequeue(tToken* token) {
	if (token == NULL) {
		return;
	}
	if (!TQueue || !TQueue->First) {//neexistuje fronta nebo je prazdna
		token = NULL;
		return;
	}
	(*token) = (tToken)malloc(sizeof(struct stToken));
	(*token)->typ = TQueue->First->token->typ;
	if ((*token)->typ == TYPE_IDENTIFICATOR || (*token)->typ == TYPE_STRING) {
		strInit(&(*token)->value.stringVal);
		strCopyString(&(*token)->value.stringVal, &TQueue->First->token->value.stringVal);
	}
	else {
		(*token)->value = TQueue->First->token->value;
	}
	//navazu odkazy
	tTokenQueueElem elm = TQueue->First;
	if (TQueue->First == TQueue->Last) {//toto byl posledni prvek fronty
		TQueue->First = TQueue->Last = NULL;
		freeTokenQueue();
	}
	else {
		TQueue->First = elm->rptr;
		TQueue->First->lptr = NULL;
	}
	//uvolnime po sobe pamet
	freeTokenMem(&elm->token);
	free(elm);
}
Ejemplo n.º 9
0
int init_scanner(char *filename)
{
	if (filename != NULL)
	{
		if ((in = fopen(filename, "r")) == NULL)
		{
			fprintf(stderr, "Input file '%s' cannot be open!\n", filename);
			return EOF;
		}
	}
	else
	{
		in = stdin;
	}

	buffer = &buff_struct;

	if (!strInit(buffer))
	{
		fprintf(stderr, "Malloc error.\n");
		return ERR_INTERPRET;
	}
	else
	{
		return OK;
	}
}
Ejemplo n.º 10
0
int params() {
	int enumerator;
	if ((error = testToken(T_ID)) != E_OK) return error; // "ID_parametru" - mozna specifikovat
	strInit(&IDstr);
    strCopystring(&IDstr, &T.s);
	gettoken();
	if ((error = testToken(T_COLON)) != E_OK) return error; // ":"
	gettoken();
	if ((error = testToken(T_DATATYPE)) != E_OK) return error; 
	if(!(strCmpConstStr(&(T.s), "boolean")))	    enumerator = O_BOOL;		
	else if(!(strCmpConstStr(&(T.s), "integer")))	enumerator = O_INT;	
	else if(!(strCmpConstStr(&(T.s), "real")))      enumerator = O_REAL;
	else if(!(strCmpConstStr(&(T.s), "string")))    enumerator = O_STRING;
	else return E_SEMA;		
	gettoken();
	pc++;
	if(strCmpstring(&IDstr, &ActFun) == 0) return E_SEMA;          //ADDED
	if (searchParam(paramlist, &IDstr) != NULL) return E_SEMA;    
	if ((error = insertParam(paramlist,&IDstr, enumerator)) != E_OK) return error;;
	//strFree(&IDstr);
	if (testToken(T_SEMICOLON) == E_OK) {  
	  gettoken();
	  if((error = params()) != E_OK) return error; //vice parametru - rekurze
	}
	return E_OK;
}
Ejemplo n.º 11
0
void PridatHodnotu(sRamec *ramec, int typ, double cisloh, string *stringh){
    ramec->typ = typ;       /*priradi prvku v ramci typ*/
    if(typ == TP_STRING) {  /*kdyz je typ string, tak preda retezec*/
        strInit(&ramec->hodnota.stringh);/*kdyz je bool, int, nebo real, tak pouze priradi double*/
        strCopyString(&(ramec->hodnota.stringh),stringh);/*nastavi definovanost prvku na 1*/
    }
    else {
        ramec->hodnota.cisloh = cisloh;
    }
    ramec->hodnota.def = 1;
    return;
}
Ejemplo n.º 12
0
/**
 * @info      Fce ziska vstup od uzivatele
 * @param   E_CODE - odkaz na chybovy kod
 * @return  tSymbolData - nacteny retezec
 */
E_CODE input (tSymbolData *dest)
{
  int c;
  tString save;
  E_CODE err = strInit(&save);
  while ((c = fgetc(stdin)) != EOF && c != '\n' && err == ERROR_OK)
    err = strAdd(&save, (char) c);

  dest->type = DT_STRING;
  dest->data.sData = save;
  return err;
}
Ejemplo n.º 13
0
string substr(string s, int i, int n)
{
    string temp;
    if (strInit(&temp) != E_SUCCESS)
        return temp;

    for (int j = i; j < n; j++)
        if (strAppend(&temp, s.str[j]) != E_SUCCESS)
            return temp;

    return temp;
 }
Ejemplo n.º 14
0
string* tabSymListCreateTmpSymbol(tTabSymListElemPtr generateFor, tTabSym* locTable) {
	char buffer[BUFFER_SIZE];
	int flag;
	unsigned int index=0;
	if(locTable==NULL) return NULL;	//chyba
	unsigned int* chooseCounter;
	//vybereme counter
	if(generateFor==NULL){
		chooseCounter=&locTable->tmpCounter;
	}else{
		chooseCounter=&generateFor->table->tmpCounter;
	}


	if(sumCounters(generateFor, &index)==0){
		//chyba overflow
		return NULL;
	}

	//zkontrolujeme overflow
	if (locTable->tmpCounter > UINT_MAX - index){
		//chyba overflow
		return 0;
	}
	index+=locTable->tmpCounter;

	//Notice that only when this returned value is non-negative and less than n, the string has been completely written.
	flag = snprintf(buffer, BUFFER_SIZE, "%u", index);//vytvoreni nazvu docasne promenne
	if (flag < 0 || flag >= BUFFER_SIZE) {
		//chyba pri vytvareni nazvu
		return NULL;
	}
	string* newString = malloc(sizeof(string));
	if (newString == NULL) {
		//chyba pri alokaci
		return NULL;
	}
	if(strInit(newString)){
		free(newString);
		return NULL;
	}
	if(strConConstString(newString, buffer)){
		strFree(newString);
		free(newString);
		return NULL;
	}

	//zvysime counter u tabulky symbolu
	(*chooseCounter)++;
	return newString;
}
Ejemplo n.º 15
0
int localDecl() { //za decl nebrat token
		if ((error = testToken(T_ID)) != E_OK) return error; //ID
		if (searchParam(paramlist, &(T.s)) != NULL){ //zde budu muset nejspis dat jen jmenu aktualni fkce
			return E_SEMA;
		}
		if(strCmpstring(&(T.s), &ActFun) == 0){     //ADDED
			return E_SEMA;
		}
		if(BSTSearch (TempTreeL, T.s) != NULL){
			return E_SEMA;
		}
		strInit(&IDstr);
		strCopystring(&IDstr, &T.s);
		gettoken();
		if ((error = testToken(T_COLON)) != E_OK) return error;
		    gettoken();
		if ((error = testToken(T_DATATYPE)) != E_OK) return error; // typ
		
/******************************************INSERT***************************************************************/

		if(!(strCmpConstStr(&(T.s), "boolean"))) TempVar->type = O_BOOL;		
		if(!(strCmpConstStr(&(T.s), "integer"))) TempVar->type = O_INT;		
		if(!(strCmpConstStr(&(T.s), "real")))    TempVar->type = O_REAL;
		if(!(strCmpConstStr(&(T.s), "string"))){
			TempVar->type = O_STRING;
			strInit(&TempVar->value.sval);
		}
		BSTInsert (&TempTreeL, IDstr, TempVar); 

/******************************************INSERT***************************************************************/
		gettoken();
		if ((error = testToken(T_SEMICOLON)) != E_OK) return error; // ";"
		gettoken();
		//strFree(&IDstr);
		if (testToken(T_ID) == E_OK)
		    if ((error = localDecl()) != E_OK) return error;	//dalsia promena?
		return E_OK;
}
Ejemplo n.º 16
0
/**
 * @info      Vytvori strukturu a prida do ni *char z parametru
 * @param   char* - pole znaku, nad kterym vytvorime novou strukturu string
 * @return  tString - Struktura s polem a jeho rozmery
 */
tString strCreate (const char *array)
{
  tString str = {NULL, 0, 0};
  if (strInit(&str) == ERROR_COMPILATOR)
    return str;

  int i = 0;
  while (array[i] != '\0')
    if (strAdd(&str, array[i++]) == ERROR_COMPILATOR) {
      strFree(&str);
      return str;
    }

  return str;
}
Ejemplo n.º 17
0
string concat(string s1, string s2)
{
    string temp;
    if (strInit(&temp) != E_SUCCESS)
        return temp;

    if (strCopy(&s1, &temp) != E_SUCCESS)
        return temp;

    for (int i = 0, j = length(temp); i < length(s2); i++, j++)
        if (strAppend(&temp, s2.str[j]) != E_SUCCESS)
            return temp;

    return temp;
}
Ejemplo n.º 18
0
int main() {
   TTable mujTable;
   table = &mujTable;
   tableInit(table);

   tableInsertFunction(table, strCreateString("fce"));
   functionInsertVar(table->lastAddedFunc, strCreateString("x"));
   functionInsertVar(table->lastAddedFunc, strCreateString("y"));
   functionInsertVar(table->lastAddedFunc, strCreateString("z"));

   printf("\nJedna funkce: \n");
   tablePrintOrder(*table);
   printf("\n----------------------------\n");


//tiskniPrecTab();
   FILE *f = fopen("testy/test-expr2.txt","r");
   setSourceFile(f);
   strInit(&attr);
   listInit(&table->lastAddedFunc->tmpVar);

   int err = EOK;
   TVar *x = NULL;
   int test = 1;
   token = 1;

   while(token != END_OF_FILE) {
      token = getNextToken(&attr);
      x = NULL;
      err = parseExpression(table, &x);
      printf("Test %d skoncil s chybou: %d a vysledkem: %d \n", test,err, (int)x);
      test++;

      while (token != END_OF_FILE && token != L_SEMICOLON) {
         token = getNextToken(&attr);
      }
   }
   tiskniList(&table->lastAddedFunc->instructions);

   listDataDelete(&table->lastAddedFunc->tmpVar);
   listDispose(&table->lastAddedFunc->tmpVar);

   fclose(f);
   tableClear(table);
   strFree(&attr);
   return EXIT_SUCCESS;
}
Ejemplo n.º 19
0
/*
 * @depractated
 * @bug this whole function is one big bug, do not use
 */
int unescapeStr(string* s) {
	string ret;
	//string help;
	//strInit(&help);
	strInit(&ret);
	int i = 0;
	while (s->str[i++]!='\0') {
		if (s->str[i] == '\\') {
			i++;
		}
		else {
			if (strAddChar(&ret, s->str[i])) {
				strFree(s);
				FatalError(99, ERR_MESSAGES[ERR_ALLOC]);
			}
		}
	}
	return 1;
}
Ejemplo n.º 20
0
int mara()

{
    string stri;
    int type;
    double num;
    int error;


    type=-1;
    //*num=0;
    //*line=1;

    FILE *soubor;


    //stri=malloc(sizeof(string));

    printf("*******************\n");




    soubor = fopen(TEXT, "r");

    while (type != 3)
    {
        if ((strInit(&stri))==1)
        {
            printf("nepovedlo se vytvořit řetězec\n");
        }
//int get_token(FILE *F, double *num, int *line, string *stri, int *error )
        type=get_token(soubor,&num,&stri,&error);
        printf("\nJe to typ: %i\n",type);
        printf("Charnum je: %f a radek je:%i\n",num,line);
        printf("String je: %s\n",strGetStr(&stri));
        printf("**************************************\n");
        strFree(&stri);

    }
    fclose(soubor);
}
Ejemplo n.º 21
0
string* tabSymCreateTmpSymbol(tTabSym* table) {
	char buffer[BUFFER_SIZE];
	int flag;
	//Notice that only when this returned value is non-negative and less than n, the string has been completely written.
	flag = snprintf(buffer, BUFFER_SIZE, "%u", table->tmpCounter++);//vytvoreni nazvu docasne promenne
	if (flag < 0 || flag >= BUFFER_SIZE) {
		//chyba pri vytvareni nazvu
		return NULL;
	}
	string* newString = (string*)malloc(sizeof(string));
	if (newString == NULL) {
		//chyba pri alokaci
		return NULL;
	}
	if(strInit(newString)){
		return NULL;
	}
	strCmpConstStr(newString, buffer);
	return newString;
}
Ejemplo n.º 22
0
string copy(string *str, int i, int j)										//Funkce vrací podřetězec z řetězce str od i o délce j.
{
    string strback;															//Pomocná proměnná typu string.
	int p;																	//Řídící proměnná for cyklu.

    if (i < 1)																//Pokud je i menší než 1, přiřadíme mu hodnotu 1, aby jsme nepřistupovali mimo string.
    {
        i=1;
    }
    if ((i+j-1) > str->length)												//Pokud je j větší než délka řetězce, upravíme jej, aby jsme nekopírovali prvky za rozsahem stringu.
    {
        j=str->length-i+1;
    }

    strInit(&strback);														//Inicializace stringu.
    for (p = 0; p < j; p++)													//For cyklus o j opakováních.
    {
        strAddChar(&strback,str->str[i+p-1]);								//Jednotlivé znaky přidáváme do strback.
    }
    return strback;															//Vracíme string.
}
Ejemplo n.º 23
0
void VytvorRamecGlob(sGlobTableItem *koren, sRamec *novy){

    if(koren != NULL){/*postup je zde obdobny, jako u funkce VytvorRamec pro lokalni tabulky symbolu, ktera se nachazi nad touto funkci*/
        novy->lptr = NULL;
        novy->rptr = NULL;
        sRamec *pom;
        strInit(&(novy->nazev));
        strCopyString((&novy->nazev), (&koren->data.nazev));
        novy->typ = koren->data.typ;
        novy->hodnota.def = 0;
        novy->hodnota.porarg = 0;
        if(koren->lptr != NULL){
            if((pom = (sRamec*) malloc(sizeof(sRamec)))==NULL) error(NULL,OTHER_RUNN_ERR,NULL);
            novy->lptr = pom;
            VytvorRamecGlob(koren->lptr, novy->lptr);
        } else novy->lptr = NULL;
        if(koren->rptr != NULL){
            if((pom = (sRamec*) malloc(sizeof(sRamec)))==NULL) error(NULL,OTHER_RUNN_ERR,NULL);
            novy->rptr = pom;
            VytvorRamecGlob(koren->rptr, novy->rptr);
        } else  novy->rptr = NULL;
    }
}
Ejemplo n.º 24
0
void stInitLibFunctions(SYMBOL_TABLE_PTR st){

	STRING id;	

	strInit(&id);
	
	strInitRaw(&id, "boolval");
	stInsertFunction(st, id);
		
	strInitRaw(&id, "doubleval");
	stInsertFunction(st, id);
		
	strInitRaw(&id, "intval");
	stInsertFunction(st, id);
	
	strInitRaw(&id, "strval");
	stInsertFunction(st, id);
	
	strInitRaw(&id, "get_string");
	stInsertFunction(st, id);
	
	strInitRaw(&id, "put_string");
	stInsertFunction(st, id);	
	
	strInitRaw(&id, "strlen");
	stInsertFunction(st, id);	

	strInitRaw(&id, "get_substring");
	stInsertFunction(st, id);	

	strInitRaw(&id, "find_string");
	stInsertFunction(st, id);	

	strInitRaw(&id, "sort_string");
	stInsertFunction(st, id);	
}
Ejemplo n.º 25
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;
}
Ejemplo n.º 26
0
//################### HLEDANI A ZPRACOVANI FUNKCE #######################
tErrors SearchFun()
{
    tFunListItem *FunPtr;   // ukazatel na prvek seznamu funkce
    tVariable *pTree;       // ukazatel na strukturu tVariable
    tParamItem *param;      // ukazatel na parametr
    tErrors er;             // promenna typu tErrors pro ulozeni vysledneho error kodu
    tExpType type;          // typ prvku na zasobniku
    tVariable *temp;  
    tVariable *temp2;  
    tParamList *parameterList;       
    int param_counter = 0;
    int param_number = 0;

    parameterList = allocate(sizeof(tParamList));
    initParamlist(parameterList);

    FunPtr = searchFunList(&(T.s));            // pokud najdes funkci v seznamu funkci 
       
        param_number = FunPtr->param_count;    // ulozeni - pocet parametru funkce do param
        param = FunPtr->param_list->first;     // ulozeni ukazatele na prvni prvek v seznamu parametru funkci
        gettoken();
        er = ConvertToken(&type);   // konvertovani tokenu
        if (er)                     // pokud konvert neprobehl v poradku
            return E_SYN;           // koncim s chybou
        if (type != LB)             // pokud nenasleduje leva zavorka, E_SYN
            return E_SYN;
        gettoken();
        er = ConvertToken(&type);   // konvertovani tokenu
        if (er)                     // pokud konvert neprobehl v poradku
            return E_SYN;           // koncim s chybou  
        //printf("P: %d T.TYPE: %d\n",param_number,T.type);
        if ((param_number == 0) && (T.type != T_RB))
            return E_SEMB;
   
        while((type != RB) && ((strCmpConstStr (&(T.s), "end")!=0) && (T.type != T_SEMICOLON)))    // ber novy token dokud neprojdes vsechny parametry funkce         
        {   //printf("JSEM  ve WHILE\n");  
            //printf("TOKEN 01: %s\n",T.s.str);
            if (T.type == T_ID)         // pokud je typ ID, vyhledej jej v BVS
            {   
                if (insertParam(parameterList, &(T.s), T.type) != E_OK) return E_INTERN; 
                if ((SearchDataType(TempTree, TempTreeL)) != NULL)      // pokud je token typu ID a je nalezen v BVS
                {
                    pTree = SearchDataType(TempTree, TempTreeL);        // uloz mi ukazatel na prvek do stromu
                    if (pTree->type != param->type)                     // pokud neni typ tokenu roven typu parametru funkce 
                        return E_SEMB;                                  // vraci E_SEMB
                }
                else
                {                                                    // pokud neni prvek nalezen
                    return E_SEMA;                                   // vraci E_SEMA
                }
            }
            else if (T.type == T_INT)
            {
                if (param->type != O_INT)     // pokud neni typ tokenu roven typu parametru funkce 
                        return E_SEMB;
            }
            else if (T.type == T_REAL)
            {
                if (param->type != O_REAL)     // pokud neni typ tokenu roven typu parametru funkce 
                        return E_SEMB;
            }
            else if (T.type == T_STRING)
            {
                if (param->type != O_STRING)     // pokud neni typ tokenu roven typu parametru funkce 
                        return E_SEMB;
            }
            else if (T.type == T_KONST)
            {
                if (param->type != O_BOOL)     // pokud neni typ tokenu roven typu parametru funkce 
                        return E_SEMB;
            }
            else                    // pokud neni parametr ID
            {
                return E_SYN;       // vraci chybu E_SYN
            }             

            gettoken();
            er = ConvertToken(&type);   // konvertovani tokenu
            if (er)                     // pokud konvert neprobehl v poradku
                return E_SYN;           // koncim s chybou

            param_counter++;    // pocitadlo paramateru

            if (((param_counter == param_number) && (type != RB)) && (type != COMMA))  // pokud neni za ID carka nebo za posledni parametrem neni prava zavorka
                return E_SYN;           // vrat chybu E_SYN
            
            if (param_counter > param_number)   // pokud pocitadlo parametru je vetsi jako hodnota, ktera je udana u funkce v seznamu
                return E_SEMB;                  // vrat chybu E_SEMB
            if (param->next != NULL)
                param = param->next;                // posunuti na dalsi parametr funkce ???????????????????????
            gettoken();
            er = ConvertToken(&type);   // konvertovani tokenu
            if (er)                     // pokud konvert neprobehl v poradku
                return E_SYN;           // koncim s chybou
        }
    
        if (param_number != param_counter)
            return E_SEMB;

        res = FunPtr->ret_type;

        if ((temp = allocate(sizeof(tVariable))) == NULL)    //pokud neni dostatek pameti => E_INTERN
            return E_INTERN;
        if (strInit(&(temp->name)) == STR_ERROR)            //pokud funkce init. stringu vrati chybu => E_INTERN
            return E_INTERN;
        if ((temp2 = allocate(sizeof(tVariable))) == NULL)    //pokud neni dostatek pameti => E_INTERN
            return E_INTERN;
        if (strInit(&(temp2->name)) == STR_ERROR)            //pokud funkce init. stringu vrati chybu => E_INTERN
            return E_INTERN;

        temp->name = FunPtr->name;
        temp->value.param_pointer = parameterList->first;
        temp->type = PARAM_POINTER;

        temp2->type = TAPE_POINTER;
        temp2->value.tape_pointer = FunPtr->tape_ptr;

        Tape->last->op1 = temp;         // ulozeni ukazatele na tVariable polozku, ktera obsahuje ukazatel na funkci na pasce 
        Tape->last->instruction = CALL;  // instrukce je funkce
        Tape->last->op2 = temp2;
        Tape->last->result->type = FunPtr->ret_type; 

         if (param_counter == 0)
            gettoken();

        return E_OK;                      // pokud to najde funkci E_OK
}
Ejemplo n.º 27
0
//######################## Redukce zasobniku ############################
tErrors ExpStackReduct(tExpStack *S, tTabSigns sign)
{
	tExpType toptype = -1;			//promenna typu tExptype a  hodnotou -1 pro uchovani typu tokenu
    tElemPtr TopOp;                 //zpracovavany OP2
    tElemPtr SecTopOp;              //zpracovavany OP1 
    tElemPtr TopIstruction;         //provadena instrukce mezi OP1|OP2
    tErrors er;                     //promenna typu tErrors
	tVariable *temp;


    ExpStackTop(S, &toptype);		//vraci hodnotu prvniho prvku zasobniku
 
    if (toptype == ID) 	//vstup=ID, pravidlo E->ID
    {
        S->Top->data = NONTERM; 	//zmena interniho typu na NONTERM podle pravidla
        return E_OK;
    }

    if (sign == Q)     //vstup = ')', pravidlo E->(E) (ale ')' nemam na zasobniku)
    {  
	reduct =1;
        if (toptype != NONTERM)      //kdyz neni na vrcholu zasobnika NONTERM
            return E_SYN;            //vraci error E_SYN
        ExpStackSecTop(S, &toptype); //vraci hodnotu druheho prvku

        if (toptype != LB)      	 //pokud je na druhem miste v zasobniku '('
            return E_SYN;            //vraci error E_SYN
        ExpStackSecPop(S);           //odstranim zavorku
        return E_OK; 
    }
    else			   //ostatni pravidla E->EopE (pr. E->E+E, E->E-E,...)
    {
        if (toptype != NONTERM)     //kdyz neni na vrcholu zasobnika neterminal
            return E_SYN;           //vraci error E_SYN
        else 						//kdyz je na zasobniku nonterm
        {  
            ExpStackTopPoint (S, &TopOp);                       // druhy operand OP2 (prvni prvek na STACKU)
			ExpStackInstructionTopPoint (S, &TopIstruction);    // instrukce (druhy prvek na STACKU)
            if (TopIstruction->data != DOLAR)
            {    
                ExpStackSecTopPoint (S, &SecTopOp);                 // prvni operand OP1 (treti prvek na STACKU)
                reduct =1;
                //printf("OP2: %d OP1:%d \n",TopOp->tempVarPtr->type,SecTopOp->tempVarPtr->type);
                er = ExpParserSem(&(TopOp->tempVarPtr->type),&(SecTopOp->tempVarPtr->type),&(TopIstruction->instruction)); // aplikuju semanticka pravidla
                if (er == E_SEMB)       //pokud je semantika vyrazu nespravana
                {
                    return er;          //koncim s chybou
                }
				Tape->last->op2 = S->Top->tempVarPtr;
                ExpStackPop(S);         
                	
            }
            else
            {
               if (flag == FALSE)
			   {
			   // printf("OP2: %d INST:%d \n",TopOp->tempVarPtr->type,TopIstruction->data);
                    if (TopOp->tempVarPtr->type != O_BOOL)
                        return E_SEMB;
                    if (reduct != 1)
                    { 
                        Tape->last->op1 = S->Top->tempVarPtr;
                    
                        if ((temp = allocate(sizeof(tVariable))) == NULL)    //pokud neni dostatek pameti => E_INTERN
                            return E_INTERN;
                        if (strInit(&(temp->name)) == STR_ERROR)            //pokud funkce init. stringu vrati chybu => E_INTERN
                            return E_INTERN;
                        temp->value.bval = TRUE;
                        temp->valFull = DATA;
                        temp->type = O_BOOL;
                        Tape->last->instruction = MORE;
                        Tape->last->op2 = temp;
				        er = InsertEmptyItemTape();        //vkladam novy prazdny prvek na pasku
                        if (er == E_INTERN)
			                return er;
				    }
				    
                    ExpStackPop(S);
                    return E_OK;
			    }
				else
				{
				    if (reduct != 1)
                    { 
                        Tape->last->instruction = NOP;
				        Tape->last->result = S->Top->tempVarPtr;
				        res = S->Top->tempVarPtr->type;
				        er = InsertEmptyItemTape();        //vkladam novy prazdny prvek na pasku
                        if (er == E_INTERN)
			             return er;
				    }
				    ExpStackPop(S);
                    return E_OK;
				}	
            }
        }

        ExpStackTop(S, &toptype);	 //vraci hodnotu prvniho prvku
        if (toptype == NONTERM)      //kdyz je na vrcholu zasobnika neterminal
             return E_SYN;           //vraci error E_SYN
        else 						 //pokud tam neni neterminal
        {
            Tape->last->instruction = S->Top->instruction; 
            ExpStackPop (S);		 //odstranim dany operand
        }

        ExpStackTop(S, &toptype);	 //vraci hodnotu prvniho prvku
        if (toptype != NONTERM)      //kdyz neni na vrcholu zasobnika neterminal
             return E_SYN;           //vraci error E_SYN
        else
        {
            Tape->last->op1 = S->Top->tempVarPtr; 
            ExpStackPop (S);		 //odstranim dany operand
        }
        ExpStackPush(S, NONTERM, NULL);    //vlozim zpatky na zasobnik novy neterminal
        Tape->last->result = S->Top->tempVarPtr; // ukladam vysledek OP1 a OP2 do result na pasku	
		//printf("exp adreasa resultu v expe : %d \n",S->Top->tempVarPtr);
        er = InsertEmptyItemTape();        //vkladam novy prazdny prvek na pasku
        if (er == E_INTERN)
            return er;
    }
    return E_OK;                    //koncim s redukci -> vse OK
}
Ejemplo n.º 28
0
//############### Vlozeni prvku na zacatek zasobniku ####################
tErrors ExpStackPush (tExpStack *L, tExpType val, tVariable *item)
{
	tElemPtr temp;					//nova promenna typu tElemPtr

    if ((temp = malloc(sizeof(struct tElem))) == NULL)	//pokud neni dostatek pameti => E_INTERN
        return E_INTERN;

    if ((val == LB) || (val == RB) || (val == DOLAR))	//kdyz davam na zasobnik '(' nebo ')' nebo '$'
    {
        temp->data = val; 			//do data vlozim  interni typ precedencni tabulky
        temp->rptr = L->Top;		//ukazatel bud ukazovat na vrchol zasobniku
        L->Top = temp;				//ulozeni prvku do ukazatele na vrchol zasobniku
        return E_OK;
    }
    else if (val == NONTERM)		//kdyz davam na zasobnik neterminal
    {
        if ((temp->tempVarPtr = allocate(sizeof(tVariable))) == NULL)	//pokud neni dostatek pameti => E_INTERN
        	return E_INTERN;
        if (strInit(&(temp->tempVarPtr->name)) == STR_ERROR)			//pokud funkce init. stringu vrati chybu => E_INTERN
        	return E_INTERN; 

        temp->tempVarPtr->type = res; 		
        temp->data = val;						//do data vlozim  interni typ precedencni tabulky
        temp->rptr = L->Top;					//ukazatel bud ukazovat na vrchol zasobniku
        L->Top = temp;							//ulozeni prvku do ukazatele na vrchol zasobniku
        return E_OK;
    }
    else
    {
        switch(T.type)			
        { //###################### INSTRUKCE ###################
        	case T_ADD :     temp->instruction = ADD; break;					
            case T_SUB :     temp->instruction = SUB; break;
            case T_MUL :     temp->instruction = MUL; break;
            case T_DIV :     temp->instruction = DIV; break;
            case T_LESS :    temp->instruction = LESS; break;
            case T_MORE :    temp->instruction = MORE; break;
            case T_LESS_EQ : temp->instruction = EQL; break;
            case T_MORE_EQ : temp->instruction = EQM; break;
            case T_NOT_EQ :  temp->instruction = NEQ; break;
            case T_EQUAL :   temp->instruction = EQ; break;

         //####################### OPERANDY ####################
            case T_INT :			// push na stack token typu INT, alokace  mistro pro ulozeni jmena, typu a hodnoty tokenu
                if ((temp->tempVarPtr = allocate(sizeof(tVariable))) == NULL)	//pokud neni dostatek pameti => E_INTERN
                    return E_INTERN;
                if (strInit(&(temp->tempVarPtr->name)) == STR_ERROR)			//pokud funkce init. stringu vrati chybu => E_INTERN
                    return E_INTERN;
                temp->tempVarPtr->type = O_INT;									//operand typu O_INT
                temp->tempVarPtr->value.ival = strtol(T.s.str,NULL, 10); 
                break;

            case T_REAL :			// push na stack token typu REAL, alokace  mistro pro ulozeni jmena, typu a hodnoty tokenu
                if ((temp->tempVarPtr = allocate(sizeof(tVariable))) == NULL)	//pokud neni dostatek pameti => E_INTERN
                    return E_INTERN;
                if (strInit(&(temp->tempVarPtr->name)) == STR_ERROR)			//pokud funkce init. stringu vrati chybu => E_INTERN
                    return E_INTERN;
                temp->tempVarPtr->type = O_REAL;								//operand typu O_REAL
                temp->tempVarPtr->value.rval = strtod(T.s.str, NULL);	
                break;
        																			
            case T_STRING :			// push na stack token typu STRING, alokace  mistro pro ulozeni jmena, typu a hodnoty tokenu
                if ((temp->tempVarPtr = allocate(sizeof(tVariable))) == NULL)	//pokud neni dostatek pameti => E_INTERN
                    return E_INTERN;
                if (strInit(&(temp->tempVarPtr->name)) == STR_ERROR)			//pokud funkce init. stringu vrati chybu => E_INTERN
                    return E_INTERN;
                temp->tempVarPtr->type = O_STRING;
                if (strInit(&(temp->tempVarPtr->value.sval)) == STR_ERROR)    //pokud funkce init. stringu vrati chybu => E_INTERN
                    return E_INTERN;
                if (strCopystring(&(temp->tempVarPtr->value.sval), &(T.s)) == STR_ERROR)
                    return E_INTERN;
                break;

            case T_KONST :			// push na stack token typu KONST - BOOL, alokace  mistro pro ulozeni jmena, typu a hodnoty tokenu											//konstanty ukladam jako true nebo false
                if ((temp->tempVarPtr = allocate(sizeof(tVariable))) == NULL)	//pokud neni dostatek pameti => E_INTERN
                    return E_INTERN;
                if (strInit(&(temp->tempVarPtr->name)) == STR_ERROR)			//pokud funkce init. stringu vrati chybu => E_INTERN
                    return E_INTERN;
                temp->tempVarPtr->type = O_BOOL;								//operand typu O_BOOL - boolean
                if (!strCmpConstStr(&(T.s), "true"))							//pokud hodnota tokenu true
                    temp->tempVarPtr->value.bval = true;						// uloz hodnotu operandu jako true
                else if (!strCmpConstStr(&(T.s), "false"))                     //pokud hodnota tokenu je false
                    temp->tempVarPtr->value.bval = false;                     //uloz hodnotu operandu jako false
                else
                    return E_SYN;                                             //vraci error E_SYN
                break;
           default : break;
        }
    }
    temp->data = val; 				// do data vlozim  interni typ precedencni tabulky
    temp->rptr = L->Top;			// ukazatel bud ukazovat na vrchol zasobniku
    if(T.type == T_ID)              // pokud typ tokenu je ID (nejaka promenna) 
    {
        temp->tempVarPtr = item;    // uloz mi ukazatel na promennou do stromu LBVS/GBVS
        temp->tempVarPtr->valFull = NODATA;
    }
    L->Top = temp;					// ulozeni prvku do ukazatele na vrchol zasobniku

    return E_OK;
}
Ejemplo n.º 29
0
/* globally initialze the runtime system
 * NOTE: this is NOT thread safe and must not be called concurrently. If that
 * ever poses a problem, we may use proper mutex calls - not considered needed yet.
 * If ppErrObj is provided, it receives a char pointer to the name of the object that
 * caused the problem (if one occured). The caller must never free this pointer. If
 * ppErrObj is NULL, no such information will be provided. pObjIF is the pointer to
 * the "obj" object interface, which may be used to query any other rsyslog objects.
 * rgerhards, 2008-04-16
 */
rsRetVal
rsrtInit(char **ppErrObj, obj_if_t *pObjIF)
{
	DEFiRet;

	if(iRefCount == 0) {
		/* init runtime only if not yet done */
#ifdef HAVE_PTHREAD_SETSCHEDPARAM
	    	CHKiRet(pthread_getschedparam(pthread_self(),
			    		      &default_thr_sched_policy,
					      &default_sched_param));
		CHKiRet(pthread_attr_init(&default_thread_attr));
		CHKiRet(pthread_attr_setschedpolicy(&default_thread_attr,
			    			    default_thr_sched_policy));
		CHKiRet(pthread_attr_setschedparam(&default_thread_attr,
			    			   &default_sched_param));
		CHKiRet(pthread_attr_setinheritsched(&default_thread_attr,
			    			     PTHREAD_EXPLICIT_SCHED));
#endif
		if(ppErrObj != NULL) *ppErrObj = "obj";
		CHKiRet(objClassInit(NULL)); /* *THIS* *MUST* always be the first class initilizer being called! */
		CHKiRet(objGetObjInterface(pObjIF)); /* this provides the root pointer for all other queries */

		/* initialize core classes. We must be very careful with the order of events. Some
		 * classes use others and if we do not initialize them in the right order, we may end
		 * up with an invalid call. The most important thing that can happen is that an error
		 * is detected and needs to be logged, wich in turn requires a broader number of classes
		 * to be available. The solution is that we take care in the order of calls AND use a
		 * class immediately after it is initialized. And, of course, we load those classes
		 * first that we use ourselfs... -- rgerhards, 2008-03-07
		 */
		if(ppErrObj != NULL) *ppErrObj = "statsobj";
		CHKiRet(statsobjClassInit(NULL));
		if(ppErrObj != NULL) *ppErrObj = "prop";
		CHKiRet(propClassInit(NULL));
		if(ppErrObj != NULL) *ppErrObj = "glbl";
		CHKiRet(glblClassInit(NULL));
		if(ppErrObj != NULL) *ppErrObj = "msg";
		CHKiRet(msgClassInit(NULL));
		if(ppErrObj != NULL) *ppErrObj = "ruleset";
		CHKiRet(rulesetClassInit(NULL));
		if(ppErrObj != NULL) *ppErrObj = "wti";
		CHKiRet(wtiClassInit(NULL));
		if(ppErrObj != NULL) *ppErrObj = "wtp";
		CHKiRet(wtpClassInit(NULL));
		if(ppErrObj != NULL) *ppErrObj = "queue";
		CHKiRet(qqueueClassInit(NULL));
		if(ppErrObj != NULL) *ppErrObj = "conf";
		CHKiRet(confClassInit(NULL));
		if(ppErrObj != NULL) *ppErrObj = "parser";
		CHKiRet(parserClassInit(NULL));
		if(ppErrObj != NULL) *ppErrObj = "strgen";
		CHKiRet(strgenClassInit(NULL));
		if(ppErrObj != NULL) *ppErrObj = "rsconf";
		CHKiRet(rsconfClassInit(NULL));
		if(ppErrObj != NULL) *ppErrObj = "lookup";
		CHKiRet(lookupClassInit());

		/* dummy "classes" */
		if(ppErrObj != NULL) *ppErrObj = "str";
		CHKiRet(strInit());
	}

	++iRefCount;
	dbgprintf("rsyslog runtime initialized, version %s, current users %d\n", VERSION, iRefCount);

finalize_it:
	RETiRet;
}
Ejemplo n.º 30
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;
}