CodeBlanks Logo Icon CodeBlanks

Sembol tablosu

Sembol tablosu ve yönetimini öğrenirsin.

Sembol tablosu nedir?

Sembol tablosu, derleyicinin tanımlayıcıları (değişken, fonksiyon, tür) adlarıyla sakladığı veri yapısıdır. Her sembol ad, tür, kapsam (scope) ve konum bilgisi taşır.

Lexer bir tanımlayıcı görünce tabloya bakar; yoksa ekler. Parser ve codegen tabloyu tür denetimi ve adres üretimi için kullanır. Yaygın uygulama karma tablo (hash table) ya da sıralı bağlantılı listedir; kapsam desteği için her kapsam ayrı bir tablo tutar. Bir değişken kapsam dışına çıkınca tablosu bırakılır. Sembol tablosu derleyicinin belleğidir; tutarlılığı derleme başarısını belirler.

lookup ve insert

Tablonun iki temel işlemi vardır: lookup adla arama, insert yeni sembol ekleme. Bu ikisi parser ve codegen boyunca sürekli çağrılır.

Bir değişken bildirimi görünce insert yaparsın; kullanımı görünce lookup. Eğer lookup boş dönerse tanımsız değişken hatası verirsin. Kapsam desteği için tablo yığını gibi yönetilir: yeni kapsamda yeni tablo açılır, kapsam bitince tablo yığından çekilir. İç içe kapsamlarda önce iç tablo, sonra dış tablo aranır. Bu sayede gölgeleme (shadowing) doğru çalışır.

Uygulama Sembol tablosunu yazdır

struct symbol { const char *name; int type; } tanımla. void print_symbol(struct symbol s) fonksiyonu tanımla; gövdesi printf("%s:%d\n", s.name, s.type); olsun. main içinde üç elemanlı bir struct symbol table[] dizisi oluştur: {"x", 0}, {"y", 1}, {"sum", 2}. Bir for döngüsüyle her elemanı print_symbol ile yazdır.

Başlangıç kodu

main.c
#include <stdio.h>

// symbol yapısını tanımla
// üç elemanlı tablo oluştur ve for ile print_symbol çağır

int main(void) {
    return 0;
}

Örnek çözüm

main.c
#include <stdio.h>

struct symbol { const char *name; int type; };

void print_symbol(struct symbol s) {
    printf("%s:%d\n", s.name, s.type);
}

int main(void) {
    struct symbol table[] = {
        {"x", 0},
        {"y", 1},
        {"sum", 2}
    };
    int n = sizeof(table) / sizeof(table[0]);
    for (int i = 0; i < n; i++) {
        print_symbol(table[i]);
    }
    return 0;
}

Beklenen çıktı

x:0
y:1
sum:2

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Sembol tablosu neyi saklar?

  • İsim ve bilgileri Doğru cevap
  • Yalnız değer
  • Yalnız adres
  • Yalnız tür

Açıklama: Sembol tablosu tanımlayıcı adını ve özelliklerini birlikte tutar.

2 Sembol tablosu kavramlarını eşle

Kavram Anlamı
symbol İsim ve bilgisi
scope Erişim alanı
lookup Arama
insert Ekleme

3 symtab lookup çağrısını tamamla

Soru
int type = symtab_____(name);
Cevap
int type = symtab_lookup(name);

Açıklama: symtab_lookup adla arama yapar.

Uzman bölümündeki tüm dersler