Übersetzerbau Entwurf - Symboltabelle



Symboltabelle ist eine wichtige Datenstruktur erstellt und von Compilern halten, um Informationen über das Auftreten von verschiedenen Einheiten wie Variablennamen, Funktionsnamen, Objekte, Klassen, Schnittstellen, etc. Symboltabelle wird sowohl von der Analyse speichern und die Synthese Teile eines Compilers.

Eine Symboltabelle kann den folgenden Zwecken, abhängig von der Sprache, in der Hand zu dienen:

  • Um die Namen aller Entitäten in strukturierter Form an einem Ort zu speichern.

  • Um zu überprüfen, ob eine Variable deklariert wurde.

  • Zur Implementierung Typprüfung, durch die Überprüfung Zuweisungen und Ausdrücke im Quelltext semantisch korrekt ist.

  • zu bestimmen den Umfang eines Namens (Umfang Auflösung).

Eine Symboltabelle ist einfach eine Tabelle, die entweder linear oder eine Hash-Tabelle sein kann. Es unterhält einen Eintrag für jeden Namen in folgendem Format ein:

<symbol name,  type,  attribute>

Zum Beispiel, wenn eine Symboltabelle muss Informationen über das folgende Variablendeklaration zu speichern:

static int interest;

dann sollte es den Eintrag wie speichern:

<interest, int, static>

Das Attribut-Klausel enthält die Einträge verwandt dem Namen.

Implementierung

Wenn ein Compiler ist zu handhaben um eine kleine Menge von Daten kann die Symboltabelle kann implementiert als eine ungeordnete Liste, die einfach zu Code, aber es ist nur für nur kleine Tische geeignet. Eine Symboltabelle kann implementiert in einer der folgenden Weisen werden:

  • Linear Liste (sortiert oder unsortiert)
  • binären Suchbaum
  • Hash-Tabelle

Unter allen Symboltabellen sind meist implementiert als Hash-Tabellen,wo die Quelle Codesymbol selbst ist als Schlüssel für die Hash-Funktion und der Rückgabewert behandelt ist die Information über das Symboll.

Betrieb

Eine Symboltabelle, entweder linear oder Hash, sollten liefern folgende Operationen.

einfügen()

Diese Operation wird häufiger von Analysephase verwendet, dh die erste Hälfte des Compilers in denen Token identifiziert und Namen sind in der Tabelle gespeichert. Diese Operation wird verwendet, um Informationen in der Symboltabelle über eindeutige Namen im Quellcode vorkommenden hinzuzufügen. Das Format oder die Struktur in der die Namen gespeichert sind, hängt von dem Compiler in der Hand.

Ein Attribut für ein Symbol im Quellcode ist die Information mit dem Symbol verbunden. Diese Information enthält den Wert, Zustand, Umfang und Art über das Symbol. Die Funktion insert () nimmt das Symbol und seine Attribute als Argumente und speichert die Informationen in der Symboltabelle.

Zum Beispiel:

int a;

sollte durch den Compiler verarbeitet werden:

insert(a, int);

nachschlagen()

nachschlagen() Betrieb wird verwendet, um den in der Symboltabelle einen Namen zu suchen, um festzustellen:

  • wenn das Symbol in der Tabelle vorhanden ist.
  • wenn sie erklärt, bevor es verwendet wird.
  • Wenn der Name wird Umfang im eingesetzt.
  • wenn das Symbol wird initialisiert.
  • wenn das Symbol erklärt mehrfach.

Das Format lookup () Funktion ist abhängig von der Programmiersprache. Das Grundformat ist Ihnen:

lookup(symbol)

Diese Methode gibt 0 (Null), wenn das Symbol nicht in der Symboltabelle existiert. Wenn das Symbol in der Symboltabelle existiert, kehrt er seine Attribute in der Tabelle gespeichert.

Umfangsmanagement

Ein Compiler unterhält zwei Arten von Symboltabellen: ein globale Symboltabelle , die von allen Verfahren und aufgerufen werden können Rahmen Symboltabellen , die für jeden Rahmen in die erstellt werden, Programm.

Um den Umfang eines Namens zu ermitteln, werden Symboltabellen in hierarchischen Struktur angeordnet sind, wie im folgenden Beispiel gezeigt:

. . . 
int value=10;

void pro_one()
   {
   int one_1;
   int one_2;
   
      {              \
      int one_3;      |_  inner scope 1 
      int one_4;      | 
      }              /
      
   int one_5; 
   
      {              \   
      int one_6;      |_  inner scope 2
      int one_7;      |
      }              /
   }
   
void pro_two()
   {
   int two_1;
   int two_2;
   
      {              \
      int two_3;      |_  inner scope 3
      int two_4;      |
      }              /
      
   int two_5;
   }
. . . 

Das obige Programm kann in einer hierarchischen Struktur der Symboltabellen dargestellt werden:

Symbol Table

Die globale Symboltabelle enthält die Namen für eine globale Variable (int value) und zwei Prozedurnamen, die zur Verfügung stehen sollen, um alle der oben angegebenen untergeordneten Knoten. Die in der Symboltabelle pro_one genannten Namen (und alle untergeordneten Tabellen) sind nicht für pro_two Symbole und ihre untergeordneten Tabellen zur Verfügung.

Dieses Symbol Tabellendatenstruktur Hierarchie wird in der semantischen Analysegerät gespeichert und, wenn ein Name muss in einer Symboltabelle gesucht werden, wird mit dem folgenden Algorithmus durchsucht:

  • erste Symbol wird im aktuellen Bereich durchsucht werden, dh aktuelle Symboltabelle.

  • wenn ein Name gefunden, wird Suche abgeschlossen ist, sonst wird es in der übergeordneten Symboltabelle gesucht werden, bis

  • entweder der Name gefunden wird oder globale Symboltabelle hat für den Namen durchsucht worden.

Advertisements