Omgevingen zijn dan geïmplementeerd als Symbol Tables.
description
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