Faz 3 — Semantik Analiz ve Tip Denetimi (Type Checking) #72

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

Giriş (Nedir, Neden Yapıyoruz?)

Bu iş paketinde derleyicinin kurallarını işleten Semantik Analiz (Anlamsal Analiz) ve Tip Denetimi (Type Checking) motorunu yazacağız.
Sözdizimi (Syntax) doğru olan bir kod anlamsal olarak yanlış olabilir (örneğin int x = "merhaba" + 5; yazmak sözdizimsel olarak geçerlidir ancak mantıksızdır).
Tip Denetimi, ifadelerin veri tiplerinin uyumlu olup olmadığını kontrol eder. Ayrıca dilimizin "otomatik tip dönüşümü yasaktır" kuralını işletir. Yapısal doğrulama ise break/continue deyimlerinin döngü dışında kullanılmasını engeller.


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

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

  1. Tip Denetleyici: src/sema/type_checker.hpp ve .cpp dosyalarını oluştur. AST'yi aşağıdan yukarıya (bottom-up) gezerek her ExpressionNode düğümünün tipini (resolvedType) belirle.
  2. Uyuşmazlık Kuralları: Atama işlemlerinde (=), aritmetik operatörlerde ve fonksiyon çağrılarında tip uyumunu denetle. Gizli değişken-değişken dönüşümlerini yasakla (hata: E003).
  3. Literal Uyarlama Kuralı: Sabit sayı literal'ları için bağlama göre tiplendirme kuralını işlet (Örn: float x = 1; geçerli olmalı çünkü 1 kayıpsızca float'a dönüşebilir, ancak int y = 1.5; E003 hatası vermelidir).
  4. Error Tipi: Bir ifade hatalıysa tipine ErrorType ata. Bu sayede, o ifadeyi kullanan üst ifadelerde tekrar tekrar sahte hatalar üretilmez.
  5. Yapısal Doğrulayıcı: src/sema/structural_validator.hpp ve .cpp dosyalarını oluştur. Ağacı tırmanarak break/continue ifadelerinin üstünde bir döngü olup olmadığını (E004), return ifadesinin bir fonksiyon gövdesinde olup olmadığını (E005 ve dönüş tipi uyumu için E006) denetle.

Geliştirme Dalı (Branch): feature/faz3-semantic-analysis


Sonuç ve Başarı Kriterleri

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

  1. Geçerli olan examples/fibonacci.sqt dosyası semantik analizden sıfır hatayla geçmeli ve her AST ifadesinin tipi JSON çıktısında (resolvedType) görünmelidir.
  2. Hatalı bir test dosyası verildiğinde (örneğin döngü dışında break; yazıldığında veya int değişkene string atandığında) derleyici ilgili hata kodlarını (E003, E004 vb.) raporlamalı ve derleme süreci kesilmelidir.

Mühendis Olmayanlar İçin Analiz: Bu aşama, derleyicinin yazılan kodun "anlamlı" olup olmadığını kontrol ettiği güvenlik kapısıdır. Karmaşıklığı Orta-Yüksek, yapım süresi yaklaşık 3-4 gündür.
İmza/Yorum: Sabit ifadelerde constant folding istisnasını unutmama kuralları burada işletilecektir.

### Giriş (Nedir, Neden Yapıyoruz?) Bu iş paketinde derleyicinin kurallarını işleten Semantik Analiz (Anlamsal Analiz) ve Tip Denetimi (Type Checking) motorunu yazacağız. Sözdizimi (Syntax) doğru olan bir kod anlamsal olarak yanlış olabilir (örneğin `int x = "merhaba" + 5;` yazmak sözdizimsel olarak geçerlidir ancak mantıksızdır). Tip Denetimi, ifadelerin veri tiplerinin uyumlu olup olmadığını kontrol eder. Ayrıca dilimizin "otomatik tip dönüşümü yasaktır" kuralını işletir. Yapısal doğrulama ise `break`/`continue` deyimlerinin döngü dışında kullanılmasını engeller. --- ### Gelişme (Neyi, Nerede ve Nasıl Yapacaksın?) Aşağıdaki adımları sırasıyla gerçekleştir: 1. **Tip Denetleyici:** `src/sema/type_checker.hpp` ve `.cpp` dosyalarını oluştur. AST'yi aşağıdan yukarıya (bottom-up) gezerek her `ExpressionNode` düğümünün tipini (`resolvedType`) belirle. 2. **Uyuşmazlık Kuralları:** Atama işlemlerinde (`=`), aritmetik operatörlerde ve fonksiyon çağrılarında tip uyumunu denetle. Gizli değişken-değişken dönüşümlerini yasakla (hata: `E003`). 3. **Literal Uyarlama Kuralı:** Sabit sayı literal'ları için bağlama göre tiplendirme kuralını işlet (Örn: `float x = 1;` geçerli olmalı çünkü `1` kayıpsızca float'a dönüşebilir, ancak `int y = 1.5;` `E003` hatası vermelidir). 4. **Error Tipi:** Bir ifade hatalıysa tipine `ErrorType` ata. Bu sayede, o ifadeyi kullanan üst ifadelerde tekrar tekrar sahte hatalar üretilmez. 5. **Yapısal Doğrulayıcı:** `src/sema/structural_validator.hpp` ve `.cpp` dosyalarını oluştur. Ağacı tırmanarak `break`/`continue` ifadelerinin üstünde bir döngü olup olmadığını (`E004`), `return` ifadesinin bir fonksiyon gövdesinde olup olmadığını (`E005` ve dönüş tipi uyumu için `E006`) denetle. *Geliştirme Dalı (Branch):* `feature/faz3-semantic-analysis` --- ### Sonuç ve Başarı Kriterleri Bu işin bittiğini ve başarılı olduğunu şu kriterlerle doğrulayacağız: 1. Geçerli olan `examples/fibonacci.sqt` dosyası semantik analizden sıfır hatayla geçmeli ve her AST ifadesinin tipi JSON çıktısında (`resolvedType`) görünmelidir. 2. Hatalı bir test dosyası verildiğinde (örneğin döngü dışında `break;` yazıldığında veya `int` değişkene `string` atandığında) derleyici ilgili hata kodlarını (`E003`, `E004` vb.) raporlamalı ve derleme süreci kesilmelidir. *Mühendis Olmayanlar İçin Analiz:* Bu aşama, derleyicinin yazılan kodun "anlamlı" olup olmadığını kontrol ettiği güvenlik kapısıdır. Karmaşıklığı **Orta-Yüksek**, yapım süresi yaklaşık **3-4 gün**dür. *İmza/Yorum:* Sabit ifadelerde constant folding istisnasını unutmama kuralları burada işletilecektir.
saqut added the
faz-plani
label 2026-06-14 22:08:32 +03:00
Author
Owner

Faz 3 tamamlandı.

Yapılanlar:

  • src/semantic/type_checker: her ExpressionNode'a resolvedType atar; E003 (tip uyuşmazlığı), E006 (return tipi), E008 (argüman sayısı/tipi)
  • src/semantic/structural_validator: E004 (break/continue döngü dışı), E005 (return fonksiyon dışı)
  • W004 (örtük sayısal genişletme) diagnostic kataloğa eklendi
  • saqut check komutu: tokenize→parse→collect→typecheck→validate pipeline'ı, JSON çıktı
  • examples/semantic/: widening, narrowing, bad_return, break_outside, bad_args fixture'ları
  • fibonacci.sqt → 0 hata 0 uyarı

Commit: d9b023c

Faz 3 tamamlandı. **Yapılanlar:** - `src/semantic/type_checker`: her ExpressionNode'a resolvedType atar; E003 (tip uyuşmazlığı), E006 (return tipi), E008 (argüman sayısı/tipi) - `src/semantic/structural_validator`: E004 (break/continue döngü dışı), E005 (return fonksiyon dışı) - W004 (örtük sayısal genişletme) diagnostic kataloğa eklendi - `saqut check` komutu: tokenize→parse→collect→typecheck→validate pipeline'ı, JSON çıktı - `examples/semantic/`: widening, narrowing, bad_return, break_outside, bad_args fixture'ları - fibonacci.sqt → 0 hata 0 uyarı Commit: d9b023c
saqut closed this issue 2026-06-18 18:42:11 +03:00
Sign in to join this conversation.
No description provided.