Faz 1 — AST Hiyerarşisinin Refaktörü (Expression ve Statement Ayrımı) #70
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#70
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 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
ASTNodetaban sınıfından türemektedir. Ancak anlamsal olarak iki farklı düğüm türü vardır:5 + 3veya değişken isimleri). Bunların bir veri tipi (Type) olur.ifbloğu, döngüler veyareturn). 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:
src/parser/ast_node.hppdosyasınaExpressionNodeveStatementNodeadında iki yeni sınıf ekle.ExpressionNodesınıfınaresolvedType(çözümlenmiş tip),isConstantvefoldedValue(optimizasyon için) alanlarını koy.StatementNodesınıfına iseisReachable(erişilebilirlik bayrağı) alanını ekle.src/parser/nodes/dizinindeki tüm dosyaları tara.LiteralNode,BinaryExpressionNode,IdentifierNode,CallExpressionNodegibi değer üreten tüm sınıflarıExpressionNode'dan türet.IfStatementNode,WhileStatementNode,ReturnStatementNodevb. sınıfları iseStatementNode'dan türet.getChildren()metodunun alt sınıflar tarafından ezilmesini (override) sağla. ÖrneğinBinaryExpressionNodesınıfındaLeftveRightdüğümlerini dinamik olarakgetChildren()içinde döndür. Bu, genel ağaç gezginlerinin (Tree Walker) alt düğümleri eksiksiz taramasını sağlayacaktır.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-refactorSonuç ve Başarı Kriterleri
Bu işin bittiğini ve başarılı olduğunu şu kriterlerle doğrulayacağız:
saqut ast examples/fibonacci.sqtkomutu çalıştırıldığında üretilen JSON çıktısında, ifadeler içinresolvedTypealanı (boş olarak) ve deyimler içinisReachablealanı (true olarak) görünmelidir.python3 -m json.toolile test edildiğinde hiçbir parse hatası vermebelidir (regresyon testi).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
childrenvektö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.✅ Faz 1 tamamlandı —
master(feat: faz1).Yapılanlar
ExpressionNode(alanlar:resolvedType,isConstant+foldedValueTODO faz-4) veStatementNode(isReachable) ara taban sınıflarıast_node.hpp'ye eklendi.ExpressionNode.VariableDecl→StatementNode. (FunctionDecl/StructDecl provizyonel olarak ASTNode altında kaldı — kodda TODO ile işaretli.)toJson(): ifadelereresolvedType(çözülmemişsenull), deyimlereisReachableeklendi.IdentifierNode'aSymbol* resolvedSymbol(TODO faz-2 ileri bildirim).diagnostic.hppkendijsonEscape'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.sqtgeçerli JSON (python -m json.tool); 48 ×resolvedType: null, 20 ×isReachable: true.examples/parser-stress/Final.sqtregresyonu: geçerli JSON.-Wall -Wextratemiz (CMake/Ninja, 13/13).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