Faz 2 — Sembol Tablosu ve İki Geçişli Toplama (Scope & Symbol Table) #71
Labels
No Label
cli-ux
faz-plani
felsefe-gozden-gecir
ffi-builtin
fikir
gelecek-vizyon
ir-vm
kalite-mimari
moduller-import
test-senaryosu
tip-sistemi
tooling-lsp
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: saqut/saqut-compiler#71
Loading…
Reference in New Issue
No description provided.
Delete Branch "%!s(<nil>)"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
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:
src/symbol/adında yeni bir dizin aç. BuradaSymbolyapısını tanımla (ad, tür, tip, tanım konumu, referans listesi alanları bulunsun).Scopesınıfını iç içe geçebilir ağaç yapısında yaz; her scope bir üst scope'a pointer tutsun.src/symbol/symbol_table.hppdosyasını oluştur. Scope yığınını yönetenenterScope(),exitScope(), sembol ekleyendefine()(aynı scope'ta çift tanım varsa hata üret) ve içten dışa arayanresolve()metotlarını yaz.src/symbol/symbol_collector.hppve.cppdosyalarını oluştur.struct A { B b; }vestruct B { A a; }) DFS (Derinlik Öncelikli Arama) algoritmasıyla tespit et veE010hatasını raporla.Geliştirme Dalı (Branch):
feature/faz2-symbolsSonuç ve Başarı Kriterleri
Bu işin bittiğini ve başarılı olduğunu şu kriterlerle doğrulayacağız:
saqut symbols examples/fibonacci.sqtkomutu ç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.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ığındaE001(Tanımsız İsim), döngüsel struct tanımlandığında iseE010hataları 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.
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