«« ( Date ) »» // «« ( Thread ) »» // si4pp1 - 2009

Re: Pitanje u vezi projekta iz PP1

by Dragan Bojic
ponedeljak, 14. decembar 2009 - 17:15.

> 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.