Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 4.2:
- C:
- Funktioniert nicht, da dort Lineare Sichtbarkeit genutzt wird.
- Java:
- Der äußerste Block kann keine Klasse darstellen, da es ein "Use x" gibt, welches in Java nicht möglich ist.
- Nimmt man an, dass sich der Block innerhalb einer Funktion befindet, gibt es auch hier
- kontextuelle Fehler, da in Java auch Lineare Sichtbarkeit genutzt wird.
- Des Weiteren können in Java keine Funktion genestet werden.
- Haskell:
- Programm ist korrekt geformt, da die Reihenfolge der Deklarationen in Haskell nicht wichtig ist.
- class Tab {
- // Beinhaltet initiale Deklarationen
- static Tab initial() {...};
- // Prüft, ob Identifier lokal vorhanden ist
- static bool local(Identifier ident, Tab tab) {...}
- // Fügt eine Deklaration in tab hinzu
- static Tab enter(Identifier ident, DeclarationType type, Tab tab) {...}
- // Schlägt Typ einer Deklaration in tab nach
- static DeclarationType define(Identifier ident, Tab tab) {...} //
- // Löst vorherige Verschachtelung auf
- static Tab unnest(Tab tab) {...};
- // Verschachtelt tab
- static Tab nest(Tab tab) {...};
- }
- abstract class Statement {
- // abstrakte evaluator-Funktion
- abstract Tab identify(Tab tab);
- }
- class Block extends Statement {
- Statement root; //Inhalt des Blocks
- Tab identify(Tab tab) {
- return Tab.unnest(root.identify(Tab.nest(tab)));
- }
- }
- class Declaration extends Statement {
- Identifier ident;
- DeclarationType declType;
- Tab identify(Tab tab) {
- // Prüfen, ob Identifier schon deklariert wurde
- if(Tab.local(ident, tab)) {
- throw new Exception(ident + " was already declared!");
- }
- // Identifier und Typ in tab hinzufügen
- return Tab.enter(this.ident, this.declType, tab);
- }
- }
- class Use extends Statement {
- Identifier ident;
- DeclarationType declType;
- Tab identify(Tab tab) {
- // Prüfen, ob ident deklariert wurde
- declType = Tab.def(ident, tab);
- if(declType == null) {
- throw new Exception(ident + " was not declared before use!");
- }
- return tab; //Keine Änderung an tab
- }
- }
- // Bildet die Sequenz ab
- class List extends Statement {
- //Liste von Statements in der Sequenz
- ArrayList<Statement> statements;
- Tab identify(Tab tab) {
- //Alle Statements überprüfen
- for(Statement stat : statements) {
- tab = stat.identify(tab);
- }
- return tab;
- }
- }
- class Identifier {
- ...
- }
- class DeclarationType {
- ...
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement