• Welcome to TUKE FÓRUM - Fórum pre študentov Technickej Univerzity v Košiciach.
 

FJAP

Started by PaliP, 09.09.2011, 19:14:44

« predchdzajce - alie »

SteLa

Dolezita otazka: Mam zadanie s && a ||. Pri zotaveni mam dilemu.

bud:
Mozem siahnut na metodu getsymbol() s tym, ze ak natrafim na & miesto && mozem drzo priradit symbol = AND a zavolat prislusny error , vypise teda ze som mala chybu, aj to aku ale ju zaroven aj opravi.
Tym by som zaroven vedela aj osetrit situacie ako value&&||value alebo value||) a pod.. a bolo by to uplne blbovzdorne.. ale zas neviem, ci pri zotaveni mozem takto surovo menit getsymbol(), teda ci pripadne opravy nie su povolene len v metode error preskocenim.

alebo : mam toto osamele & preskocit opravou az v metode error aj ked je podla mna zo zapisu zjavne, ze autor vyrazu chcel pouzit &&O.o?

.. riesi niekto taky problem?

paloSK

Ludia som v koncoch bu, KUPIM ZADANIE Z FJAP, KTO SA NA TO PODUJME ? PM
:D

xxx3

ja to tu pisem uz asi 2 tyzdne a nikto sa neozval nato

paloSK

Quote from: xxx3 on  30.10.2011, 04:01:59
ja to tu pisem uz asi 2 tyzdne a nikto sa neozval nato
Nesranduj  :o  Ach jaj, co ja odovzdam v pondelok  :'(
:D

SteLa

ale tak ved si spravte temu kupim zadanie^^ Ja som tu v nadeji klikla, ze niekto reagoval nech to uz dokoncim konecne a nic O.o

paloSK

:D

Mitwoc

Mohol by mi niekto poradit, ako mam spravit zotavenie pri vyraze "if" ? kde presne volat check() a kde error() ?

SteLa

Quote from: Mitwoc on  30.10.2011, 05:25:59
Mohol by mi niekto poradit, ako mam spravit zotavenie pri vyraze "if" ? kde presne volat check() a kde error() ?

Myslim, ze pri if error nevolas a check robis az po ukonceni celej podmienky if, tak by to malo fungovat. Aspon ja mam tak:)

depeha

#333
ELUA:
QuoteNeručím za nič nižšie popísané! Všetko robíte na vlastné riziko!

V tomto "tute" je uvedené všetko, na čom som zatiaľ sám prišiel, no nikto mi nepotvrdil že to je správne! Odporúčam použiť v prípade kedy už ani vaša peňaženka nezvládne spraviť toto zadanie.

Ak ste ochotný toto riziko podstúpiť kliknite [SEM] to je len vtip a čítajte ďalej. V opačnom prípade stlačte klávesovú skratku Ctrl+W.


Pokus implementovať zdroják od Pločicu do vlastného zadania.
Privlastníme a upravíme si pár vecí:

//tabulka konstant a identifikatorov
int ixtc=0;            /* index volnej pozicie v tabulke konstant */
char* TID[512];  /* tabulka identifikastorov */
int ixti=0;

// rozpoznany symbol
int attr; /* hodnota pre synt.analyzator */


Tu sa sranda končí, treba aj upravovať!
//kody symbolov
enum {
        LAND, LOR,   /* &&   ||  */     //toto alebo
        MUL,DIV       /*  *   /    */      //toto, vyberte podľa vlastného uváženia a zadania
LPAR,RPAR,       /* ( ) */
VALUE,          /* celociselna konstanta */   //plocica tam má ICONST
        }; /* kody symbolov */


/* SYNTAKTICKA ANALYZA */

char *errmsg[]={
     /* 0 */ "Ocakava sa prikaz", //nieje treba
     /* 1 */ "ocakava sa STOP",  //ani toto
     /* 2 */ "ocakava sa identifikator",  //furt nič
     /* 3 */ "ocakava sa =",   //určite nie
     /* 4 */ "ocakava sa ;",   //ee
     /* 5 */ "ocakava sa +,- podvyraz",    //upraviť na svoje! buď * / / alebo && / ||
     /* 6 */ "ocakava sa *,/ podvyraz",    //preč
     /* 7 */ "ocakava sa operand",   //nechať
     /* 8 */ "ocakava sa )",  //samozrejme nechať
     /* 9 */ "ocakava sa + alebo -",   //tak jak o štyri riadky vyššie
     /* 10*/ "ocakava sa * alebo /",   //het
     };



HÁČKA!

SetType HOpnd       = (E VALUE) /* //VALUE - VALUE//| (E ID)*/ | (E LPAR);  // HOpnd premenujte na pravdepodobne HTerm (ak to tak máte vo vašom kóde)
SetType HMul        = HOpnd; //HMul premenovať najlepšie na meno vašej funkcie ktorá sa stará od druhý riadok. napr HAnd alebo HOr..., HOpnd premenovať na HTerm, samozrejme to musí byť každému jasné
SetType HExpr       = HMul; //HMul tak jak o riadok vyššie

//NASLEDUJÚCE RIADKY VÔBEC NETREBA
/*SetType HInput      = (E INPUT);   //tu a ku ďalšim štyrom riadkom som sa ešte nedostal
SetType HOutput     = (E PRINT);
SetType HAssignment = (E LET);
SetType HDeclaration= (E VAR);
SetType HProgram    = HDeclaration|HInput|HAssignment|HOutput|(E STOP);*/



//nemeniť nič!
int synerrs=0;

void error(int n, SetType keys)
{
    printf("SYN_CHYBA: %s\n",errmsg[n]);
synerrs++;
while (!((E symbol) & keys)) getsymbol();
}

void check(int n, SetType keys)
{
if (!((E symbol) & keys)) error(n,keys);
}


Tieto funkcie nebude treba.

void Program(SetType),Declaration(SetType),Assignment(SetType),Output(SetType),Input(SetType);


Nasledujú dôležité úpravy! Toto vyžaduje myslenie!
NAHRÁDZAJÚ VAŠE PÔVODNÉ KÓDY!


int Expr(SetType keys){  //pekný názov, može ostať
int vyst; /* vystupny symbol */  //toto
int h1,h2;                                    //nás nemsí
SetType loopkeys, allkeys;           //trápiť
loopkeys = (E PLUS) | (E MINUS) | HMul;  //vymazať plus a minus, nahradiť vlastným znakom v prvom riadku gramatiky (MUL/DIV/AND/OR). | HMul prepísať na to isté načo ste HMul prepísali pri HÁČKACH o dva code tagy vyššie
allkeys = loopkeys | keys;   //neriešiť
h1=Mul(allkeys);    // Mul zmeniť na funkciu v druhom riadku gramatiky
check(5,allkeys);    // Zmeniť číslo podľa vlastného uváženia
while((E symbol) & loopkeys){   //neriešiť
    if(symbol==PLUS||symbol==MINUS){   //nechať len znak v prvom riadku gramatiky
       vyst=symbol;  //nič
   getsymbol();  //tiež nič
    } else error(9,allkeys);  //zmeniť číslo
h2=Mul(allkeys);  //zmeniť Mul na funkciu v druhom riadku gramatiky
if(vyst==PLUS)h1=h1+h2;  //zmeniť plus na to čo treba a upraviť telo s využitím vlastnej hlavy.
else h1=h1-h2; //else nebude treba, keďže v prvom riadku gramatiky máme všetci len jednu operáciu
    check(5,allkeys);  //zmeniť číslo jak furt...
}
return(h1);
}



// keď ste sa dostali až do druhého ročníka tak dúfam že vam dojde jak toto upraviť (poradím - podľa code boxu nad týmto)
int Mul(SetType keys){ //to je tá druha funkcia vo vašom pôvodnom kóde. (druhý riadok v gramatike, medzi Expr a Term)
int vyst; /* vystupny symbol */
int h1,h2;
SetType loopkeys, allkeys;
loopkeys = (E MUL) | (E DIV) | HOpnd;
allkeys = loopkeys | keys;
h1=Opnd(allkeys);
check(6,allkeys);
while((E symbol) & loopkeys){
    if(symbol==MUL||symbol==DIV){
       vyst=symbol;
   getsymbol();
    } else error(10,allkeys);
h2=Opnd(allkeys);
if(vyst==MUL)h1=h1*h2;
else h1=h1/h2;
    check(6,allkeys);
}

return(h1);
}



// prepísať len názov funkcie a prvé parametre funkcií error a check
int Opnd(SetType keys){ //tak a toto je Term.
int ix;                               //nepoužité, neviem prečo to tu je
int h1;
check(7,HOpnd|keys);
switch(symbol){
case VALUE: h1=TC[attr];getsymbol();  //zmeniť TC[attr] na attr
break;
case ID: h1=0;getsymbol();
break;
case LPAR:
getsymbol();
h1=Expr((E RPAR)|keys);
if(symbol==RPAR)getsymbol();
else error(8,keys);
break;
default: error(7,keys);h1=0;
}
return(h1);
}



EDIT: Mierna úrava. V tute by malo byť všetko potrebné pre úspešné poskladanie zotavenia.
Why do I keep counting?

Cici

Quote from: SteLa on  30.10.2011, 05:52:17
Quote from: Mitwoc on  30.10.2011, 05:25:59
Mohol by mi niekto poradit, ako mam spravit zotavenie pri vyraze "if" ? kde presne volat check() a kde error() ?

Myslim, ze pri if error nevolas a check robis az po ukonceni celej podmienky if, tak by to malo fungovat. Aspon ja mam tak:)

check je vzdy pred borom rozhodovania - cize pre ifom
error volas v podstate vzdy ked tam je getsymbol() - if(symbol == LOGOR ) getsymbol(); else error(4,allkeys);

Cici

nebolo by odveci sa vlastne spytat ze ci to co nam bolo povedane na cvikach resp na prednaske o zotaveni je postacujuce. Teda ci mame robit aj nieco naviac - lebo tak ako to bolo odprezentovane nema fungovat:
- ak je zadane & namiesto && vyhdnoti sa ako chyba a nie ako logAND. To iste pre LogOR
- ak je zadane &&|| tak nevie akz operand ma zobrat
- ak chyba koncova zatvorka tak sa to zle vyhodnoti
- ak je zadane 001 tak zoberie iba poslednu jednotku
- urcite este daco ale nenapada ma co

ja tu niekto kto by vedel odpovedat?

esperian

#336
inak zotavenie je potrebne aj pre interpretator aj pre prekladac ??

Tren

Quote from: esperian on  30.10.2011, 15:52:47
inak zotavenie je potrebne aj pre interpretator aj pre prekladac ??
ano

SteLa

Quote from: Tren on  30.10.2011, 16:02:30
Quote from: esperian on  30.10.2011, 15:52:47
inak zotavenie je potrebne aj pre interpretator aj pre prekladac ??
ano

a to ich mam mat neako osobitne ci co?O.o

trebax

Ak mam obidva operatory && a || neasociativne s rovnakou prioritou a dostanem vstup napr: 1||0&&1, tak zotavenie my ma opravit vstup tymto stylom: (1||0)&&1?

Wolfdale

v netbeanse ked si chcem dat skompilovat kod, tak mi vypisuje chybu pri conio.h

neviete ako to opravit? :P

Ešte sme to nedokončili celkom, ale takmer sme už začali.

xxx3


Wolfdale

dal som to ako comment
vysledok:

build/Debug/Cygwin_4.x-Windows/main.o: In function `main':
/cygdrive/c/Users/***/Desktop/FJaP/main.c:352: undefined reference to `_getch'
collect2: ld returned 1 exit status
make[2]: *** [dist/Debug/Cygwin_4.x-Windows/fjap.exe] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2

Ešte sme to nedokončili celkom, ale takmer sme už začali.

Cici

Quote from: Tux on  30.10.2011, 18:34:45
dal som to ako comment
vysledok:

build/Debug/Cygwin_4.x-Windows/main.o: In function `main':
/cygdrive/c/Users/***/Desktop/FJaP/main.c:352: undefined reference to `_getch'
collect2: ld returned 1 exit status
make[2]: *** [dist/Debug/Cygwin_4.x-Windows/fjap.exe] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2

treba este opravit vestky getch na getchar - pouzi ctrl+H

Quote from: SteLa on  30.10.2011, 18:22:17
Quote from: Tren on  30.10.2011, 16:02:30
Quote from: esperian on  30.10.2011, 15:52:47
inak zotavenie je potrebne aj pre interpretator aj pre prekladac ??
ano

a to ich mam mat neako osobitne ci co?O.o
nie ale ten zdrojak ma v podstate strukturu lexikalna analyza, interpreter, translator a nakonie main

Wolfdale

Quotetreba este opravit vestky getch na getchar - pouzi ctrl+H

a ked ich opravim, ptm si mozem nechat conio.h?

Ešte sme to nedokončili celkom, ale takmer sme už začali.

Cici

Quote from: Tux on  30.10.2011, 18:40:03
Quotetreba este opravit vestky getch na getchar - pouzi ctrl+H

a ked ich opravim, ptm si mozem nechat conio.h?
nie - to conio.h je tam uplne zbytocne

Cici

Quote from: trebax on  30.10.2011, 18:22:44
Ak mam obidva operatory && a || neasociativne s rovnakou prioritou a dostanem vstup napr: 1||0&&1, tak zotavenie my ma opravit vstup tymto stylom: (1||0)&&1?
podla toho co ma robit zotavenie by to malo spravit tak. Ale my sme sa take nic neucili :D cize ak to spravis je to dobre a ak nie ... ktovie :D

SteLa

Quote from: Cici on  30.10.2011, 18:36:55
Quote from: Tux on  30.10.2011, 18:34:45
dal som to ako comment
vysledok:

build/Debug/Cygwin_4.x-Windows/main.o: In function `main':
/cygdrive/c/Users/***/Desktop/FJaP/main.c:352: undefined reference to `_getch'
collect2: ld returned 1 exit status
make[2]: *** [dist/Debug/Cygwin_4.x-Windows/fjap.exe] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2

treba este opravit vestky getch na getchar - pouzi ctrl+H

Quote from: SteLa on  30.10.2011, 18:22:17
Quote from: Tren on  30.10.2011, 16:02:30
Quote from: esperian on  30.10.2011, 15:52:47
inak zotavenie je potrebne aj pre interpretator aj pre prekladac ??
ano

a to ich mam mat neako osobitne ci co?O.o
nie ale ten zdrojak ma v podstate strukturu lexikalna analyza, interpreter, translator a nakonie main

hm povedzme ze somto cele spojila do jedneho bordelu^^

Wolfdale

okay, diky, ide mi to :)

Ešte sme to nedokončili celkom, ale takmer sme už začali.

SteLa

Takze si to len chcem ujasnit, vy tu vsetci mate osobitne interpretator a prekladac do computronu ?? A este osobitne preto robite zotavenie?O.o