«« ( Date ) »» // «« ( Thread ) »» // ri4pp - 2005

Jucerasnja rasprava na temu u kom redosledu se redukuju smene

by Jovan Popovic
četvrtak, 26. maj 2005 - 09:24.

Juce je na veybama bilo rasprave u kom redosledu se redukuju smene za
a.b.c.d i sl.

Ovo je primer koji treba da simulira te smene:

Ubacite ovaj kod/klase u vas cup skript (one simuliraju tabelu simbola,
klasu Item i codegenerator):
class Item{

String name, kind, type, adr;
public void load(){
if(kind.equals("STATIC"))
System.out.println("getstatic "+" adr(" + name + ")");
if(kind.equals("FLD"))
System.out.println("getfield "+" adr(" + name + ")");
}
public String toString(){
return "Item{\n name="+name+";\n kind="+kind+";\n type="+type + ";\n}\n";
}
}


/**
Nalazi klasu za ime promenljive fiksno za promenljivu f je klasa F, demo
verzija
*/
public static String GetClass(String name)
{ return name.toUpperCase();
}

Ubacite smene da analizu polja:

Designator ::= Designator:o DOT IDENTIFIKATOR:id
{: Item r = new Item();
r.name = id; r.kind = "FLD";
//Ovo bi se punilo iz tabele
simbola System.out.println("Pronalazim klasu " +o.type + " u
tabeli simbola i uzimam njen scope
"); System.out.println("Proveravam da li u opsegu klase "
+o.type + " postoji polje " +
id); System.out.println("Nalazim u klasi " +o.type + "
polje " + id +" (nalazim njegov type i adress)");
r.type = GetClass(id);
System.out.println("\nProsledjujem gornjoj smeni " +r.toString());
o.load();
RESULT=r; :};

Designator ::= IDENTIFIKATOR:id {: Item o = new Item();
o.name = id;
o.kind = "STATIC";
//Ovo bi se punilo iz tabele simbola
System.out.println("Pronalazim simbol " + id + " u tabeli simbola
i uzimam njegov type i address ");
o.type = GetClass(id);
System.out.println("\nProsledjujem gornjoj smeni " +o.toString());
RESULT=o; :};

Kada pokrenete ovakvu smenu za ulaz:

a.b.c.d.i

Dobijate izlaz:




Pronalazim simbol a u tabeli simbola i uzimam njegov type i address

Prosledjujem gornjoj smeni Item{
name=a;
kind=STATIC;
type=A;
}

Pronalazim klasu A u tabeli simbola i uzimam njen scope
Proveravam da li u opsegu klase A postoji polje b
Nalazim u klasi A polje b (nalazim njegov type i adress)

Prosledjujem gornjoj smeni Item{
name=b;
kind=FLD;
type=B;
}

getstatic adr(a)
Pronalazim klasu B u tabeli simbola i uzimam njen scope
Proveravam da li u opsegu klase B postoji polje c
Nalazim u klasi B polje c (nalazim njegov type i adress)

Prosledjujem gornjoj smeni Item{
name=c;
kind=FLD;
type=C;
}

getfield adr(b)
Pronalazim klasu C u tabeli simbola i uzimam njen scope
Proveravam da li u opsegu klase C postoji polje d
Nalazim u klasi C polje d (nalazim njegov type i adress)

Prosledjujem gornjoj smeni Item{
name=d;
kind=FLD;
type=D;
}

getfield adr(c)
Pronalazim klasu D u tabeli simbola i uzimam njen scope
Proveravam da li u opsegu klase D postoji polje i
Nalazim u klasi D polje i (nalazim njegov type i adress)

Prosledjujem gornjoj smeni Item{
name=i;
kind=FLD;
type=I;
}

getfield adr(d)








Kao sto vidite:
1. PRVO se obradjuju levi simboli prvo a pa b pa c itd.
2. Item se ispravno prosledjuju gornjoj smeni
3. kod koji se generise je

getstatic adr(a)
getfield adr(b)
getfield adr(c)
getfield adr(d)

koji ispravno ubacuje na stek izraza referencu na a.b.c.d i prosledjuje
gornjoj smeni
Item tipa FLD sa adresom polja i. Ona ce odluciti sta se radi sa trenutnom
adresom na
steku izraza i Item-om i koji je prosledjen.

Nadam sa da ste sad uvereni u kom redosledu se redukuju smene(a narocito
ZNase Co)

Pozdrav,
Jovan