Omgevingen zijn dan geïmplementeerd als Symbol Tables.

Post on 21-Jan-2016

49 views 0 download

description

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. package Symbol; public Class Symbol{ - PowerPoint PPT Presentation

Transcript of 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.

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();

}

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)

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();

}

.

• 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.

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();

}

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.

• 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.

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

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.

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.

.// 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”);

2e fase

• Visitor checkt voor expressie en statement het type.

• Visitor returnt het type van de expressie.

• Visitor returnt een error message.

// 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.

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.

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();

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.

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.

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.

Einde Analyse

Einde Les 3