package derivacnistrom; /** * Implementace cyklu FOR * FOR(promennaID=a TO b step c) potomek2 NEXT potomek */ public class FORstrom extends DerivacniStrom { int promennaID; int a,b,c; //a: od; b: do; c: step /** * Konstruktor pro vytvoření for cyklu - pamatuje si důležitá data: jako ID proměnné, a hodnoty jednotlivých parametrů */ public FORstrom(int promennaID,int a,int b,int c) { this.promennaID=promennaID; this.a=a; this.b=b; this.c=c; } /*******************************************************************************************/ /** * Funkce generate - slouží v vygenerování kódu */ @Override public void generate(PomocnaPriPrekladu ppp) { ppp.pridatKomentarBezEnteru("FOR "+vratitTabulkuPromennych().najitPromennou(promennaID)+" = "+a+" TO "+b+" STEP "+c,true); //do i nahrajeme od ppp.pridatRadekOdsazeny("ldc "+a); ppp.pridatRadekOdsazeny("istore "+promennaID); String l1="L"+ppp.vratitNoveNavesti(); //startovní String l2="L"+ppp.vratitNoveNavesti(); //koncové ppp.pridatRadek(l1+":"); //porovnáme od a do ppp.pridatRadekOdsazeny("iload "+promennaID); ppp.pridatRadekOdsazeny("ldc "+b); ppp.pridatRadekOdsazeny("if_icmpgt "+l2); //pokud je od==do, skončíme //provedení vnitřku ppp.pridatBreakNavesti(l2); ppp.pridatKomentarBezEnteru("TELO CYKLU FOR",true); ppp.zvetsitUrovenOdsazeni(); referenceNaPotomka2().generate(ppp); ppp.zmensitUrovenOdsazeni(); ppp.pridatKomentarBezEnteru("KONEC TELA CYKLU FOR",true); ppp.odebratBreakNavesti(); //inkrementace i, skok na začátek ppp.pridatRadekOdsazeny("iinc "+promennaID+" "+c); ppp.pridatRadekOdsazeny("goto "+l1); //konec cyklu ppp.pridatRadek(l2+":"); //připojíme potomka referenceNaPotomka().generate(ppp); } /*******************************************************************************************/ /** * Funkce to string, vylepšená o odsazení */ @Override public String toString(int odsazeni) { String str; str=odsazeniString(odsazeni)+"FOR ( "+vratitTabulkuPromennych().najitPromennou(promennaID)+" = "+a+" TO "+b+" STEP "+c+") \n"; str+=referenceNaPotomka2().toString(odsazeni+1)+"\n"; str+=odsazeniString(odsazeni)+"NEXT //"+vratitTabulkuPromennych().najitPromennou(promennaID)+"\n"; str+=referenceNaPotomka().toString(odsazeni); return str; } @Override public String toString() { return toString(0); } /*******************************************************************************************/ }