Die Symboltabelle ist die zentrale Datenstruktur eines Compilers. Sie ordnet jedem Namen im Quellcode – Variablen, Funktionen, Typen, Klassen – die zugehörigen Informationen zu: Datentyp, Speicheradresse, Gültigkeitsbereich und mehr.

Was in der Symboltabelle steht

Für jeden Eintrag verwaltet der Compiler typischerweise:

  • Name und Datentyp des Symbols, zum Beispiel int zaehler.
  • Speicheradresse oder Offset, an dem die Variable zur Laufzeit liegt.
  • Gültigkeitsbereich (Scope): in welchem Block oder welcher Funktion der Name sichtbar ist.
  • Je nach Symbolart weitere Felder wie Parameterliste, Rückgabetyp oder Initialwert.

Wo die Tabelle zum Einsatz kommt

Während der semantischen Analyse prüft der Compiler anhand der Tabelle, ob jeder Name deklariert ist und ob die Typen zusammenpassen. Ein Ausdruck wie zaehler + text wird abgelehnt, weil die Tabelle für zaehler einen numerischen und für text einen Zeichenkettentyp ausweist. Gleichzeitig erkennt er Doppel-Deklarationen im selben Gültigkeitsbereich.

Verschachtelte Blöcke erzeugen eine Hierarchie von Sichtbarkeiten: Eine Variable im inneren Block kann eine gleichnamige Variable im äußeren Block überdecken (Shadowing). Nach Verlassen des Blocks gilt wieder die äußere Definition. Die Zwischendarstellung und die Codegenerierung lesen aus der Tabelle die Speicheradressen und Offsets, mit denen sie den Zielcode zusammenbauen.

Umsetzung

Technisch ist die Symboltabelle oft eine Hashtabelle für den schnellen Namenszugriff, ergänzt um verschachtelte Tabellen je Gültigkeitsbereich. Alternativ verwenden Compiler Bäume oder verkettete Listen. Wichtig ist, dass Lexer und Parser die Namen nur als Token weiterreichen – die eigentliche Bedeutung entsteht erst durch den Eintrag in der Symboltabelle während der semantischen Analyse.

Verwandte Grundlagen: Kompilieren, Syntaxbaum, Code-Optimierung.