Derleyici Tasarımı - Sembol Tablosu

Sembol tablosu, değişken isimleri, fonksiyon isimleri, nesneler, sınıflar, arayüzler vb. Gibi çeşitli varlıkların oluşumu hakkında bilgi depolamak için derleyiciler tarafından oluşturulan ve sürdürülen önemli bir veri yapısıdır. bir derleyicinin parçaları.

Bir sembol tablosu, eldeki dile bağlı olarak aşağıdaki amaçlara hizmet edebilir:

  • Tüm varlıkların adlarını tek bir yerde yapılandırılmış bir biçimde saklamak.

  • Bir değişkenin beyan edilip edilmediğini doğrulamak için.

  • Tür denetimini uygulamak için, kaynak koddaki atamaların ve ifadelerin anlamsal olarak doğru olduğunu doğrulayarak.

  • Bir adın kapsamını belirlemek için (kapsam çözümlemesi).

Bir sembol tablosu, doğrusal veya karma tablo olabilen bir tablodur. Her isim için aşağıdaki formatta bir giriş tutar:

<symbol name,  type,  attribute>

Örneğin, bir sembol tablosunun aşağıdaki değişken bildirimi hakkında bilgi depolaması gerekiyorsa:

static int interest;

daha sonra aşağıdaki gibi girişi saklamalıdır:

<interest, int, static>

Öznitelik cümlesi, adla ilgili girişleri içerir.

Uygulama

Bir derleyici az miktarda veriyi işleyecekse, sembol tablosu sıralanmamış bir liste olarak uygulanabilir ve kodlaması kolaydır, ancak yalnızca küçük tablolar için uygundur. Bir sembol tablosu aşağıdaki yollardan biriyle uygulanabilir:

  • Doğrusal (sıralı veya sıralanmamış) liste
  • İkili Arama Ağacı
  • Hash tablosu

Hepsinden öte, sembol tabloları çoğunlukla karma tablolar olarak uygulanır; burada kaynak kodu sembolünün kendisi, karma işlevi için bir anahtar olarak değerlendirilir ve dönüş değeri, sembolle ilgili bilgilerdir.

Operasyonlar

Doğrusal veya karma bir sembol tablosu aşağıdaki işlemleri sağlamalıdır.

ekle ()

Bu işlem, analiz aşamasında, yani simgelerin tanımlandığı ve isimlerin tabloda depolandığı derleyicinin ilk yarısı tarafından daha sık kullanılır. Bu işlem, kaynak kodda meydana gelen benzersiz adlar hakkında sembol tablosuna bilgi eklemek için kullanılır. İsimlerin saklandığı format veya yapı, eldeki derleyiciye bağlıdır.

Kaynak koddaki bir sembolün özniteliği, o sembolle ilişkili bilgidir. Bu bilgiler, sembolle ilgili değeri, durumu, kapsamı ve türü içerir. İnsert () işlevi, sembolü ve niteliklerini bağımsız değişken olarak alır ve bilgileri sembol tablosunda saklar.

Örneğin:

int a;

derleyici tarafından şu şekilde işlenmelidir:

insert(a, int);

yukarı Bak()

lookup () işlemi aşağıdakileri belirlemek için sembol tablosunda bir isim aramak için kullanılır:

  • Tabloda sembol varsa.
  • kullanılmadan önce beyan edilmişse.
  • adı kapsamda kullanılıyorsa.
  • sembol başlatılmışsa.
  • sembol birden çok kez bildirilmişse.

Lookup () fonksiyonunun formatı programlama diline göre değişir. Temel biçim aşağıdakilerle eşleşmelidir:

lookup(symbol)

Sembol tablosunda sembol yoksa bu yöntem 0 (sıfır) döndürür. Sembol tablosunda sembol varsa, tabloda saklanan niteliklerini döndürür.

Kapsam Yönetimi

Bir derleyici iki tür sembol tablosu tutar: a global symbol table tüm prosedürler tarafından erişilebilir ve scope symbol tables programdaki her kapsam için oluşturulan.

Bir adın kapsamını belirlemek için, sembol tabloları aşağıdaki örnekte gösterildiği gibi hiyerarşik yapıda düzenlenmiştir:

. . . 
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;
   }
. . .

Yukarıdaki program, sembol tablolarının hiyerarşik bir yapısında temsil edilebilir:

Global sembol tablosu, bir global değişken (int değeri) için adlar ve yukarıda gösterilen tüm alt düğümler için mevcut olması gereken iki prosedür adı içerir. Pro_one sembol tablosunda (ve tüm alt tablolarında) bahsedilen isimler pro_two sembolleri ve alt tabloları için mevcut değildir.

Bu sembol tablosu veri yapısı hiyerarşisi semantik analizörde saklanır ve bir sembol tablosunda bir adın aranması gerektiğinde, aşağıdaki algoritma kullanılarak aranır:

  • önce geçerli kapsamda bir sembol aranacaktır, yani mevcut sembol tablosu.

  • bir isim bulunursa, arama tamamlanır, aksi takdirde ana sembol tablosunda şu tarihe kadar aranacaktır:

  • ad bulundu veya ad için genel sembol tablosu arandı.