• Keine Ergebnisse gefunden

Con , Local , Static , Stack , Fld , Elem , Meth Klasse

N/A
N/A
Protected

Academic year: 2022

Aktie "Con , Local , Static , Stack , Fld , Elem , Meth Klasse"

Copied!
13
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

1

Klasse Item

class Item {

public enum Kind { // Mögliche Item-Arten Con, Local, Static, Stack, Fld, Elem, Meth }

public Kind kind; // Item-Art

public Struct type; // Typ des Operanden public int val; // Con: Wert

public int adr; // Local, Static, Fld, Meth: Adresse

public Obj obj; // Meth: Methodenobjekt aus Symbolliste }

Local pStack

fp adr

Static data

adr

Stack eStack

esp

Fld

Heap object

offset

eStack

addr.

Elem

Heap array eStack

addr.

index

len

(2)

Beispiel

Assignment = Designator "=" Expr . Expr = Term { "+" Term } .

Term = Factor { "*" Factor } . Factor = number | Designator.

Designator = ident [ "." ident | "[" Expr "]" ].

(3)

3

Designator erkennen

void Designator() { check(ident);

if (sym == period) { scan();

check(ident);

} else if (sym == lbrack) { scan();

Expr();

check(rbrack);

} }

(4)

Item erzeugen

Item Designator() { check(ident);

Item x = new Item(tab.find(t.str), this);

if (sym == period) { scan();

check(ident);

Obj obj = tab.findField(t.str, x.type);

x.kind = Item.Kind.Fld; x.type = obj.type; x.adr = obj.adr } else if (sym == lbrack) {

scan();

Item y = Expr();

x.kind = Item.Kind.Elem; x.type = x.type.elemType;

check(rbrack);

} return x;

(5)

5

Code erzeugen

Item Designator() { check(ident);

Item x = new Item(tab.find(t.str), this);

if (sym == period) { scan();

code.load(x);

check(ident);

Obj obj = tab.findField(t.str, x.type);

x.kind = Item.Kind.Fld; x.type = obj.type; x.adr = obj.adr } else if (sym == lbrack) {

scan();

code.load(x);

Item y = Expr();

code.load(y);

x.kind = Item.Kind.Elem; x.type = x.type.elemType;

check(rbrack);

} return x;

}

x.type.kind == Struct.Kind.Class

x.type.kind == Struct.Kind.Arr y.type == Tab.intType

(6)

Konstruktor Item(Obj)

Item(Obj o, Parser parser) { type = o.type;

val = o.val;

adr = o.adr;

switch (o.kind) { case Con:

kind = Kind.Con;

break;

case Var:

if (o.level == 0) { kind = Kind.Static; } else { kind = Kind.Local; } break;

case Meth:

kind = Kind.Meth; obj = o;

break;

default:

parser.error(NO_ITEM);

}

(7)

Code . load()

void load(Item x) { switch (x.kind) {

case Con: loadConst(x.val); break;

case Local:

switch (x.adr) {

case 0: put(OpCode.load_0); break;

case 1: put(OpCode.load_1); break;

case 2: put(OpCode.load_2); break;

case 3: put(OpCode.load_3); break;

default: put(OpCode.load); put(x.adr); break;

} break;

case Static: put(OpCode.getstatic); put2(x.adr); break;

case Stack: break; // nothing to do (already loaded) case Fld: put(OpCode.getfield); put2(x.adr); break;

case Elem:

if (x.type == Tab.charType) { put(OpCode.baload); } else { put(OpCode.aload); }

break;

default: parser.error(NO_VAL);

} x.kind = Item.Stack;

}

(8)

Factor und Term

Item Factor() { Item x;

if (sym == number) { scan();

x = new Item(t.val);

} else {

x = Designator();

} return x;

}

Item Term() {

Item x = Factor();

while (sym == times) { scan();

code.load(x);

Item y = Factor();

code.load(y);

code.put(OpCode.mul);

} return x;

x.type == Tab.intType &&

y.type == Tab.intType

(9)

9

Expr und Assignment

Item Expr() {

Item x = Term();

while (sym == plus) { scan();

code.load(x);

Item y = Term();

code.load(y);

code.put(OpCode.add);

}

return x;

}

x.type == Tab.intType &&

y.type == Tab.intType

void Assignment() { Item x = Designator();

check(assign);

Item y = Expr();

code.assign(x, y);

}

y.type.assignableTo(x.type)

(10)

Klasse Code – Hilfsmethode assign

void assign(Item x, Item y) { load(y);

switch (x.kind) { case Local:

switch (x.adr) {

case 0: put(OpCode.store_0); break;

case 1: put(OpCode.store_1); break;

case 2: put(OpCode.store_2); break;

case 3: put(OpCode.store_3); break;

default: put(OpCode.store); put(x.adr); break;

} break;

case Static: put(OpCode.putstatic); put2(x.adr); break;

case Fld: put(OpCode.putfield); put2(x.adr); break;

case Elem:

if (x.type == Tab.charType) { put(OpCode.bastore); } else { put(OpCode.astore); }

break;

default: parser.error(NO_VAR);

(11)

11

Klasse Struct – Hilfsmethoden

boolean isRefType() {

return kind == Kind.Class || kind == Kind.Arr;

}

boolean equals(Struct other) { if (kind == Kind.Arr) {

return other.kind == Kind.Arr && elemType.equals(other.elemType);

} else {

return this == other; // must be same type node }

}

(12)

Klasse Struct – Hilfsmethoden

boolean compatibleWith(Struct other) { return this.equals(other) ||

(this == Tab.nullType && other.isRefType()) ||

(other == Tab.nullType && this.isRefType());

}

boolean assignableTo(Struct dest) { return this.equals(dest) ||

(this == Tab.nullType && dest.isRefType()) ||

(this.kind == Kind.Arr && dest.kind == Kind.Arr &&

dest.elemType == Tab.noType); // for function len() }

(13)

13

Beispiel: b.x = iarr[5] + i * n

Deklaration: program A

final int max = 12; // Konstante

char c; int i; // globale Variablen

class B { int x, y; } // innere Klasse mit Feldern { void foo () int[] iarr; B b; int n; {…} }

Var

"x"

intType 0 1 - - Con

"max"

intType 12

- - -

3 -

2

Class - 2 Var

"c"

charType 0 0 - -

Var

"i"

intType 1 0 - -

Type

"B"

- - - -

Var

"y"

intType 1 1 - - Var

"iarr"

0 1 - -

Var

"b"

1 1 - -

Var

"n"

intType 2 1 - - Arr

intType - -

Meth

"foo"

noType - - - -

Referenzen

ÄHNLICHE DOKUMENTE

Codeitem-Klasse Item class Item{ public staticfinal int// Item Art Con=0, Local=1, Static=2, Stack=3, Fld=4, Elem=5, Meth=6; public int kind; public Struct type;// Typ des

Con=0, Local=1, Static=2, Stack=3, Fld=4, Elem=5, Meth=6;. public int kind;

public enum Kind { // Mögliche Item-Arten Con, Local, Static, Stack, Fld, Elem, Meth } public Kind kind; // Item-Art. public Struct type; // Typ des Operanden public int val;

public enum Kind { // Mögliche Item-Arten Con, Local, Static, Stack, Fld, Elem, Meth }.. public Kind kind;

After having established the quoted result for Floyd's algorithm, it is used for a derivation of the expected number of interchanges, and of comparisons, which

Doppelt verkettete Listen bestehen aus Listenzellen mit zwei Zeigern. • Ein Zeiger prev auf die

verschachtelten Prozeduren m¨ ussen viele Zugriffslinks verfolgt werden. Abhilfe: Displays

Stacks intelligently show the most relevant items first or you can set the sort order to make sure the items you care about most always appear at the top of the stack.. To