Re: Pitanje u vezi projekta iz PP1
> 1. U klasi Code se pristupa constanti Obj.Elem, ali ona nije definisana u
> klasi Obj, pa se prijavljuje greska. Da li to treba dodati u klasu Obj?
Da, po ugledu na primer mini domaceg, treci deo.
> 2. Nije mi bas najjasnije kako generisati kod za if/while kontrole. Posto u
> klasi Code ne postoje nesto vezano za skokve sto bi mogli da koristimo. Imaju
> 3 metode u klasi Code koje bi mogle da se koriste za to, ali one su pod
> komentarom, a i da nisu u njima se koriste neke klase koje nisu definisane, pa
> me zanima na koji nacin to implementirati?
>
Te zakomentarisane metode treba ignorisati.
Evo kako treba da glase metode u klasi Code za skokove:
// generate unconditional jump
void putJump (int adr) {
put(jmp); put2(adr);
}
// generate a conditional jump
void putFalseJump (int op, int adr) {
put(jeq + inverse[op]); put2(adr);
}
// patch the jump address at adr so that it leads to pc
void fixup (int patchAdr) {
put2(patchAdr, pc);
}
Princip generisanja koda za if naredbe:
IfStatement ::= "if" "(" Condition:op ")" {: Code.putFalseJump(op, 0);
int adr = Code.pc - 2;
:}
Statement
( "else" {: Code.putJump(0);
int adr2 = Code.pc - 2;
Code.fixup(adr);
:}
Statement {: Code.fixup(adr2); :}
| /* epsilon */ {: Code.fixup(adr); :}
).
Ako je skok unapred, zapamtimo mesto u bajtkodu (adresni deo jmp naredbe)
na kome naknadno treba izvrsiti prepravku, upisati adresu skoka kad bude poznata.
> klasi Obj, pa se prijavljuje greska. Da li to treba dodati u klasu Obj?
Da, po ugledu na primer mini domaceg, treci deo.
> 2. Nije mi bas najjasnije kako generisati kod za if/while kontrole. Posto u
> klasi Code ne postoje nesto vezano za skokve sto bi mogli da koristimo. Imaju
> 3 metode u klasi Code koje bi mogle da se koriste za to, ali one su pod
> komentarom, a i da nisu u njima se koriste neke klase koje nisu definisane, pa
> me zanima na koji nacin to implementirati?
>
Te zakomentarisane metode treba ignorisati.
Evo kako treba da glase metode u klasi Code za skokove:
// generate unconditional jump
void putJump (int adr) {
put(jmp); put2(adr);
}
// generate a conditional jump
void putFalseJump (int op, int adr) {
put(jeq + inverse[op]); put2(adr);
}
// patch the jump address at adr so that it leads to pc
void fixup (int patchAdr) {
put2(patchAdr, pc);
}
Princip generisanja koda za if naredbe:
IfStatement ::= "if" "(" Condition:op ")" {: Code.putFalseJump(op, 0);
int adr = Code.pc - 2;
:}
Statement
( "else" {: Code.putJump(0);
int adr2 = Code.pc - 2;
Code.fixup(adr);
:}
Statement {: Code.fixup(adr2); :}
| /* epsilon */ {: Code.fixup(adr); :}
).
Ako je skok unapred, zapamtimo mesto u bajtkodu (adresni deo jmp naredbe)
na kome naknadno treba izvrsiti prepravku, upisati adresu skoka kad bude poznata.
Previous by date: Poeni sa odbrane domaceg zadatka, apsolventski rok
Next by date: Pomeranje roka za predaju domaceg zadatka
Previous by thread: Poeni sa odbrane domaceg zadatka, apsolventski rok Next by thread: Pomeranje roka za predaju domaceg zadatka
Previous by thread: Poeni sa odbrane domaceg zadatka, apsolventski rok Next by thread: Pomeranje roka za predaju domaceg zadatka