Download - Omgevingen zijn dan geïmplementeerd als Symbol Tables.

Transcript
Page 1: Omgevingen zijn dan geïmplementeerd als Symbol Tables.

• Omgevingen zijn dan geïmplementeerd als Symbol Tables.

• Symbol Table mapt een symbool met een Binding

• Meerdere noties van binding– Meerdere manieren te gebruiken door de

compiler.– Type voor types, value voor variables.

• In 1 table -> 1 gebruik.

Page 2: Omgevingen zijn dan geïmplementeerd als Symbol Tables.

CODE SLIDE AUB package Symbol;

public Class Symbol{

public String tostring();

public static Symbol symbol(string s);

}

public class Table{

public Table();

public void put(Symbol key,Object value);

public Object get(Symbol Key);

public void beginscope();

public void endscope();

public java.util.Enumeration keys();

}

Page 3: Omgevingen zijn dan geïmplementeerd als Symbol Tables.

Symbool Implementatie

• In java : java.lang.String maakt van elke string een uniek object.

• Symbool -> String : elk symbool bevat een string.

• String -> Symbool : Moet via een hast-tabel. (java.util.hashtable)

Page 4: Omgevingen zijn dan geïmplementeerd als Symbol Tables.

CODE SLIDE AUB package Symbol;

public Class Symbol{

public String tostring();

public static Symbol symbol(string s);

}

public class Table{

public Table();

public void put(Symbol key,Object value);

public Object get(Symbol Key);

public void beginscope();

public void endscope();

public java.util.Enumeration keys();

}

Page 5: Omgevingen zijn dan geïmplementeerd als Symbol Tables.

.

• beginscope()– Onthoudt de huidige omgeving van de tabel.

• endscope()– Zet de tabel terug in de staat van de meest

recente, niet geëindigde beginscope().

• Dienen voor als een omgeving beëindigt wordt gedane veranderingen ongedaan maken.

Page 6: Omgevingen zijn dan geïmplementeerd als Symbol Tables.

CODE SLIDE AUB package Symbol;

public Class Symbol{

public String tostring();

public static Symbol symbol(string s);

}

public class Table{

public Table();

public void put(Symbol key,Object value);

public Object get(Symbol Key);

public void beginscope();

public void endscope();

public java.util.Enumeration keys();

}

Page 7: Omgevingen zijn dan geïmplementeerd als Symbol Tables.

Symbool tables voor imperatieve tables

• X -> b toevoegen.

• X wordt gehashed tot index i.

• Er wordt een Binder Object X -> b aangemaakt.

• X -> b’ wordt niet overschreven maar is niet meer bereikbaar in huidige omgeving.

Page 8: Omgevingen zijn dan geïmplementeerd als Symbol Tables.

• Nood aan een stack.

• Wat wordt er op stack gegooid ?– X indien X -> b wordt toegevoegd.– Speciaal Teken als beginscope() wordt

uitgevoerd.

• Bij endscope() worden alles uit de stack tot aan het speciale teken verwijdert en uit de symbool table gehaald.

Page 9: Omgevingen zijn dan geïmplementeerd als Symbol Tables.

5.2 Type checking.

• Wat zetten we in de tables?

• Welke bindings gebruiken ?– Variabelen en formele parameters -> type– Methodes -> Parameters, resultaats type &

lokale variabelen– Klassen -> Methodes en variabelen declaraties

Page 10: Omgevingen zijn dan geïmplementeerd als Symbol Tables.
Page 11: Omgevingen zijn dan geïmplementeerd als Symbol Tables.

2 fasen.

• De symbool Tabel opmaken.• Type-check alle statements en expressies.

– Tijdens fase 2 : voor elke identifier token wordt de tabel geraadpleegd.

2 fasen nodig omdat de oproep van een methode kan voorkomen voor de declaratie van een methode.

Page 12: Omgevingen zijn dan geïmplementeerd als Symbol Tables.

1e fase

• Dit kan geïmplementeerd worden via een visitor.

• De visitor bezoekt elke node in de abstract syntax tree en bouwt de symbool tabel op.– Voeg voor elke variabele naam en type toe.– Elke variabele maar 1 maal per omgeving

gedeclareert.

Page 13: Omgevingen zijn dan geïmplementeerd als Symbol Tables.

.// VarDecl -> Type id ;// Type t// Identifier ipublic void visit(VarDecl n) {

Type t = n.t.accept(this)Symbol id = Symbol.symbol(n.i.toString());bool result;if (currMethod == null) /* in klasse */

result = currClass.addVar(id,t);else /* in methode */

result = currMethod.addVar(id,t);if (!result)error.complain(id.toString() + “ is already defined”);

Page 14: Omgevingen zijn dan geïmplementeerd als Symbol Tables.

2e fase

• Visitor checkt voor expressie en statement het type.

• Visitor returnt het type van de expressie.

• Visitor returnt een error message.

Page 15: Omgevingen zijn dan geïmplementeerd als Symbol Tables.

// Exp e1, e2;public Type visit(Plus n) {

if (! (n.e1.accept(this) instanceof IntegerType) )error.complain(“Left side of Plus must be integer”);

if (! (n.e2.accept(this) instanceof IntegerType) )error.complain(“Right side of Plus must be integer”);

return new IntegerType();}

• Beide operanden van n moeten integers zijn.• Return type zal ook integer zijn.

Page 16: Omgevingen zijn dan geïmplementeerd als Symbol Tables.

Overloading.

• Som van 2 integers is een integer.

• Integer + Real ??

• In meeste talen wordt impliciet de int omgezet naar een real.

• Dit moet later ook expliciet worden gemaakt door de compiler in de code die hij genereert.

Page 17: Omgevingen zijn dan geïmplementeerd als Symbol Tables.

Toekenningen.

• Left hand side moet het zelfde type hebben als de right hand side.

• Bij overerving of extensies moet het rechtse type een subtype zijn van het linkse type.– Person p = new Woman();

Page 18: Omgevingen zijn dan geïmplementeerd als Symbol Tables.

Method calls.

Bv : C e = new C();

e.m( int i);-> e heeft type C.

-> definitie van m opgezocht in classe C.

-> parameter types gematcht met de formele argument types.

-> result type = return type van de methode.

Page 19: Omgevingen zijn dan geïmplementeerd als Symbol Tables.

Error handling.

• Bij een error moet een error message geprint worden met aard en locatie van de fout. int i = new String();

Error Illegal …. Line 1….

• i moet toch in tabel worden opgenomen voor verdere fouten na te gaan.

Page 20: Omgevingen zijn dan geïmplementeerd als Symbol Tables.

Error handling.

• Compiler mag geen foute output code geven bij een type check error.– Latere fases van compilatie moeten opgeschort

worden.– Alle (niet-logische) fouten in code moeten voor

of tijdens de semantische analyse gevonden worden.

– Tot zover de analyse fase.

Page 21: Omgevingen zijn dan geïmplementeerd als Symbol Tables.

Einde Analyse

Einde Les 3