Faz 1 — AST Hiyerarşisinin Refaktörü (Expression ve Statement Ayrımı) #70

Closed
opened 2026-06-14 21:58:13 +03:00 by saqut · 2 comments
Owner

Giriş (Nedir, Neden Yapıyoruz?)

Bu iş paketinde, derleyicinin kaynak kodu okuduktan sonra hafızada oluşturduğu Soyut Sözdizimi Ağacı (Abstract Syntax Tree - AST) düğümlerini yeniden yapılandıracağız.
Şu anda tüm AST düğümleri tek bir ASTNode taban sınıfından türemektedir. Ancak anlamsal olarak iki farklı düğüm türü vardır:

  1. Expression (İfade): Bir değer üreten yapılar (örneğin 5 + 3 veya değişken isimleri). Bunların bir veri tipi (Type) olur.
  2. Statement (Deyim): Bir değer üretmeyen, sadece bir iş/eylem yürüten kontrol yapıları (örneğin if bloğu, döngüler veya return). Bunların tipi yoktur ancak erişilebilirlik (reachability) durumları analiz edilir.
    Bu iki yapıyı birbirinden ayırmak, sonraki aşamada tip denetimi yapabilmemiz için zorunludur.

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

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

  1. Ara Taban Sınıflarını Ekle: src/parser/ast_node.hpp dosyasına ExpressionNode ve StatementNode adında iki yeni sınıf ekle. ExpressionNode sınıfına resolvedType (çözümlenmiş tip), isConstant ve foldedValue (optimizasyon için) alanlarını koy. StatementNode sınıfına ise isReachable (erişilebilirlik bayrağı) alanını ekle.
  2. Düğümleri Güncelle: src/parser/nodes/ dizinindeki tüm dosyaları tara. LiteralNode, BinaryExpressionNode, IdentifierNode, CallExpressionNode gibi değer üreten tüm sınıfları ExpressionNode'dan türet. IfStatementNode, WhileStatementNode, ReturnStatementNode vb. sınıfları ise StatementNode'dan türet.
  3. Çocuk Gezintisini Düzelt: AST taban sınıfındaki getChildren() metodunun alt sınıflar tarafından ezilmesini (override) sağla. Örneğin BinaryExpressionNode sınıfında Left ve Right düğümlerini dinamik olarak getChildren() içinde döndür. Bu, genel ağaç gezginlerinin (Tree Walker) alt düğümleri eksiksiz taramasını sağlayacaktır.
  4. toJson Modifikasyonu: toJson() metotlarını güncelleyerek yeni alanları (çözümlenmiş tip ve erişilebilirlik bilgileri) JSON çıktısına ekle.

Geliştirme Dalı (Branch): feature/faz1-ast-refactor


Sonuç ve Başarı Kriterleri

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

  1. saqut ast examples/fibonacci.sqt komutu çalıştırıldığında üretilen JSON çıktısında, ifadeler için resolvedType alanı (boş olarak) ve deyimler için isReachable alanı (true olarak) görünmelidir.
  2. JSON yapısının doğruluğu python3 -m json.tool ile test edildiğinde hiçbir parse hatası vermebelidir (regresyon testi).
  3. Tüm kodlar uyarısız derlenmelidir.

Mühendis Olmayanlar İçin Analiz: Bu aşama mevcut veri yapısını daha düzenli hale getirir. Dışarıdan bakıldığında JSON çıktısında yeni alanlar görülür. Karmaşıklığı Düşük-Orta, yapım süresi yaklaşık 2 gündür.
İmza/Yorum: Düğüm alanlarındaki children vektörü tutarsızlığı bu fazda tamamen çözülmeli, ağaçta yukarı ve aşağı gezinme API'si garanti altına alınmalıdır.

### Giriş (Nedir, Neden Yapıyoruz?) Bu iş paketinde, derleyicinin kaynak kodu okuduktan sonra hafızada oluşturduğu Soyut Sözdizimi Ağacı (Abstract Syntax Tree - AST) düğümlerini yeniden yapılandıracağız. Şu anda tüm AST düğümleri tek bir `ASTNode` taban sınıfından türemektedir. Ancak anlamsal olarak iki farklı düğüm türü vardır: 1. **Expression (İfade):** Bir değer üreten yapılar (örneğin `5 + 3` veya değişken isimleri). Bunların bir veri tipi (Type) olur. 2. **Statement (Deyim):** Bir değer üretmeyen, sadece bir iş/eylem yürüten kontrol yapıları (örneğin `if` bloğu, döngüler veya `return`). Bunların tipi yoktur ancak erişilebilirlik (reachability) durumları analiz edilir. Bu iki yapıyı birbirinden ayırmak, sonraki aşamada tip denetimi yapabilmemiz için zorunludur. --- ### Gelişme (Neyi, Nerede ve Nasıl Yapacaksın?) Aşağıdaki adımları sırasıyla gerçekleştir: 1. **Ara Taban Sınıflarını Ekle:** `src/parser/ast_node.hpp` dosyasına `ExpressionNode` ve `StatementNode` adında iki yeni sınıf ekle. `ExpressionNode` sınıfına `resolvedType` (çözümlenmiş tip), `isConstant` ve `foldedValue` (optimizasyon için) alanlarını koy. `StatementNode` sınıfına ise `isReachable` (erişilebilirlik bayrağı) alanını ekle. 2. **Düğümleri Güncelle:** `src/parser/nodes/` dizinindeki tüm dosyaları tara. `LiteralNode`, `BinaryExpressionNode`, `IdentifierNode`, `CallExpressionNode` gibi değer üreten tüm sınıfları `ExpressionNode`'dan türet. `IfStatementNode`, `WhileStatementNode`, `ReturnStatementNode` vb. sınıfları ise `StatementNode`'dan türet. 3. **Çocuk Gezintisini Düzelt:** AST taban sınıfındaki `getChildren()` metodunun alt sınıflar tarafından ezilmesini (override) sağla. Örneğin `BinaryExpressionNode` sınıfında `Left` ve `Right` düğümlerini dinamik olarak `getChildren()` içinde döndür. Bu, genel ağaç gezginlerinin (Tree Walker) alt düğümleri eksiksiz taramasını sağlayacaktır. 4. **toJson Modifikasyonu:** `toJson()` metotlarını güncelleyerek yeni alanları (çözümlenmiş tip ve erişilebilirlik bilgileri) JSON çıktısına ekle. *Geliştirme Dalı (Branch):* `feature/faz1-ast-refactor` --- ### Sonuç ve Başarı Kriterleri Bu işin bittiğini ve başarılı olduğunu şu kriterlerle doğrulayacağız: 1. `saqut ast examples/fibonacci.sqt` komutu çalıştırıldığında üretilen JSON çıktısında, ifadeler için `resolvedType` alanı (boş olarak) ve deyimler için `isReachable` alanı (true olarak) görünmelidir. 2. JSON yapısının doğruluğu `python3 -m json.tool` ile test edildiğinde hiçbir parse hatası vermebelidir (regresyon testi). 3. Tüm kodlar uyarısız derlenmelidir. *Mühendis Olmayanlar İçin Analiz:* Bu aşama mevcut veri yapısını daha düzenli hale getirir. Dışarıdan bakıldığında JSON çıktısında yeni alanlar görülür. Karmaşıklığı **Düşük-Orta**, yapım süresi yaklaşık **2 gün**dür. *İmza/Yorum:* Düğüm alanlarındaki `children` vektörü tutarsızlığı bu fazda tamamen çözülmeli, ağaçta yukarı ve aşağı gezinme API'si garanti altına alınmalıdır.
saqut added the
faz-plani
label 2026-06-14 22:08:31 +03:00
Author
Owner

Faz 1 tamamlandımaster (feat: faz1).

Yapılanlar

  • ExpressionNode (alanlar: resolvedType, isConstant + foldedValue TODO faz-4) ve StatementNode (isReachable) ara taban sınıfları ast_node.hpp'ye eklendi.
  • İfade düğümleri (Literal, Identifier, BinaryExpression, Postfix, Call, MemberAccess, IndexExpression) → ExpressionNode.
  • Deyim düğümleri (Block/If/While/For/DoWhile/Return/Break/Continue/ExpressionStatement) ve VariableDeclStatementNode. (FunctionDecl/StructDecl provizyonel olarak ASTNode altında kaldı — kodda TODO ile işaretli.)
  • toJson(): ifadelere resolvedType (çözülmemişse null), deyimlere isReachable eklendi.
  • IdentifierNode'a Symbol* resolvedSymbol (TODO faz-2 ileri bildirim).
  • Yan düzeltme (Faz 0): diagnostic.hpp kendi jsonEscape'ini kaldırdı, tools.hpp'dekini kullanıyor — Faz 2/3'te ortaya çıkacak ODR çakışması önlendi.

Başarı kriterleri

  • saqut ast examples/fibonacci.sqt geçerli JSON (python -m json.tool); 48 × resolvedType: null, 20 × isReachable: true.
  • examples/parser-stress/Final.sqt regresyonu: geçerli JSON.
  • -Wall -Wextra temiz (CMake/Ninja, 13/13).
  • Faz 0 birim testleri hâlâ geçiyor.

Kapatma/onay sende (lisans §7).

✅ **Faz 1 tamamlandı** — `master` (feat: faz1). **Yapılanlar** - `ExpressionNode` (alanlar: `resolvedType`, `isConstant` + `foldedValue` TODO faz-4) ve `StatementNode` (`isReachable`) ara taban sınıfları `ast_node.hpp`'ye eklendi. - İfade düğümleri (Literal, Identifier, BinaryExpression, Postfix, Call, MemberAccess, IndexExpression) → `ExpressionNode`. - Deyim düğümleri (Block/If/While/For/DoWhile/Return/Break/Continue/ExpressionStatement) ve `VariableDecl` → `StatementNode`. *(FunctionDecl/StructDecl provizyonel olarak ASTNode altında kaldı — kodda TODO ile işaretli.)* - `toJson()`: ifadelere `resolvedType` (çözülmemişse `null`), deyimlere `isReachable` eklendi. - `IdentifierNode`'a `Symbol* resolvedSymbol` (TODO faz-2 ileri bildirim). - **Yan düzeltme (Faz 0):** `diagnostic.hpp` kendi `jsonEscape`'ini kaldırdı, `tools.hpp`'dekini kullanıyor — Faz 2/3'te ortaya çıkacak ODR çakışması önlendi. **Başarı kriterleri** - ✅ `saqut ast examples/fibonacci.sqt` geçerli JSON (`python -m json.tool`); 48 × `resolvedType: null`, 20 × `isReachable: true`. - ✅ `examples/parser-stress/Final.sqt` regresyonu: geçerli JSON. - ✅ `-Wall -Wextra` temiz (CMake/Ninja, 13/13). - ✅ Faz 0 birim testleri hâlâ geçiyor. > Kapatma/onay sende (lisans §7).
Author
Owner

Faz 1 tamamlandı. Yapılanlar: ExpressionNode+StatementNode hiyerarşisi (ADR-012), analiz alanları (resolvedType, isReachable, isConstant), JsonObject builder, tüm AST node'larında toJson() serileştirmesi. Commit: f4f57dd

Faz 1 tamamlandı. Yapılanlar: ExpressionNode+StatementNode hiyerarşisi (ADR-012), analiz alanları (resolvedType, isReachable, isConstant), JsonObject builder, tüm AST node'larında toJson() serileştirmesi. Commit: f4f57dd
saqut closed this issue 2026-06-18 16:53:01 +03:00
Sign in to join this conversation.
No description provided.