Geltungsbereiche

Benutzeravatar
hymGo
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 209
Registriert: 4. Okt 2009 23:17

Geltungsbereiche

Beitrag von hymGo » 6. Feb 2012 21:04

Hi,
ich hätte da eine Fragen zu den Geltungsbereichen. Im Foliensatz zur Kontextuellen-Analyse steht auf Folie 9, dass ein Block (der einen Geltungsbereich "definiert"/öffnet) entweder eine Prozedurdefinition oder ein let Declaration in Command ist. Nun wird bei der Code-Generieung jedoch zu jeder Variable nur die Schachtelungstiefe der Prozedur gespeichert (F. 62) und auch nur bei Prozedurdefinition die Schachtelungstiefe (F. 72) erhöht.

Wenn man nun nach der Regel der Code-Generierung geht wäre dann ja folgendes ein "kontextueller Fehler" (entschuldigt meine Syntax Fehler, falls ich welche gemacht habe :mrgreen:) :

Code: Alles auswählen

let
   const a ~ 2
in
   let
      const a ~ 2
   in
      .... do something
   ;
  ... do something2
Denn das zweite let, würde hier die Schachtelungstiefe ja nicht erhöhen. Oder erhöht das let die Schachtelungstiefe doch und es wurde in der Conde-Generierung nur nicht behandelt.
Oder... dritte Möglichkeit: Liege ich irgendwie verkehrt ^^

Dennis Albrecht
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 222
Registriert: 4. Okt 2010 18:15

Re: Geltungsbereiche

Beitrag von Dennis Albrecht » 6. Feb 2012 21:31

Falls du dich an die Symboltabelle (Übung 2) erinnerst, kannst du in Triangle einen Variablennamen doppelt verwenden (natürlich nur auf verschiedenen Ebenen). Bei der semantischen Prüfung wird nun überprüft, ob der aktuelle Typ der Variablen zur Verwendung der Variablen passt (+ nur auf Integer, and nur auf bool). In der Symboltabelle erhöhen sowohl ein Funktionsaufruf als auch ein let die Ebene (und auch ein geschachteltes let). Das wars dann auch grob zur Prüfung.

Bei der Codegenerierung wird nun nur noch geschaut, wo im Stack die Variable liegt. Hier ist nur noch von Interesse mit welchem Offset zu welcher Adresse der Wert liegt. Bezogen auf dein Beispiel müsste (!) das erste a zum Beispiel auf 3[LB] und dein zweites a auf 4[LB] liegen, wobei bekannt ist, dass im inneren let die Deklaration vom inneren a das äußere überlagert und das äußere nicht sicht- und zugreifbar ist. Namen sind hier nur Schall und Rauch :D

Ich hoffe deine Frage beantwortet zu haben, und: Keine Garantie :D

Gruß

Jens Huthmann
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 192
Registriert: 10. Nov 2011 19:42

Re: Geltungsbereiche

Beitrag von Jens Huthmann » 7. Feb 2012 11:56

Für den Syntaxcheck liegen die Variablen und Konstanten in unterschiedlichen Verschachtelungstiefen.

Für die Codegeneration hingegen liegen die Variablen und Konstanten in der gleiche Ebene, da diese hier nur durch Prozeduraufrufe sich ändert.

Benutzeravatar
hymGo
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 209
Registriert: 4. Okt 2009 23:17

Re: Geltungsbereiche

Beitrag von hymGo » 7. Feb 2012 14:55

Jens Huthmann hat geschrieben:Für den Syntaxcheck liegen die Variablen und Konstanten in unterschiedlichen Verschachtelungstiefen.
Für die Codegeneration hingegen liegen die Variablen und Konstanten in der gleiche Ebene, da diese hier nur durch Prozeduraufrufe sich ändert.
Ist hier mit Syntaxcheck die Kontextanalyse gemeint? Falls ja gilt dann, wenn man davon ausgeht, dass der äußeren Let Block im obigen Beispiel von nichts umschlossen wird, folgendes:

Phase der Kontextanalyse (bzw. Einträge in der Symboltabelle die währenddessen angelegt wird)
  • Erstes a auf Schachtelungstiefe 1
  • Zweites a auf Schachtelungstiefe 2
Phase der Code-Generierung:
  • Adresse des ersten a's: 0[SB]
  • Adresse des zweiten a's: 1[SB]

Jens Huthmann
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 192
Registriert: 10. Nov 2011 19:42

Re: Geltungsbereiche

Beitrag von Jens Huthmann » 7. Feb 2012 16:09

Ja, die Kontextanalyse habe ich gemeint.

Die Schachtelungsebenen und Adressen sind genau so wie Sie geschrieben haben.

Antworten

Zurück zu „Archiv“