Prekladače
{
E.place = newtemp();
gen(if id1.place relop id2.place goto next+3)
gen(E.place = 0);
gen(goto next+2);
gen(E.place = 1);
}
{
E.true = newlabel();
E.false = S.next();
S1.next = S.next();
S.code = E.code + "E.true :" + S1.code
}
{
E.true = newlabel();
E.false = newlabel();
S1.next = S.next;
S2.next = S.next;
S.code = E.code + "E.true :" + S1.code + "goto S.next" + "E.false :" + S2.code
}
{
E.true = newlabel();
E.false = S.next;
S.begin = newlable();
S1.next = S.begin;
S.code = "S.begin" + E.code + "E.true :" + S1.code + "goto S.begin"
}
{
E1.true = E.true;
E1.flase = newlabel();
E2.true = E.true;
E2.false = E.false;
E.code = E1.code + "E1.false :" + E2.code
}
{
E1.true = newlabel();
E1.false = E.false;
E2.true = E.true;
E2.false = E.flase;
E.code = E1.code + "E1.true :" + E2.code;
}
{
E.tlist = makelist(next);
E.flist = makelist(next + 1);
gen("if id1.place relop id2.place goto -");
gen("goto -");
}
{
backpatch(E.tlist, M1.quad);
backpatch(E.flist, M2.quad);
S.nlist = merge(S1.nlist, S2.nlist, N.nlist);
}
{
backpatch(S.nlist, M1.quad);
backpatch(E.tlist, M2.quad);
S.nlist = E.flist;
gen("goto M1.quad");
}
LIVE problem
premenná i je živá v uzle u, ak existuje cesta z u do nejakého
uzlu v, že spočítaná hodnota i v u je vo v použitá
+ - LIVE
+ - KILL
+ - NOTKILL
+ - GEN
+ - systém vzájomne rekurzívnych rovníc
postupne prelez všetky prvky
NEWLIVETOP=zjednotenie LIVETOP cez vvšetkých predchodcov,
prienik s NOTKILL uzlu, zjednotené s GEN uzlu
ak došlo k zmene NEWLIVETOP od LIVETOP, použi LIVEIN
1. čítaj inštrukciu
ak je to popis operandu ulož na zásobník a opakuj 1.
2. Vyber tabuľku pre načítaný operátor
vyber položku podľa druhého operandu na zásobníku
3. Ak je má niektorý operand popis na zásobníku,
ulož stradač, s výnimkou výrazou, ktoré vystupujú
v práve spracovávanom výraze.
Ulož stradač a označ ho v zásobníku označením pomocnej premennej
4. Generuj inštrukcie
5. Zo zásobníku zruš použíté operandy
a na zásobník pridaj označenie miesta, kde bol
uložený výsledok