Faz 2 — Sembol Tablosu ve İki Geçişli Toplama (Scope & Symbol Table) #71

Closed
opened 2026-06-14 21:58:14 +03:00 by saqut · 1 comment
Owner

Giriş (Nedir, Neden Yapıyoruz?)

Bu iş paketinde derleyicinin "Hafızası" sayılan Sembol Tablosunu (Symbol Table) kuracağız.
Sembol Tablosu, kaynak koddaki değişkenlerin, fonksiyonların ve veri yapılarının (struct) tanımlarını, veri tiplerini, hangi kapsamlarda (Scope) geçerli olduklarını ve kodun neresinde kullanıldıklarını (referanslarını) takip eden bir veri yapısıdır.
Dilimiz, tanımlanmadan önce fonksiyon çağrılmasına izin verdiği için (ileri başvuru / forward-reference), sembolleri toplama işlemini iki geçişli bir algoritma ile yapmak zorundayız.


Gelişme (Neyi, Nerede ve Nasıl Yapacaksın?)

Aşağıdaki adımları sırasıyla gerçekleştir:

  1. Sembol ve Kapsam Yapıları: src/symbol/ adında yeni bir dizin aç. Burada Symbol yapısını tanımla (ad, tür, tip, tanım konumu, referans listesi alanları bulunsun). Scope sınıfını iç içe geçebilir ağaç yapısında yaz; her scope bir üst scope'a pointer tutsun.
  2. SymbolTable Yöneticisi: src/symbol/symbol_table.hpp dosyasını oluştur. Scope yığınını yöneten enterScope(), exitScope(), sembol ekleyen define() (aynı scope'ta çift tanım varsa hata üret) ve içten dışa arayan resolve() metotlarını yaz.
  3. İki Geçişli Toplayıcı: src/symbol/symbol_collector.hpp ve .cpp dosyalarını oluştur.
    • Geçiş 1 (Global Hoisting): AST'yi tarayarak sadece üst seviye fonksiyon ve struct imzalarını global scope'a kaydet.
    • Geçiş 2 (Local Resolution): Fonksiyon gövdelerine in. Lokal değişkenleri declare-before-use (kullanmadan önce tanımlama) kuralıyla topla ve Identifier (isim referansı) düğümlerini sembol tablosundaki sembollerle bağla. Global değişken başlatıcılarında declare-before-use kuralını zorunlu kıl.
  4. Döngüsel Struct Kontrolü: Struct tanımları toplandıktan sonra, pointer olmadığı için birbirini değer olarak içeren döngüsel struct tanımlarını (örn. struct A { B b; } ve struct B { A a; }) DFS (Derinlik Öncelikli Arama) algoritmasıyla tespit et ve E010 hatasını raporla.

Geliştirme Dalı (Branch): feature/faz2-symbols


Sonuç ve Başarı Kriterleri

Bu işin bittiğini ve başarılı olduğunu şu kriterlerle doğrulayacağız:

  1. saqut symbols examples/fibonacci.sqt komutu çalıştırıldığında, programdaki fonksiyonlar, parametreler ve lokal değişkenler doğru tipleri ve tüm kullanım koordinatlarıyla (satır/sütun referans listesi) ekrana yazılmalıdır.
  2. Aynı isimde iki değişken tanımlandığında E002 (Çift Tanım), tanımsız bir değişken çağrıldığında veya global başlatıcı sırasında ileri başvuru yapıldığında E001 (Tanımsız İsim), döngüsel struct tanımlandığında ise E010 hataları DiagnosticEngine tarafından raporlanmalı ve derleme durmalıdır.

Mühendis Olmayanlar İçin Analiz: Derleyicinin değişken ve fonksiyon isimlerini anlamlandırmaya başladığı aşamadır. Hatalı kod yazıldığında derleyicinin verdiği akıllı uyarıların temelidir. Karmaşıklığı Yüksek, yapım süresi yaklaşık 4-5 gündür.
İmza/Yorum: Bu aşamada pointer ve scope yapıları çok hassas tasarlanmalıdır; bellek sızıntılarını önlemek için akıllı işaretçiler veya net sahiplik modelleri tercih edilmelidir.

### Giriş (Nedir, Neden Yapıyoruz?) Bu iş paketinde derleyicinin "Hafızası" sayılan Sembol Tablosunu (Symbol Table) kuracağız. Sembol Tablosu, kaynak koddaki değişkenlerin, fonksiyonların ve veri yapılarının (struct) tanımlarını, veri tiplerini, hangi kapsamlarda (Scope) geçerli olduklarını ve kodun neresinde kullanıldıklarını (referanslarını) takip eden bir veri yapısıdır. Dilimiz, tanımlanmadan önce fonksiyon çağrılmasına izin verdiği için (ileri başvuru / forward-reference), sembolleri toplama işlemini iki geçişli bir algoritma ile yapmak zorundayız. --- ### Gelişme (Neyi, Nerede ve Nasıl Yapacaksın?) Aşağıdaki adımları sırasıyla gerçekleştir: 1. **Sembol ve Kapsam Yapıları:** `src/symbol/` adında yeni bir dizin aç. Burada `Symbol` yapısını tanımla (ad, tür, tip, tanım konumu, referans listesi alanları bulunsun). `Scope` sınıfını iç içe geçebilir ağaç yapısında yaz; her scope bir üst scope'a pointer tutsun. 2. **SymbolTable Yöneticisi:** `src/symbol/symbol_table.hpp` dosyasını oluştur. Scope yığınını yöneten `enterScope()`, `exitScope()`, sembol ekleyen `define()` (aynı scope'ta çift tanım varsa hata üret) ve içten dışa arayan `resolve()` metotlarını yaz. 3. **İki Geçişli Toplayıcı:** `src/symbol/symbol_collector.hpp` ve `.cpp` dosyalarını oluştur. * **Geçiş 1 (Global Hoisting):** AST'yi tarayarak sadece üst seviye fonksiyon ve struct imzalarını global scope'a kaydet. * **Geçiş 2 (Local Resolution):** Fonksiyon gövdelerine in. Lokal değişkenleri declare-before-use (kullanmadan önce tanımlama) kuralıyla topla ve Identifier (isim referansı) düğümlerini sembol tablosundaki sembollerle bağla. Global değişken başlatıcılarında declare-before-use kuralını zorunlu kıl. 4. **Döngüsel Struct Kontrolü:** Struct tanımları toplandıktan sonra, pointer olmadığı için birbirini değer olarak içeren döngüsel struct tanımlarını (örn. `struct A { B b; }` ve `struct B { A a; }`) DFS (Derinlik Öncelikli Arama) algoritmasıyla tespit et ve `E010` hatasını raporla. *Geliştirme Dalı (Branch):* `feature/faz2-symbols` --- ### Sonuç ve Başarı Kriterleri Bu işin bittiğini ve başarılı olduğunu şu kriterlerle doğrulayacağız: 1. `saqut symbols examples/fibonacci.sqt` komutu çalıştırıldığında, programdaki fonksiyonlar, parametreler ve lokal değişkenler doğru tipleri ve tüm kullanım koordinatlarıyla (satır/sütun referans listesi) ekrana yazılmalıdır. 2. Aynı isimde iki değişken tanımlandığında `E002` (Çift Tanım), tanımsız bir değişken çağrıldığında veya global başlatıcı sırasında ileri başvuru yapıldığında `E001` (Tanımsız İsim), döngüsel struct tanımlandığında ise `E010` hataları DiagnosticEngine tarafından raporlanmalı ve derleme durmalıdır. *Mühendis Olmayanlar İçin Analiz:* Derleyicinin değişken ve fonksiyon isimlerini anlamlandırmaya başladığı aşamadır. Hatalı kod yazıldığında derleyicinin verdiği akıllı uyarıların temelidir. Karmaşıklığı **Yüksek**, yapım süresi yaklaşık **4-5 gün**dür. *İmza/Yorum:* Bu aşamada pointer ve scope yapıları çok hassas tasarlanmalıdır; bellek sızıntılarını önlemek için akıllı işaretçiler veya net sahiplik modelleri tercih edilmelidir.
saqut added the
faz-plani
label 2026-06-14 22:08:32 +03:00
Author
Owner

Faz 2 tamamlandı. Yapılanlar: parseFunctionDecl() parametreleri AST'ye alıyor (FunctionDeclNode::params), Symbol/Scope/SymbolTable/SymbolCollector (src/symbol/), iki-geçiş (pass1 global hoist + pass2 declare-before-use), E001/E002/E010 tanıları, print builtin tohumlama, symbols komutu JSON çıktı + --compact + referenceCount, nlohmann/json entegrasyonu, syntax hata toleransı. Commit: 218d54b..c69a9b3

Faz 2 tamamlandı. Yapılanlar: parseFunctionDecl() parametreleri AST'ye alıyor (FunctionDeclNode::params), Symbol/Scope/SymbolTable/SymbolCollector (src/symbol/), iki-geçiş (pass1 global hoist + pass2 declare-before-use), E001/E002/E010 tanıları, print builtin tohumlama, symbols komutu JSON çıktı + --compact + referenceCount, nlohmann/json entegrasyonu, syntax hata toleransı. Commit: 218d54b..c69a9b3
saqut closed this issue 2026-06-18 16:53:06 +03:00
Sign in to join this conversation.
No description provided.