Revisiyon

This commit is contained in:
saqut 2026-05-27 09:52:43 +03:00
parent c354d0b434
commit 14b0eb9a5e
14 changed files with 531 additions and 48 deletions

1
.gitignore vendored
View File

@ -1,5 +1,6 @@
# saQut Compiler # saQut Compiler
saqut saqut
build/
*.o *.o
*.exe *.exe
*.out *.out

View File

@ -1,42 +0,0 @@
#!/bin/bash
# ============================================================================
# saQut Compiler — Derleme Betiği
# ============================================================================
#
# AMAÇ: Projeyi tek komutla derlemek.
#
# KULLANIM:
# ./compile.sh → saqut binary'sini üret
# ./saqut → derleyiciyi çalıştır
#
# DERLEME SÜRECİ:
# Tek bir .cpp dosyası (src/main.cpp) tüm header-only kütüphaneleri
# include eder. Harici bağımlılık yoktur.
#
# g++ parametreleri:
# -Isrc : include path (header'lar src/ altında)
# -std=c++17 : C++17 standardı (std::variant, constexpr, vb.)
# -Wall -Wextra : Tüm uyarıları
# -O0 -g : Optimizasyon kapalı, debug sembolleri açık
# -o saqut : Çıktı binary adı
#
# GELECEK:
# - Makefile veya CMakeLists.txt ile daha esnek build
# - Release modu: -O2 -DNDEBUG
# - Test modu: ayrı bir test binary'si
#
# ============================================================================
set -e # Hata durumunda dur
echo "=== saQut Compiler Build ==="
g++ src/main.cpp \
-Isrc \
-std=c++17 \
-Wall -Wextra \
-O0 -g \
-o saqut
echo "Derleme başarılı: ./saqut"
echo "Çalıştırmak için: ./saqut"

30
docs/prcontext.md Normal file
View File

@ -0,0 +1,30 @@
# PR Açıklaması: Parser ve AST Bileşenlerinin Modülerleştirilmesi
## Açıklama
Bu PR, `src/parser/` dizini altındaki devasa `ast.hpp` ve `parser.hpp` dosyalarını mantıksal parçalara ayırarak kodun okunabilirliğini ve bakımını kolaylaştırmayı amaçlar. Kodun işlevselliği korunmuş, sadece dosya yapısı modüler hale getirilmiştir.
## Önemli Değişiklikler
### 1. AST (Soyut Sözdizim Ağacı) Modülerleştirme
`ast.hpp` dosyası artık bir **aggregator** (toplayıcı) görevi görüyor ve aşağıdaki yeni dosyalardan bileşenleri dahil ediyor:
- `ast_node.hpp`: Temel `ASTNode` sınıfı ve `ASTKind` enum'u.
- `ast_expr.hpp`: `LiteralNode`, `BinaryExpressionNode`, `CallExpressionNode` gibi ifade düğümleri.
- `ast_stmt.hpp`: `BlockNode`, `IfStatementNode`, `WhileStatementNode` gibi deyim (statement) düğümleri.
- `ast_decl.hpp`: `FunctionDeclNode`, `VariableDeclNode`, `StructDeclNode` gibi deklarasyon düğümleri.
- `ast_json.hpp`: JSON serileştirme için yardımcı fonksiyonlar (`childrenToJson`, `jsonEscape` vb.).
### 2. Parser Modülerleştirme
Parser mantığı da benzer şekilde parçalara ayrıldı:
- `parser_base.hpp`: `Parser` sınıfı tanımı ve üye değişkenleri.
- `parser_core.hpp`: Pratt Parser ana döngüsü, NUD ve LED mantığı.
- `parser_decl.hpp`: Fonksiyon, değişken ve struct deklarasyonlarının ayrıştırılması.
- `parser_stmt.hpp`: Deyimlerin (if, for, while, return vb.) ayrıştırılması.
## Teknik Avantajlar
- **Okunabilirlik:** Binlerce satırlık dosyalar yerine 100-300 satırlık, spesifik görevleri olan dosyalar oluşturuldu.
- **Bakım Kolaylığı:** Belirli bir dil özelliği (örn. yeni bir deyim tipi) eklendiğinde hangi dosyanın değiştirileceği artık çok daha net.
- **Derleme Hızı:** (Gelecekte) İncremental build süreçlerinde sadece değişen parçaların derlenmesine olanak sağlar.
## Notlar
- Mevcut tüm testler ve `Final.sqt` gibi örnek dosyaların ayrıştırılması sorunsuz çalışmaya devam etmektedir.
- Dosya başlıklarındaki DİZİN ve KATMAN bilgileri güncellenmiştir.

452
docs/roadmap.md Normal file
View File

@ -0,0 +1,452 @@
# saQut Derleyici ve Dil Ekosistemi — Aşamalı Yol Haritası (ROADMAP)
> **Son güncelleme:** 2026-05-26
> **Amaç:** Bu belge, saQut derleyicisinin ve onu çevreleyen araç zincirinin aşamalı olarak nasıl inşa edileceğini, her aşamanın ön koşullarını, net hedeflerini ve hangi derleyici katmanına denk geldiğini tanımlar. Doğrudan GitHub issue'larına dönüştürülebilecek netlikte yazılmıştır.
---
## Vizyon (Kısa Hatırlatma)
saQut bir derleyici değil, bir **derleyici alet çantasıdır.** Amacı en hızlı kodu üretmek değil, derleyicinin kendisini geliştiriciye açmaktır. Her aşama (Lexer, Parser, Optimizer, Compiler) bağımsız, parametrelerle yönlendirilebilen bir modüldür. Dil, geliştiricinin hiç sıkılmadan binlerce fonksiyon yazabileceği, dosya sisteminden HTTP sunucusuna kadar her seviyede kod yazmaya izin veren, ancak aynı zamanda byte seviyesinde kontrol sağlayan, sıfır bağımlılıkla dağıtılabilen bir yapı olacaktır.
---
## Genel Bağımlılık Haritası
Aşağıdaki diyagram, hangi yeteneğin hangi derleyici katmanına bağımlı olduğunu gösterir.
```
Lexer ─────────────────────────────────────────────────────────────────────┐
│ │
├── TextMate Syntax Highlighting (regex tabanlı, hemen yapılabilir) │
│ │
└── Tokenizer ──────────────────────────────────────────────────────┐ │
│ │ │
└── Parser ────────────────────────────────────────────────┐ │ │
│ │ │ │
├── AST ────────────────────────────────────────┐ │ │ │
│ │ │ │ │ │
│ ├── AST Analizi (node sayısı, derinlik) │ │ │ │
│ ├── Kod Biçimlendirici (pretty printer) │ │ │ │
│ └── Dokümantasyon Üretici (/// yorumlar) │ │ │ │
│ │ │ │ │
└── Sembol Tablosu ─────────────────────────┐ │ │ │ │
│ │ │ │ │ │
├── Tip Sistemi ──────────────┐ │ │ │ │ │
│ │ │ │ │ │ │ │
│ ├── LSP Diagnostics │ │ │ │ │ │
│ ├── LSP Hover (tip göster) │ │ │ │ │ │
│ ├── LSP Completion │ │ │ │ │ │
│ └── Linter / Statik Analiz │ │ │ │ │ │
│ │ │ │ │ │ │
├── LSP Go to Definition ──────┤ │ │ │ │ │
├── LSP Find References ───────┘ │ │ │ │ │
├── LSP Document Symbols │ │ │ │ │
├── LSP Semantic Tokens (renklendirme) │ │ │ │ │
└── Kod Haritası (Call Graph) │ │ │ │ │
│ │ │ │ │
┌───────────────────────────────────────┘ │ │ │ │
│ │ │ │ │
└── IR (Intermediate Representation) ───┐ │ │ │ │
│ │ │ │ │ │
├── C Transpile Backend │ │ │ │ │
├── Interpreter (Tree-walk / VM) │ │ │ │ │
├── QBE / Custom Backend │ │ │ │ │
├── Debugger (DAP, DWARF) │ │ │ │ │
└── Optimizasyonlar │ │ │ │ │
│ │ │ │ │
┌────────────────────────────────────────┘ │ │ │ │
│ │ │ │ │
└── Proje Sistemi / Build Tooling ─────────────┘ │ │ │
│ │ │ │
├── saqut init, saqut build, saqut test │ │ │
├── Paket Yöneticisi │ │ │
└── Derleyici Konfigürasyonu (CompilerConfig) │ │ │
│ │ │
┌────────────────────────────────────────────────────────────┘ │ │
│ │ │
└── LSP Sunucusu (JSON-RPC) ───────────────────────────────────────┘ │
│ │
├── VSCode Eklentisi │
├── Diğer IDE Desteği (Neovim, JetBrains, Emacs...) │
└── Debug Adapter Protocol (DAP) │
```
> **Okuma rehberi:** Yukarıdaki haritada her bileşen, altındaki bileşenlere bağımlıdır. Örneğin LSP Semantic Tokens için Sembol Tablosu şarttır, Sembol Tablosu için AST şarttır, AST için Parser şarttır.
---
# Aşama 0: Metadata ve Konum Takibi (Derleyici Katmanı: Tümü)
> **Ön Koşul:** Yok. Mevcut kod tabanı üzerine inşa edilir.
> **Hedef:** Her token ve AST düğümü kaynak koddaki konumunu bilsin. Hata mesajları satır/sütun gösterebilsin.
> **Neden bu aşama ilk?** LSP dahil tüm geliştirici deneyimi özellikleri, konum bilgisine bağımlıdır.
### Issue 0.1: `SourceFile` ve `SourceLocation` Yapılarını Tanımla
- **Dosya:** `src/core/location.hpp` (yeni)
- **Yapılacaklar:**
- `SourceLocation` yapısı: `fileId` (string), `line` (1 tabanlı), `column` (1 tabanlı), `offset` (0 tabanlı).
- `SourceFile` sınıfı: Dosya adı, tam metin, satır başı offset'lerinin listesini tutar.
- `offsetToLocation(offset) -> SourceLocation` metodu: Binary search ile offset'i satır/sütuna çevirir.
- `locationToOffset(SourceLocation) -> int` metodu: Satır/sütunu offset'e çevirir (doğrulama için).
- **Test kriteri:** `SourceFile("a\nbc\n")` için offset 2'nin `{line:2, column:1}` olduğunu doğrula.
### Issue 0.2: Lexer'a Satır/Sütun Takibi Ekle
- **Dosya:** `src/lexer/lexer.hpp`
- **Yapılacaklar:**
- `Lexer` sınıfına `currentLine`, `currentColumn` üye değişkenleri ekle.
- `nextChar()` çağrıldığında `'\n'` görürse satırı artır, sütunu sıfırla.
- `skipWhiteSpace()` içinde de satır takibi çalışsın.
- Mevcut konumu `SourceLocation` olarak döndüren `getLocation()` metodu ekle.
- `INumber` yapısına `startLoc` ve `endLoc` alanları ekle, `readNumeric()` bu alanları doldursun.
- **Test kriteri:** `"1 + 2"` tarandığında `1` token'ının konumu `{line:1, column:1}` olmalı.
### Issue 0.3: Token'lara ve AST Düğümlerine Konum Bilgisi Ekle
- **Dosyalar:** `src/tokenizer/token.hpp`, `src/parser/ast.hpp`
- **Yapılacaklar:**
- `Token` temel sınıfına `SourceLocation loc` ekle. `start`/`end` offset'lerini kaldır (artık `loc` kullan).
- `ParserToken` yapısına `SourceLocation loc` ekle, `parseToken()` içinde token'dan kopyala.
- `ASTNode` temel sınıfına `SourceLocation loc` ekle. Her düğüm oluşturulurken ilgili token'ın konumunu ata.
- **Test kriteri:** `saqut tokens source.sqt` çıktısında her token için satır:sütun bilgisi görünsün.
---
# Aşama 1: Sembol Tablosu ve Tip Sisteminin Temelleri (Derleyici Katmanı: Parser sonrası)
> **Ön Koşul:** Aşama 0 tamamlanmış olmalı.
> **Hedef:** Derleyici, kodda tanımlanan her ismi (değişken, fonksiyon, struct) ve tipini bilsin. LSP'nin sorduğu temel sorulara cevap verebilsin.
### Issue 1.1: Sembol ve Sembol Tablosu Sınıflarını Yaz
- **Dosya:** `src/symbol/symbol.hpp`, `src/symbol/symbol_table.hpp` (yeni)
- **Yapılacaklar:**
- `Symbol` yapısı: `name` (string), `kind` (enum: Variable, Function, Struct, Parameter), `type` (`Type*`), `definitionLoc` (SourceLocation), `references` (vector<SourceLocation>).
- `SymbolTable` sınıfı: İç içe scope desteği. `enterScope()`, `exitScope()`, `define(name, Symbol)`, `resolve(name) -> Symbol*`, `addReference(name, location)`.
- Scope chain: Global → Function → Block. İsim çözümleme en iç scope'tan dışa doğru.
- **Test kriteri:** İç içe bloklarda aynı isimli değişken gölgeleme (shadowing) çalışsın.
### Issue 1.2: Tip Sistemi Temellerini Kur
- **Dosya:** `src/symbol/type.hpp` (yeni)
- **Yapılacaklar:**
- `Type` soyut sınıfı ve alt sınıfları: `PrimitiveType` (Int, Float, Bool, Char, String, Void), `StructType`, `FunctionType` (parametre tipleri + dönüş tipi), `ArrayType`.
- Tip eşitliği kontrolü (`equals` metodu).
- Tip uyumluluğu (atama için implicit cast kuralları).
- **Test kriteri:** `int x = "hello";` için "tip uyuşmazlığı" hatası alınsın.
### Issue 1.3: Sembol Toplayıcıyı (SymbolCollector) AST Walker Olarak Yeniden Yaz
- **Dosya:** `src/symbol/symbol_collector.hpp` (yeni, mevcut `json.hpp` içindeki `collectSymbols` kaldırılacak)
- **Yapılacaklar:**
- `SymbolCollector` sınıfı, `ASTNode` ziyaretçisi. AST'yi dolaşır:
- `FunctionDecl``SymbolTable::define(name, FunctionSymbol)`
- `VariableDecl``SymbolTable::define(name, VariableSymbol)`, tipini `Type` sisteminden çözümle.
- `Identifier` referansları`SymbolTable::addReference(name, loc)`
- `StructDecl``SymbolTable::define(name, StructSymbol)`
- Ziyaret sırasında tanımsız değişken, çift tanım hatalarını topla.
- **Test kriteri:** `saqut symbols source.sqt` çıktısı `SymbolTable`'dan gelen tam veriyi JSON olarak göstersin.
---
# Aşama 2: Temel LSP Altyapısı (Derleyici Katmanı: Tümü, yeni `lsp` modu)
> **Ön Koşul:** Aşama 0 ve Aşama 1 tamamlanmış olmalı.
> **Hedef:** VSCode içinde `.sqt` dosyalarında hataları görme, sembollere gitme, imleç altı bilgisi.
### Issue 2.1: JSON-RPC 2.0 Altyapısını Yaz
- **Dosya:** `src/lsp/json_rpc.hpp` (yeni)
- **Yapılacaklar:**
- `JsonRpcMessage` yapısı: `jsonrpc`, `id`, `method`, `params` alanları.
- `parseMessage(string) -> JsonRpcMessage` fonksiyonu: Ham stdin girdisini JSON-RPC mesajına çevirir (sadece ihtiyaç duyulan alanlar).
- `serializeMessage(JsonRpcMessage) -> string` fonksiyonu: Cevap mesajını JSON-RPC formatında üretir.
- Content-Length header'ı ile çerçeveleme (LSP standardı).
- **Test kriteri:** El ile gönderilen `{"jsonrpc":"2.0","id":1,"method":"initialize","params":{...}}` mesajı doğru parse edilsin.
### Issue 2.2: `saqut lsp` Komutunu Ekle
- **Dosya:** `src/cli/commands/lsp.hpp` (yeni), `main.cpp`'ye kayıt ekle
- **Yapılacaklar:**
- `cmdLsp` fonksiyonu: stdin/stdout'tan JSON-RPC mesajlarını oku, işle, cevap ver.
- Ana döngü: `initialize``initialized``textDocument/didOpen`, `didChange`, `definition`, `hover`...
- `shutdown` ve `exit` mesajlarını işle.
- **Test kriteri:** `saqut lsp` process'i başlatıldığında `initialize` isteğine `capabilities` ile cevap versin.
### Issue 2.3: Artımlı Derleme (Incremental Compilation) Desteği Ekle
- **Dosya:** `src/lsp/project_manager.hpp` (yeni)
- **Yapılacaklar:**
- `ProjectManager` sınıfı: Açık dosyaları ve onların AST/Sembol Tablosu kopyalarını tutar.
- `didOpen` / `didChange` ile dosya içeriği güncellendiğinde sadece o dosyayı yeniden parse et, sembol tablosunu güncelle.
- Hata listesini (diagnostics) güncelle.
- **Test kriteri:** Bir dosyada değişiklik yapıldığında sadece o dosyanın yeniden derlenmesi, diğer dosyaların etkilenmemesi.
### Issue 2.4: İlk LSP Yeteneklerini Uygula
- **Dosya:** `src/lsp/handlers/` (yeni dizin)
- **Yapılacaklar:**
- `textDocument/publishDiagnostics`: Sembol toplayıcıdan gelen hataları LSP formatında bildir.
- `textDocument/definition`: İmleç konumundaki sembolü bul, tanımlandığı `SourceLocation`'ı döndür.
- `textDocument/documentSymbol`: Dosyadaki tüm sembolleri hiyerarşik olarak listele.
- `textDocument/hover`: İmleç altındaki sembolün tipini ve tanımını göster.
- **Test kriteri:** VSCode'da `.sqt` dosyasııldığında hatalar kırmızı alt çizgi ile gösterilsin, Ctrl+Tık tanıma gitsin.
---
# Aşama 3: Syntax Highlighting (TextMate + Semantik)
> **Ön Koşul:** TextMate için: sadece keyword listesi (hemen yapılabilir). Semantik için: Aşama 1 (Sembol Tablosu).
> **Hedef:** `.sqt` dosyaları VSCode'da doğru ve zengin renklendirme alsın.
### Issue 3.1: TextMate Dilbilgisi Dosyası Oluştur
- **Dosya:** `editors/vscode/syntaxes/saqut.tmLanguage.json` (yeni)
- **Yapılacaklar:**
- Keyword'ler, operatörler, sayılar, string'ler, yorum satırları için regex desenleri.
- Mevcut `keywords[]` dizisindeki tüm keyword'leri kapsa.
- String interpolation (ileride) için temel yapı.
- **Test kriteri:** VSCode'da `.sqt` dosyasııldığında `if`, `for` mavi, `"hello"` turuncu, `// yorum` yeşil görünsün.
### Issue 3.2: Semantik Token Desteği Ekle
- **Dosya:** `src/lsp/handlers/semantic_tokens.hpp` (yeni)
- **Yapılacaklar:**
- `textDocument/semanticTokens/full` isteğini işle.
- AST + Sembol Tablosu kullanarak her token için `tokenType` (function, variable, parameter, type, keyword) ve `tokenModifiers` (declaration, readonly, static) belirle.
- LSP semantic token delta formatında kodla ve döndür.
- **Test kriteri:** VSCode'da `int x = foo();` yazıldığında `x` (değişken) ile `foo` (fonksiyon) farklı renkte olsun.
---
# Aşama 4: Kod Biçimlendirici ve Dokümantasyon Üretici (Derleyici Katmanı: AST)
> **Ön Koşul:** Aşama 0, Aşama 1. (AST ve konum bilgisi yeterli)
> **Hedef:** `saqut fmt` ile otomatik formatlama, `saqut doc` ile dokümantasyon üretimi.
### Issue 4.1: Pretty Printer (Kod Biçimlendirici)
- **Dosya:** `src/tools/pretty_printer.hpp` (yeni)
- **Yapılacaklar:**
- AST'yi dolaşarak, standart girintileme ve boşluk kurallarıyla kaynak kod üret.
- `saqut fmt <dosya>` komutu: dosyayı oku, parse et, pretty print yap, orijinal dosyayı güncelle (veya stdout'a bas).
- Kural seti: 4 boşluk girinti, operatör etrafında boşluk, virgülden sonra boşluk, süslü parantez aynı satırda.
- **Test kriteri:** `saqut fmt source.sqt` çalıştırıldığında dosya tutarlı formata dönüşsün, aynı kod tekrar formatlanırsa değişmesin (idempotent).
### Issue 4.2: Dokümantasyon Üretici
- **Dosya:** `src/tools/doc_generator.hpp` (yeni)
- **Yapılacaklar:**
- `///` veya `/** */` ile başlayan yorum bloklarını AST düğümlerine bağla (önceki satırdaki yorum, sonraki fonksiyon/değişken için doc sayılır).
- `saqut doc <dosya>` komutu: Markdown formatında API dokümantasyonu üret.
- LSP `hover` isteğine bu dokümantasyonu ekle (zengin Markdown).
- **Test kriteri:** `/// Bu fonksiyon iki sayıyı toplar` yorumu, `int add(int a, int b)` için hover'da görünsün.
---
# Aşama 5: IR Güçlendirme ve Interpreter (Derleyici Katmanı: IR + Backend)
> **Ön Koşul:** Aşama 1 (Sembol Tablosu ve Tip Sistemi).
> **Hedef:** Yazılan kodun çalıştırılabilmesi. Hem interpreter (REPL + dosya) hem de C transpile.
### Issue 5.1: IR'ye Kontrol Akışı ve Fonksiyon Opcode'ları Ekle
- **Dosya:** `src/ir/ir.hpp`
- **Yapılacaklar:**
- `OPCode` enum'una ekle: `br` (koşulsuz dal), `br_eq`, `br_lt`, `br_gt` (koşullu dal), `cmp` (karşılaştır), `call`, `ret`, `param`, `load`, `store`, `alloca`.
- `IROpData` yapısını yeni opcode'lar için güncelle (hedef adres, koşul register'ları).
- `CodeGenerator` sınıfına `if`, `while`, `for`, `do-while`, fonksiyon çağrısı, return için IR üretme mantığını ekle.
- **Test kriteri:** `if (x < 5) return x;` kodu için `cmp`, `br_lt`, `ret` IR komutları üretilsin.
### Issue 5.2: Interpreter (Sanal Makine)
- **Dosya:** `src/backend/interpreter.hpp` (yeni)
- **Yapılacaklar:**
- `Interpreter` sınıfı: IR komutlarını sırayla yürütür.
- Sanal register'ları ve bellek (stack) yönetimi.
- `OPCode` başına yürütme mantığı (switch-case).
- `saqut run <dosya>` komutu: Interpreter'ı kullanarak kodu çalıştır.
- `saqut` (argümansız): REPL modu, her satırı anında yorumla.
- **Test kriteri:** `int main() { return 42; }` kodu çalıştırıldığında çıkış kodu 42 olsun.
### Issue 5.3: C Transpile Backend
- **Dosya:** `src/backend/transpile_c.hpp` (yeni)
- **Yapılacaklar:**
- `CTranspiler` sınıfı: IR komutlarını C koduna çevirir.
- `saqut transpile <dosya> -o output.c` komutu.
- Üretilen C kodu `gcc`/`clang` ile derlenebilir ve çalıştırılabilir olmalı.
- `#line` direktifleri ile orijinal kaynak koda geri referans ver.
- **Test kriteri:** `int main() { return 1+2; }` kodu C'ye çevrilip GCC ile derlendiğinde çalışan binary 3 çıkış kodu versin.
---
# Aşama 6: Debugger (DAP Tabanlı)
> **Ön Koşul:** Aşama 5 (Interpreter).
> **Hedef:** VSCode içinden breakpoint koyma, adım adım çalıştırma, değişken izleme.
### Issue 6.1: Debug Adapter Protocol (DAP) Altyapısı
- **Dosya:** `src/debug/dap_server.hpp` (yeni)
- **Yapılacaklar:**
- JSON-RPC üzerine DAP mesajlarını işleyen sunucu (JSON-RPC altyapısı zaten LSP'den var, ortak kullan).
- `saqut debug` komutu: DAP sunucusunu başlatır.
- `launch` ve `attach` isteklerini işle.
- **Test kriteri:** VSCode'dan "Debug" başlatıldığında DAP el sıkışması (handshake) başarılı olsun.
### Issue 6.2: Interpreter'a Debugging Yetenekleri Ekle
- **Dosya:** `src/backend/interpreter.hpp` (güncelle)
- **Yapılacaklar:**
- Interpreter'a `stepOver`, `stepInto`, `stepOut`, `pause`, `continue` yetenekleri.
- Breakpoint yönetimi: `SourceLocation` ile eşleşen satırlarda dur.
- Değişken değerlerini okuma: `stackFrame`'den sembol ismiyle değer bulma.
- `variables` ve `evaluate` isteklerini cevapla.
- **Test kriteri:** VSCode'da bir satıra breakpoint koyup F5 ile debug başlatıldığında, o satırda dursun ve değişken değerleri gösterilsin.
### Issue 6.3: Zaman Yolculuğu Debugging (Opsiyonel, İleri Seviye)
- **Dosya:** `src/debug/time_travel.hpp` (yeni)
- **Yapılacaklar:**
- Interpreter her adımda program durumunu (stack, register'lar) bir listeye kaydetsin.
- Geri adım (`stepBack`) desteği.
- `saqut debug --time-travel` ile açılır.
- **Test kriteri:** Debug sırasında "Step Back" yapıldığında bir önceki satıra dönülsün ve değişken eski değerini göstersin.
---
# Aşama 7: Gelişmiş LSP Yetenekleri (Derleyici Katmanı: Tümü)
> **Ön Koşul:** Aşama 1, Aşama 5 (Interpreter çalışıyor olmalı).
> **Hedef:** VSCode'da tam kod tamamlama, referans bulma, kod haritası.
### Issue 7.1: Kod Tamamlama (Completion)
- **Dosya:** `src/lsp/handlers/completion.hpp`
- **Yapılacaklar:**
- `textDocument/completion` isteğini işle.
- İmleç konumundaki scope'a göre görünür tüm sembolleri listele.
- Fonksiyon parametre bilgisi (signature help).
- **Test kriteri:** `x.` yazıldığında `x`'in struct üyeleri listelensin.
### Issue 7.2: Referans Bulma (Find References)
- **Dosya:** `src/lsp/handlers/references.hpp`
- **Yapılacaklar:**
- `textDocument/references` isteğini işle.
- Sembol tablosundan sembolün tüm referans konumlarını döndür.
- **Test kriteri:** Bir değişkene sağ tıklanıp "Find All References" dendiğinde tüm kullanımlar listelensin.
### Issue 7.3: Kod Haritası / Çağrı Grafiği (Call Hierarchy)
- **Dosya:** `src/lsp/handlers/call_hierarchy.hpp`
- **Yapılacaklar:**
- `textDocument/prepareCallHierarchy`, `callHierarchy/incomingCalls`, `callHierarchy/outgoingCalls` isteklerini işle.
- AST ve Sembol Tablosu'ndan çağrı ilişkilerini çıkar.
- **Test kriteri:** Bir fonksiyona sağ tıklanıp "Show Call Hierarchy" dendiğinde çağrı ağacı gösterilsin.
---
# Aşama 8: Optimizasyonlar ve Analiz Araçları
> **Ön Koşul:** Aşama 5 (IR ve Interpreter).
> **Hedef:** Kod kalitesini artıran, geliştiriciye içgörü sağlayan araçlar.
### Issue 8.1: Linter ve Statik Analiz
- **Dosya:** `src/tools/linter.hpp`
- **Yapılacaklar:**
- `saqut lint <dosya>` komutu.
- Kullanılmayan değişken, import, fonksiyon tespiti.
- Karmaşıklık metrikleri (cyclomatic complexity).
- Null olabilecek değerlere erişim kontrolü (basit veri akışı analizi).
- **Test kriteri:** Kullanılmayan bir değişken için `[WARN] Unused variable 'x' at line 5` çıktısı alınsın.
### Issue 8.2: Optimizasyon Pas'ları
- **Dosya:** `src/optimizer/optimizer.hpp`, `src/optimizer/passes/`
- **Yapılacaklar:**
- Constant folding: `4 + 1``5`.
- Dead code elimination: `if (false) { ... }` bloğunu sil.
- Unused variable elimination: Kullanılmayan değişken tanımlarını kaldır.
- `CompilerConfig` ile her pas açılıp kapatılabilir olmalı.
- **Test kriteri:** `--opt-all` ile çalıştırılan kod, optimizasyonsuz halinden daha az IR komutu üretsin.
### Issue 8.3: Performans Profili (Profiler)
- **Dosya:** `src/tools/profiler.hpp`
- **Yapılacaklar:**
- `saqut profile run <dosya>` komutu.
- Interpreter modunda her fonksiyon çağrısının süresini ölç.
- Sonuçları flame graph formatında (katlanabilir JSON) dışa aktar.
- **Test kriteri:** Profiler çıktısı, en çok zaman harcanan fonksiyonu belirtsin.
---
# Aşama 9: Proje Sistemi, Derleyici Konfigürasyonu ve Feature Toggle
> **Ön Koşul:** Aşama 5 (Interpreter), Aşama 8 (Optimizasyon altyapısı).
> **Hedef:** `saqut init`, `saqut build`, `saqut test` komutlarının çalışması.
### Issue 9.1: Proje Başlatma ve Build Sistemi
- **Dosya:** `src/cli/commands/init.hpp`, `src/cli/commands/build.hpp`
- **Yapılacaklar:**
- `saqut init <proje-adı>`: Standart dizin yapısı ve `saqut.json` (proje manifesti) oluştur.
- `saqut build`: Manifest'i oku, tüm kaynak dosyaları derle, tek bir çalıştırılabilir üret (C transpile + GCC veya interpreter bytecode).
- **Test kriteri:** `saqut init myapp && cd myapp && saqut build` ile çalışan bir program elde edilsin.
### Issue 9.2: CompilerConfig ve Feature Toggle
- **Dosya:** `src/core/compiler_config.hpp`
- **Yapılacaklar:**
- `CompilerConfig` yapısı: Tüm dil özellikleri (`enableWhile`, `enableFor`, `enableClass`...), optimizasyon pas'ları, çıktı formatı.
- `saqut` komut satırından `--disable-while`, `--skip-constant-folding` gibi bayraklarla konfigüre edilebilsin.
- Tokenizer ve Parser, `CompilerConfig`'e göre davranış değiştirsin (kapalı keyword'leri identifier olarak tanısın).
- **Test kriteri:** `saqut run --disable-while` ile while döngüsü içeren kod hata versin.
### Issue 9.3: Test Çerçevesi (Built-in)
- **Dosya:** `src/cli/commands/test.hpp`, `src/core/test_framework.hpp`
- **Yapılacaklar:**
- `test` anahtar kelimesi veya `#[test]` anotasyonu.
- `saqut test` komutu: Projedeki tüm test fonksiyonlarını bul, çalıştır, sonuçları raporla.
- Test sonuçları TAP ve JUnit XML formatında çıkış.
- **Test kriteri:** `test "iki kere iki dort" { assert(2*2 == 4); }` testi `saqut test` ile geçsin.
---
# Aşama 10: Paket Yöneticisi ve Dağıtım (Gelecek)
> **Ön Koşul:** Aşama 9 (Proje sistemi).
> **Hedef:** Harici kütüphaneleri projeye ekleme ve dilin resmi paket kaydı.
### Issue 10.1: Paket Yöneticisi (saqut add)
- **Dosya:** `src/cli/commands/add.hpp`, `src/package/registry.hpp`
- **Yapılacaklar:**
- `saqut add <paket-adi>`: Merkezi paket kaydından (GitHub tabanlı) paketi indir, `saqut.json`'a ekle.
- Bağımlılık çözümleme (dependency resolution).
- **Test kriteri:** `saqut add json` ile JSON kütüphanesi projeye eklensin ve `import json;` kullanılabilsin.
### Issue 10.2: Kendi Kendini Derleme (Self-Hosting)
- **Dosya:** Proje geneli.
- **Yapılacaklar:**
- saQut derleyicisinin kaynak kodu, saQut dilinde yazılabilsin ve saQut ile derlenebilsin.
- Bu, dilin olgunluğunun nihai testidir.
- **Test kriteri:** `saqut build` ile derleyici kendi kaynak kodunu derleyip çalışan bir binary üretsin.
---
# Aşama 11: Dil Spesifikasyonu ve Resmi Dokümantasyon
> **Ön Koşul:** Aşama 9 (dil özellikleri stabilize olmalı).
> **Hedef:** Geliştiricilerin referans alabileceği eksiksiz bir dil tanımı.
### Issue 11.1: Dil Spesifikasyonu Yaz
- **Dosya:** `docs/lang_spec.md` (kitap formatında)
- **Yapılacaklar:**
- Sözdizimi grameri (EBNF).
- Tip sistemi ve dönüşüm kuralları.
- Çalışma zamanı davranışları (bellek modeli, hata yönetimi).
- Standart kütüphane sözleşmeleri.
- **Test kriteri:** Spesifikasyon, tüm dil özelliklerini kapsasın ve derleyici davranışıyla tutarlı olsun.
### Issue 11.2: Resmi Web Sitesi ve Öğretici
- **Dosya:** `docs/website/`
- **Yapılacaklar:**
- saqut-lang.org için statik site.
- "Başlangıç" rehberi, örnekler, API referansı (doc generator çıktısı).
- **Test kriteri:** Site yayında ve tüm örnekler çalıştırılabilir olsun.
---
# Ek: VSCode Eklentisi Paketleme
> **Ön Koşul:** Aşama 3 (Syntax Highlighting), Aşama 4 (LSP handlers).
> **Hedef:** VSCode marketplace'te yayınlanabilir bir eklenti.
### Issue E.1: VSCode Eklenti Manifesti ve Paketleme
- **Dosya:** `editors/vscode/package.json`, `editors/vscode/extension.js`
- **Yapılacaklar:**
- `package.json` içinde `activationEvents`, `contributes.languages`, `contributes.commands` tanımla.
- `extension.js`: LSP sunucusunu (`saqut lsp`) başlat, dil konfigürasyonunu yükle.
- `.vsix` paketi oluşturma betiği.
- **Test kriteri:** Eklenti VSCode'a yüklendiğinde `.sqt` dosyaları tanınsın ve LSP başlatılsın.
---
> **Yol haritası sonu.** Her aşamadaki issue'lar sırasıyla yapıldığında, saQut hem kendi kendini derleyebilen bir dil hem de geliştiricisine benzersiz içgörü sağlayan bir araç zinciri haline gelir.

View File

@ -1,5 +1,21 @@
# Syntax # Proje Yapısı ve Derleme
## Dizin Yapısı
- `src/`: Derleyici kaynak kodları (C++).
- `docs/`: Geliştirme notları, roadmap ve issue listesi.
- `examples/`: Örnek `.sqt` (saQut) kaynak kodları.
- `scripts/`: Derleme ve yardımcı betikler.
- `build/`: Derleme sonucu oluşan binary ve çıktılar (git tarafından yoksayılır).
## Derleme
Projeyi derlemek için ana dizinde şu komutu çalıştırabilirsiniz:
```bash
bash scripts/compile.sh
```
Derleme başarılı olduktan sonra çalıştırılabilir dosya `build/saqut` konumunda oluşacaktır.
# Syntax
...
Syntax modunda 2 seçenek bulunmaktadır Syntax modunda 2 seçenek bulunmaktadır
- JIR: Söz dizimi tamamen Java programlama diline uygun olarak parse edilmektedir. Compiling, transpiling desteklenir Interpreter desteklenmez - JIR: Söz dizimi tamamen Java programlama diline uygun olarak parse edilmektedir. Compiling, transpiling desteklenir Interpreter desteklenmez
- CIR: Söz dizimi tamamen C programlama diline uygun olarak parse edilir. Compiling ve Interpreter desteklenir. transpiling desteklenmez - CIR: Söz dizimi tamamen C programlama diline uygun olarak parse edilir. Compiling ve Interpreter desteklenir. transpiling desteklenmez

BIN
saqut

Binary file not shown.

26
scripts/compile.sh Executable file
View File

@ -0,0 +1,26 @@
#!/bin/bash
# ============================================================================
# saQut Compiler — Derleme Betiği
# ============================================================================
set -e
# Betiğin bulunduğu dizini al
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
PROJECT_ROOT="$( dirname "$SCRIPT_DIR" )"
echo "=== saQut Compiler Build ==="
# Build dizinini oluştur
mkdir -p "$PROJECT_ROOT/build"
# Derleme
g++ "$PROJECT_ROOT/src/main.cpp" \
-I"$PROJECT_ROOT/src" \
-std=c++17 \
-Wall -Wextra \
-O0 -g \
-o "$PROJECT_ROOT/build/saqut"
echo "Derleme başarılı: build/saqut"
echo "Çalıştırmak için: ./build/saqut"

View File

@ -98,7 +98,7 @@ inline CliArgs parseArgs(int argc, char* argv[]) {
if (args.command.empty()) args.command = "run"; if (args.command.empty()) args.command = "run";
if (args.positional.empty() && !args.stdinMode) if (args.positional.empty() && !args.stdinMode)
args.positional.push_back("source.sqt"); args.positional.push_back("examples/source.sqt");
return args; return args;
} }

View File

@ -90,10 +90,10 @@ public:
std::cout << " --format <json|text> Çıktı formatı (varsayılan: text)\n"; std::cout << " --format <json|text> Çıktı formatı (varsayılan: text)\n";
std::cout << " -h, --help Bu yardım metni\n\n"; std::cout << " -h, --help Bu yardım metni\n\n";
std::cout << "ÖRNEK:\n"; std::cout << "ÖRNEK:\n";
std::cout << " saqut run source.sqt\n"; std::cout << " saqut run examples/source.sqt\n";
std::cout << " saqut tokens source.sqt\n"; std::cout << " saqut tokens examples/source.sqt\n";
std::cout << " saqut ast source.sqt --format=json\n"; std::cout << " saqut ast examples/source.sqt --format=json\n";
std::cout << " saqut symbols source.sqt\n"; std::cout << " saqut symbols examples/source.sqt\n";
} }
private: private: