Re: Problem sa nizovima
Ako uradis ovo(kombinovana sintaksa):
1. des -> ID { $$RESULT = (Item) checkName(ID) }
2. des -> des { load(des) } [expr] { load(exp) }
{ $$RESULT = checkElem(des,exp); }
3. stmt -> des = expr { load(expr) } { store(des) }
4. exp -> des { $$RESULT = des }
5. exp -> NUMBER { $$RESULT = NUMBER }
za ulaz
niz[4] = 5 imaces sledece akcije:
checkName(niz) - smena 1 za niz
load(niz) - smena 2 za niz[4]
load(exp) - smena 2 za niz[4]
checkElem(niz,4) - smena 2 za niz[4] checkElem vraca Item tipa Elem
load(5) - smena 3 za <des:niz[4]> = <exp:5>
store(niz[4]) - smena 3 za <des:niz[4]> = <exp:5>
Na ovaj nacin se prvo ucita adresa niza u drugoj smeni pa vrednost izraza
u drugoj smeni i sintetizovanom atributu $$ ili RESULT se dodeljuje Item
koji je tipa elem. Na ovaj nacin se posle izvrsavanja smene 2 na
expression steku nalaze adresa i index u ispravnom redosledu.
Posle toga u smeni 3 se ucita vrednost izraza i dodeljuje se elementu niza.
U slucaju izraza tipa a[2] = b[6] izvrsice se sledece instrukcije:
load(a) - getstatic 17 smena 2
load(2) - const_2 smena 2
load(b) - getstatic 83 smena 2
load(6) - const 6 smena 2
load(b[6]) - aload smena 3 - load(exp)
store(a[2])- astore smena 3 - store(des)
Slicna logika je za polja objekata. Za polja objekata sam radio jedan
primer na vezbama.
Pozdrav,
Jovan
> Imam problem kod dohvatanja vrednosti niza. Problem je vezan za
> postavljanje
> parametara instrukcije aload i baload na stek. Parametri treba da budu
> ovakvi: adr,index.
> Sledece smene su povezane sa ovim problemom:
>
> 1. designator ::= designator_field;
> 2. designator ::= designator TACKA designator_field;
> 3. designator_field ::= IDENT '[' expression ']';
> 4. factor ::= designator:d {: Code.load(d); :};
> 5. stmt ::= designator JEDNAKO expression;
>
> E sad, u smeni 4. se vrsi ucitavanje "item-a" (vrednosti koju on
> predstavlja) na stek, a to je adresa niza.
> Ovo je kasno sto se tice smene 3. jer se u njoj ucita expression na stek
> koji predstavlja index u nizu, a jos uvek nije ucitana adresa.
>
> Adresa ne moze da se ucita u smeni 3. u akciji koja bi bila iza IDENT, jer
> se tada jos uvek ne zna da li je promenljiva koju item predstavlja biti sa
> leve ili sa desne strane operatora dodele. Ako je sa leve ne treba
> ucitavati
> vrednost na stek, vec je treba sa steka smestiti u data memoriju.
>
> Da li je neko imao ovakvih problema i kako ovo moze da se resi.
> Ja imam samo neke ideje koje predstavljaju "budzenje": tipa koriscenje
> neke
> programu nevidljive mem. lokacije koju bih koristio da obrnem redosled adr
> i
> index-a, sto bi zahtevalo izmenu metode load u klasi Code.
> Druga ideja je da stavim jednu boolean preomenljivu koja se zove npr.
> desno_od_dodele i koju bih postavljao na false u smeni 5 ispred
> designator,
> ali to ne pali jer mi cup javlja konflikt tada.
>
> Hvala svima na pomoci.
>
> Pozdrav, Rade
>
1. des -> ID { $$RESULT = (Item) checkName(ID) }
2. des -> des { load(des) } [expr] { load(exp) }
{ $$RESULT = checkElem(des,exp); }
3. stmt -> des = expr { load(expr) } { store(des) }
4. exp -> des { $$RESULT = des }
5. exp -> NUMBER { $$RESULT = NUMBER }
za ulaz
niz[4] = 5 imaces sledece akcije:
checkName(niz) - smena 1 za niz
load(niz) - smena 2 za niz[4]
load(exp) - smena 2 za niz[4]
checkElem(niz,4) - smena 2 za niz[4] checkElem vraca Item tipa Elem
load(5) - smena 3 za <des:niz[4]> = <exp:5>
store(niz[4]) - smena 3 za <des:niz[4]> = <exp:5>
Na ovaj nacin se prvo ucita adresa niza u drugoj smeni pa vrednost izraza
u drugoj smeni i sintetizovanom atributu $$ ili RESULT se dodeljuje Item
koji je tipa elem. Na ovaj nacin se posle izvrsavanja smene 2 na
expression steku nalaze adresa i index u ispravnom redosledu.
Posle toga u smeni 3 se ucita vrednost izraza i dodeljuje se elementu niza.
U slucaju izraza tipa a[2] = b[6] izvrsice se sledece instrukcije:
load(a) - getstatic 17 smena 2
load(2) - const_2 smena 2
load(b) - getstatic 83 smena 2
load(6) - const 6 smena 2
load(b[6]) - aload smena 3 - load(exp)
store(a[2])- astore smena 3 - store(des)
Slicna logika je za polja objekata. Za polja objekata sam radio jedan
primer na vezbama.
Pozdrav,
Jovan
> Imam problem kod dohvatanja vrednosti niza. Problem je vezan za
> postavljanje
> parametara instrukcije aload i baload na stek. Parametri treba da budu
> ovakvi: adr,index.
> Sledece smene su povezane sa ovim problemom:
>
> 1. designator ::= designator_field;
> 2. designator ::= designator TACKA designator_field;
> 3. designator_field ::= IDENT '[' expression ']';
> 4. factor ::= designator:d {: Code.load(d); :};
> 5. stmt ::= designator JEDNAKO expression;
>
> E sad, u smeni 4. se vrsi ucitavanje "item-a" (vrednosti koju on
> predstavlja) na stek, a to je adresa niza.
> Ovo je kasno sto se tice smene 3. jer se u njoj ucita expression na stek
> koji predstavlja index u nizu, a jos uvek nije ucitana adresa.
>
> Adresa ne moze da se ucita u smeni 3. u akciji koja bi bila iza IDENT, jer
> se tada jos uvek ne zna da li je promenljiva koju item predstavlja biti sa
> leve ili sa desne strane operatora dodele. Ako je sa leve ne treba
> ucitavati
> vrednost na stek, vec je treba sa steka smestiti u data memoriju.
>
> Da li je neko imao ovakvih problema i kako ovo moze da se resi.
> Ja imam samo neke ideje koje predstavljaju "budzenje": tipa koriscenje
> neke
> programu nevidljive mem. lokacije koju bih koristio da obrnem redosled adr
> i
> index-a, sto bi zahtevalo izmenu metode load u klasi Code.
> Druga ideja je da stavim jednu boolean preomenljivu koja se zove npr.
> desno_od_dodele i koju bih postavljao na false u smeni 5 ispred
> designator,
> ali to ne pali jer mi cup javlja konflikt tada.
>
> Hvala svima na pomoci.
>
> Pozdrav, Rade
>
- References:
- Problem sa nizovima
- From: "Rade Jakovljević" <radegm@gmail.com>
- Problem sa nizovima
Previous by date: Re: Alokacija String objekata
Next by date: [Fwd: Re: Problem sa nizovima]
Previous by thread: Problem sa nizovima Next by thread: [Fwd: Re: Problem sa nizovima]
Previous by thread: Problem sa nizovima Next by thread: [Fwd: Re: Problem sa nizovima]