int funkce(double vzorek,double pocet_vzorku ,double start, double stop) { double jeden_vzorek = (stop-start)/pocet_vzorku; double x = vzorek*jeden_vzorek; // tady nadefinuj nejakou tu funkci return doubleToInt(FUNKCE(x)); }
//start programu. PROGRAM-> FUNKCE . eof tChyba PROGRAM () { //inicializace labelu pro if a while na 0 lab = 0; lab_while = 0; //nacitani prvniho tokenu je v komentu, protoze na konci je pomocna funkce, kde se uz nacita token, pri vyslednem kodu, bude toto nacteni tokenu odkomentovano /*token = getNextToken(); if(token.stav == s_lex_error) { return S_LEXIKALNI_CHYBA; }*/ //lokalni promenna, do ni se nacita vystup funkci int analyza; //vytvoreni globalni a lokalni(main) hash tabulky int ret = initFrames(); byla_funkce = false; pocitani_parametru = 0; if(ret != S_BEZ_CHYB ) { return S_INTERNI_CHYBA; } if(token.stav == s_klicove && (!strcmp(token.data, "function") || !strcmp(token.data, "var") || !strcmp(token.data, "begin"))) { //podminka kde se kontroluje, zda nacteny token je klicove slovo a nasledne se rozhodne, ktere konkretne. Pote dojde k zavolani funkce FUNKCE, kde jsou 3 pravidla, ktere zacinaji terminala vyse analyza = FUNKCE (); if (analyza != S_BEZ_CHYB) { //pokud se vrati po zavolani FUNKCE() s_bez_chyb pokracuje se dal, jinak se vraci chybovy kod, ktery funkce vratila return analyza; } if(token.stav == s_tecka) { //porovnava se ciselna hodnota tokenu s ciselnou hodnotu tecky (tecka neni primo nadefinovana jako tecka, ale je pro ni vyhrazen unikatni identifikator ciselny, ktery porovnavam s id prvku v nactenem tokenu) token = getNextToken(); if(token.stav == s_lex_error) { //jakmile nacitam token okamzite kontroluju, jestli se nevyskytla lexikalni chyba return S_LEXIKALNI_CHYBA; } if(token.stav == s_eof) { //jakmile dojdeme ke konci souboru, vrati funkce syntakticka analyza ok a mame vyhrano return S_BEZ_CHYB; } } } return S_SYNTAKTICKA_CHYBA; //pokud nejaky token neodpovida predem danym terminalum z pravidel, vraci chybu }
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; }