saqut
2d641863d8
chore(merge): master'dan gelen eski versiyon çakışmaları çözüldü
...
0.1.0 dalı, master'daki eski kaynak dosyaları üzerine yazıyor —
#35/#36 düzeltmeleri ve refactor değişiklikleri korundu.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 23:23:28 +03:00
saqut
4accdf8484
fix(ast,dce): #35 bellek sızıntısı + #36 W003 uyarısı
...
#35 — Her AST düğüm tipine sanal yıkıcı eklendi; ~ASTNode() children
vektörünü, alt sınıf yıkıcıları typed pointer'larını (condition, Left/Right,
initExpr, params…) özyinelemeli siler. FunctionDeclNode yıkıcısı incomplete
type uyarısını önlemek için .cpp'ye taşındı. DCE'deki erase sırası da
düzeltildi: remove_if → delete → erase (önceki sırayla dangling pointer
üzerinde dynamic_cast yapılıyordu → segfault).
#36 — DeadCodeElimPass artık DiagnosticEngine& alıyor; unreachable düğüm
işaretlendiğinde W003 raporu üretiliyor (saqut run --optimized ile görünür).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 23:20:11 +03:00
saqut
77bcd1c9d6
refactor(ast): LiteralNode ve IdentifierNode toJson spagetti → JsonObject
...
Elle yönetilen ostringstream + virgül/kapanış manipülasyonu kaldırıldı;
VariableDeclNode ile aynı JsonObject builder pattern'ına geçildi.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 23:04:00 +03:00
saqut
636bfcc6d5
fix(ir): %= bileşik atama IR üretiminde eksikti (B8)
...
Teşhis (a): Sadece %= unutulmuş — +=, -=, *=, /= doğru çalışıyordu.
PERCENT_EQUAL MOD opcode'una yönlendirildi; sıfıra mod runtime hatası
zaten interpreter'da mevcut, yeni kod gerekmedi.
CMakeLists.txt'e .runtime_error uzantısı eklendi (çalışma zamanı
hatası golden testleri için; aynı run_golden_error.cmake altyapısı).
Testler: compound_mod (17%5=2 zinciri) + mod_by_zero (runtime hata).
21/21 geçti.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 23:03:54 +03:00
Abdussamed
e5e0cdb2b3
Merge pull request #49 from abdussamedulutas/claude/merhaba-l34d5e
...
chore(build): uzak ortam için CMake yolları yeniden yapılandırıldı
2026-06-19 22:10:56 +03:00
Claude
f69654bbca
docs: dökümanlar ve issue'lar gerçek durumla güncellendi
...
- CLAUDE.md: "Mevcut durum" bölümü yeniden yazıldı — tüm pipeline
çalışıyor, bilinen eksikler (#35–#38) listelendi
- docs/fikirler.md: "kod üretimi VM henüz yoktur" notu kaldırıldı
- docs/adr-frontend-analiz.md: "henüz kodlanmamıştır" uyarısı kaldırıldı
- docs/roadmap-frontend.md: tüm fazlar (0–4) ✅ TAMAMLANDI olarak işaretlendi
- readme.md: saqut check komutu CLI tablosuna eklendi
- GitHub #30–#34 issue'ları kapatıldı (düzeltilmiş bug'lar)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 19:07:11 +00:00
Claude
06e4136705
chore(build): uzak ortam için CMake yolları yeniden yapılandırıldı
...
Oturum yeni bir konteynerda başladığı için önceki yerel yollar geçersizdi;
build/ temizlenip yeni ortam yollarıyla yeniden oluşturuldu.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 18:51:18 +00:00
saqut
a4fb3cfc4f
fix(tc): string sıralama operatörleri derleme zamanında bloklandı (B5)
...
Sorun: TypeChecker < > <= >= için tip kontrolü yapmıyordu; string
operandlarda VM sessizce intValue=0 karşılaştırıyordu.
Düzeltme: karşılaştırma bloğu ikiye ayrıldı:
== / != → string dahil herhangi tip (değişmedi)
< > <= >= → isNumeric() kontrolü; string veya diğer sayısal-olmayan
tipler E003 üretir, VM'e hiç ulaşmaz
Aritmetik (+ - * / %) zaten sayısal-olmayan tipler için E003 üretiyordu;
doğrulandı, değiştirilmedi.
Altyapı: cmake/run_golden_error.cmake + CMakeLists.txt'e .compile_error
desteği — derleme hatası bekleyen negatif golden testler için.
Testler (19/19 yeşil):
- string/ordering_error: string < → E003 (negatif test)
- string/equality: string == / != çalışmaya devam ediyor (regresyon)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 16:26:20 +03:00
saqut
7c93f12304
fix(ir): ! operatörü kopyalama yerine (x == 0) üretiyor (B2)
...
Sorun: unary ! dalı emitLoadSlot ile operandı kopyalıyordu — terslemiyordu.
Sabitlerde sabit katlama doğru çalışıyordu; değişken operandlar her zaman
orijinal değeri döndürüyordu.
Düzeltme: BANG case'i EQUAL_EQUAL(operand, 0) olarak üretiliyor.
!x → slots[result] = (slots[operand] == 0) ? 1 : 0
Sonuç her zaman 0 ya da 1; bool int olarak temsil edilmesiyle tutarlı.
~ (B2/F2 kapsamı dışı) eski TODO dalında kalmaya devam ediyor.
Test: tests/golden/logic/not_operator.sqt — değişken operandla !0→1,
!5→0, !!5→1, !!0→0, if(!x) dallanma. 17/17 test yeşil.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 16:15:46 +03:00
saqut
450f16008f
fix(ir): break/continue IR üretimi — döngü bağlamı yığını (B3)
...
Sorun: break ve continue için hiçbir opcode üretilmiyordu (TODO).
Düzeltme: her döngüye girerken LoopContext yığına push'lanır, çıkınca
pop'lanır. break/continue JMP -1 yazar, instruction indeksi bağlamda
toplanır. Döngü üretimi bitince tüm pending jump'lar doğru hedefe patch'lenir:
- break → her döngü türünde OUT (döngü sonu)
- continue while/do-while → LOOP_START / COND_LABEL
- continue for → C_LABEL (güncelleme başı, koşula DEĞİL)
(aksi halde i++ atlanır → sonsuz döngü)
İç içe döngülerde yığının en üstü en içteki bağlamdır; inner break/continue
dıştaki döngüyü etkilemez.
Testler (16/16 yeşil):
- for_break_continue: continue'nun i++'ı atlamadığını kanıtlar
- while_break_continue: while break/continue
- nested_break: inner break dış döngüyü etkilemiyor
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 16:09:57 +03:00
saqut
8509d09ca8
fix(ir): do-while == 1 geçici çözümü kaldırıldı, JIF_TRUE kullanılıyor (B4)
...
Sorun: koşul 1-olmayan sıfır-dışı bir değer (ör. 2) üretince "cond == 1"
karşılaştırması false dönüyor ve döngü yanlışlıkla erken çıkıyordu.
Düzeltme: üç geçici talimat (LOAD_CONST, EQUAL_EQUAL, JIF_FALSE) kaldırıldı.
Geri-jump artık doğrudan JIF_TRUE ile yapılıyor — truthy (sıfır-dışı her
değer) ise loopStart'a atla; isTruthy() semantiğiyle tutarlı.
Test: tests/golden/loops/do_while_truthy.sqt — koşulun i<3 ifadesi (1 veya 0
üretir, 2 üretmez), ancak "while (j)" (j=5→truthy→dön, j=0→false→çık) gibi
1-olmayan truthy koşullar da doğru çalışıyor. 13/13 test yeşil.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 15:59:15 +03:00
saqut
c5fb57412a
fix(ir): && ve || kısa devre dallanmasıyla üret (ADR-008)
...
Sorun: IR üretici && ve || için case içermiyordu, default koluna
düşüp LOAD_CONST 0 üretiyordu — değişken operandlarda her zaman
false dönüyordu (sabit katlama yolu zaten doğruydu).
Düzeltme: her iki operatör artık dallanma olarak üretiliyor:
a && b → JIF_FALSE (a false ise b'yi atla)
a || b → JIF_TRUE (a true ise b'yi atla)
JIF_TRUE yeni opcode olarak eklendi (instruction.hpp + interpreter.cpp).
do-while'ın mevcut "== 1 karşılaştırması" geçici çözümü bu opcode'dan
faydalanabilir — ayrı düzeltme (B4).
Test: tests/golden/logic/short_circuit.sqt — yan etkinin gerçekten
atlandığını çıktıyla kanıtlar (12/12 test yeşil).
ADR: docs/adr/ADR-008-kisa-devre-mantiksal-operatorler.md
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 15:54:03 +03:00
abdussamedulutas
98bf8385d2
refactor(opt): klon sadece ast komutunda — run/ir yerinde optimize eder
...
ADR-007 düzeltmesi: klon yalnızca ast komutunun öncesi/sonrası karşılaştırması
için gerekli; diğer komutlar tek versiyon üretiyor, klona gerek yok.
- OptimizationManager: runPassesInPlace() (klon yok) + optimize() (klon, sadece ast)
- run.hpp + ir.hpp: optimize() → runPassesInPlace(); activeAst/optimizedAst dansı kalktı
- ast.hpp: değişmedi — hâlâ optimize() (klon) kullanıyor
- ADR-007: "sembol tablosu remap edilir" yanlış kararı düzeltildi;
Symbol::references konum listesi, refcount değil — paylaşım güvenli
11/11 ctest geçti
2026-06-18 23:15:27 +03:00
abdussamedulutas
ab47e42954
feat(run): --optimized bayrağı — optimize edilmiş IR üzerinden VM çalıştırma
...
- run.hpp: args.optimized ise OptimizationManager klonu üretip IR generator'a verir
- ir.hpp + run.hpp: optDiag.printAll sadece gerçek mesaj varsa çağrılıyor (boş özet gürültüsü giderildi)
- tests/golden/opt/run_opt.sqt: constant folding + DCE tetikleyen golden fixture
- run_opt.expected: ham run doğruluk testi (test #9 )
- run_opt.run_opt.expected: optimize run doğruluk testi (test #10 )
→ "optimizasyon oldu" değil "optimize IR doğru sonuç verdi" regresyon kalkanı
- CMakeLists.txt: *.run_opt.expected → saqut run --optimized otomatik keşif
11/11 ctest geçti
2026-06-18 23:04:57 +03:00
abdussamedulutas
913b42026c
test(opt): #104/#105 beyaz-kutu IR testleri — folding ve DCE doğru katmanda
...
- ir.hpp: --optimized bayrağı ile OptimizationManager entegrasyonu
- ir_generator.cpp: hasDirectValue/directIntValue okunuyor (katlanmış literal IR'da 0 veriyordu)
- run_golden.cmake: OPTIMIZED=1 parametresi ile --optimized desteği
- CMakeLists.txt: *.ir_opt.expected → saqut ir --optimized otomatik keşif
- opt/folding.ir_opt.expected: 2+3*4 → LOAD_CONST 14 (katlama kanıtı)
- opt/dce.ir_opt.expected: LOAD_CONST 99 + CALLHOST print silindi (DCE kanıtı)
- Yanıltıcı run-output testleri (folding.expected, dce.expected) kaldırıldı
2026-06-18 22:47:31 +03:00
abdussamedulutas
ac96ad810c
test: golden testler — operatör önceliği, döngüler, folding, DCE
...
closes #99 , #100 , #104 , #105
- arithmetic/precedence: Pratt öncelik + sol-birliktelik + modulo
- loops/basic: while/do-while/for üçü de 0,1,2 üretiyor
- loops/do_while_once: koşul baştan yanlış, gövde yine de bir kez çalışıyor
- opt/folding: sabit katlama çıktısı (14,3,1,0,1,0,0)
- opt/dce: ölü return sonrası kod programı etkilemiyor (10,0,0)
9/9 ctest geçti
2026-06-18 22:33:19 +03:00
abdussamedulutas
85d955ec62
test: golden-test koşucusu + Value audit + saqut ir pipeline fix
...
closes #113 , #114 , #75
- cmake/run_golden.cmake: BINARY/SOURCE/EXPECTED ile çalışan karşılaştırma betiği
- CMakeLists.txt: enable_testing(), golden test otomatik keşif (CONFIGURE_DEPENDS),
unit_tests (tests/run.sh) ctest entegrasyonu
- tests/golden/: fibonacci, string, arithmetic — 4/4 yeşil (negatif doğrulama da geçti)
- value.hpp: stale yorum temizlendi, toString() eklendi, switch exhaustive hale getirildi
- ir.hpp: TypeChecker + StructuralValidator eklendi — run pipeline ile artık eşit
2026-06-18 22:31:26 +03:00
abdussamedulutas
698d03f4dd
docs: README yeniden yazıldı — GitHub vitrin formatı, mimari referans docs/architecture.md'ye taşındı
2026-06-18 21:53:08 +03:00
abdussamedulutas
d51e48dbb2
feat(opt): sabit katlama'ya unary operatörler ekle (!, ~, -, +)
...
Parser unary'yi BinaryExpressionNode(Left=nullptr) olarak temsil eder.
isScalarLit/getScalarVal/canFoldUnary/computeUnary eklendi.
Katlanan ifadeler: !0→1, !1→0, !42→0, ~0→-1, ~1→-2, -5→-5, +7→7,
!true→0, !false→1. Zincirli: !(!0 )→0 (fixpoint ile).
Boolean literal (true/false) da !operatörü için desteklenir.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 21:21:28 +03:00
abdussamedulutas
0bcdabab8a
feat(opt): sabit katlama'ya unary operatörler ekle (!, ~, -, +)
...
Parser unary'yi BinaryExpressionNode(Left=nullptr) olarak temsil eder.
isScalarLit/getScalarVal/canFoldUnary/computeUnary eklendi.
Katlanan ifadeler: !0→1, !1→0, !42→0, ~0→-1, ~1→-2, -5→-5, +7→7,
!true→0, !false→1. Zincirli: !(!0 )→0 (fixpoint ile).
Boolean literal (true/false) da !operatörü için desteklenir.
2026-06-18 21:21:28 +03:00
abdussamedulutas
3d5912f991
feat(opt): sabit katlama'ya mantıksal operatörler ekle (&&, ||)
...
canFoldOp ve computeOp'a AMPERSAND_AMPERSAND ve PIPE_PIPE eklendi.
false && false, true || false gibi sabit mantıksal ifadeler artık
derleme zamanında 0/1 literaline katlanır.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 21:16:35 +03:00
abdussamedulutas
d5cdc00682
feat(opt): sabit katlama'ya mantıksal operatörler ekle (&&, ||)
...
canFoldOp ve computeOp'a AMPERSAND_AMPERSAND ve PIPE_PIPE eklendi.
false && false, true || false gibi sabit mantıksal ifadeler artık
derleme zamanında 0/1 literaline katlanır.
2026-06-18 21:16:35 +03:00
abdussamedulutas
044655d675
feat(opt): Faz 4 — Optimizasyon (sabit katlama + ölü kod eleme + --optimized)
...
- src/core/config.hpp: CompilerConfig (pass toggle'lar + maxFixpointRounds)
- src/opt/optimization_pass.hpp: soyut OptimizationPass tabanı
- src/opt/ast_clone.hpp: deepClone — tüm node tiplerini kapsayan derin klonlama
- src/opt/constant_folding.hpp: BinaryExpr(Literal,OP,Literal) → Literal;
W002 sıfıra bölme uyarısı; + - * / % == != < > <= >= desteklenir
- src/opt/dead_code_elim.hpp: return/break/continue sonrası erişilemez
deyimler Block'tan silinir
- src/opt/optimization_manager.hpp: AST klonlar, fixpoint döngüsüyle pass'leri
çalıştırır (ADR-007/009)
- literal.hpp/.cpp: hasDirectValue/directIntValue — sentetik (token-sız) literal
- args.hpp: --optimized bayrağı
- cli/commands/ast.hpp: --optimized verilince klon üstünde optimize edilmiş AST
gösterilir; orijinal dokunulmaz
- examples/opt_folding.sqt, examples/opt_dce.sqt: örnek fixture'lar
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 21:11:05 +03:00
abdussamedulutas
36ad5d0db5
feat(opt): Faz 4 — Optimizasyon (sabit katlama + ölü kod eleme + --optimized)
...
- src/core/config.hpp: CompilerConfig (pass toggle'lar + maxFixpointRounds)
- src/opt/optimization_pass.hpp: soyut OptimizationPass tabanı
- src/opt/ast_clone.hpp: deepClone — tüm node tiplerini kapsayan derin klonlama
- src/opt/constant_folding.hpp: BinaryExpr(Literal,OP,Literal) → Literal;
W002 sıfıra bölme uyarısı; + - * / % == != < > <= >= desteklenir
- src/opt/dead_code_elim.hpp: return/break/continue sonrası erişilemez
deyimler Block'tan silinir
- src/opt/optimization_manager.hpp: AST klonlar, fixpoint döngüsüyle pass'leri
çalıştırır (ADR-007/009)
- literal.hpp/.cpp: hasDirectValue/directIntValue — sentetik (token-sız) literal
- args.hpp: --optimized bayrağı
- cli/commands/ast.hpp: --optimized verilince klon üstünde optimize edilmiş AST
gösterilir; orijinal dokunulmaz
- examples/opt_folding.sqt, examples/opt_dce.sqt: örnek fixture'lar
2026-06-18 21:11:05 +03:00
abdussamedulutas
b6e4d75bde
chore: MISSION-FAZ3.md tamamlandı, sil
...
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 20:52:48 +03:00
abdussamedulutas
6b3631bbb6
chore: MISSION-FAZ3.md tamamlandı, sil
2026-06-18 20:52:48 +03:00
abdussamedulutas
580f9f8c5f
chore: .gitignore — CMake versiyona özgü dosyaları hariç tut
...
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 19:52:33 +03:00
abdussamedulutas
dbe49f909d
chore: .gitignore — CMake versiyona özgü dosyaları hariç tut
2026-06-18 19:52:33 +03:00
abdussamedulutas
539e08e521
feat(vm): string veri tipi + run pipeline'ına TypeChecker eklendi
...
- Value: ValueKind::String + stringValue alanı eklendi
- instruction: LOAD_STRING opcode'u eklendi
- ir_generator: STRING literal → LOAD_STRING; desteklenmeyen tipler
(FLOAT, null) IR üretim aşamasında hata fırlatır
- interpreter: runtime tip kontrolleri kaldırıldı (TypeChecker zaten
derleme zamanında tipleri doğruluyor); sıfıra bölme kontrolü kaldı
(gerçek çalışma zamanı koşulu); print() string/int ayırt eder
- run.hpp: TypeChecker + StructuralValidator pipeline'a eklendi
Test:
build/saqut run file:examples/merhaba.sqt → Merhaba / saQut calisiyor
build/saqut run file:examples/fibonacci.sqt → 55 / 55
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 19:46:48 +03:00
abdussamedulutas
0b3f14e4d7
feat(vm): string veri tipi + run pipeline'ına TypeChecker eklendi
...
- Value: ValueKind::String + stringValue alanı eklendi
- instruction: LOAD_STRING opcode'u eklendi
- ir_generator: STRING literal → LOAD_STRING; desteklenmeyen tipler
(FLOAT, null) IR üretim aşamasında hata fırlatır
- interpreter: runtime tip kontrolleri kaldırıldı (TypeChecker zaten
derleme zamanında tipleri doğruluyor); sıfıra bölme kontrolü kaldı
(gerçek çalışma zamanı koşulu); print() string/int ayırt eder
- run.hpp: TypeChecker + StructuralValidator pipeline'a eklendi
Test:
build/saqut run file:examples/merhaba.sqt → Merhaba / saQut calisiyor
build/saqut run file:examples/fibonacci.sqt → 55 / 55
2026-06-18 19:46:48 +03:00
abdussamedulutas
a4bd5110b3
chore(ir): dump formatını sade yap — NAME=... PARAMS=... SLOTS=...
...
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 19:29:32 +03:00
abdussamedulutas
62280cd530
chore(ir): dump formatını sade yap — NAME=... PARAMS=... SLOTS=...
2026-06-18 19:29:32 +03:00
abdussamedulutas
7c7f886e9c
feat(cli): saqut ir komutu — IR talimat dump'u
...
- IRFunction::dump() yenilendi: ASCII kutu, sn slot notasyonu,
ikili op'larda sembol (+/-/*/<= vb.), hizalı sütunlar
- src/cli/commands/ir.hpp: tokenize→parse→collect→ir→dump pipeline
- main.cpp + args.hpp: "ir" komutu kayıtlı
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 19:21:12 +03:00
abdussamedulutas
214ecadf21
feat(cli): saqut ir komutu — IR talimat dump'u
...
- IRFunction::dump() yenilendi: ASCII kutu, sn slot notasyonu,
ikili op'larda sembol (+/-/*/<= vb.), hizalı sütunlar
- src/cli/commands/ir.hpp: tokenize→parse→collect→ir→dump pipeline
- main.cpp + args.hpp: "ir" komutu kayıtlı
2026-06-18 19:21:12 +03:00
abdussamedulutas
9b486942c0
feat(ir-vm): fibonacci.sqt çalışıyor — IR üretici + bytecode VM
...
IR instruction seti (14 opcode): LOAD_CONST, LOAD_SLOT, ADD/SUB/MUL/DIV/MOD,
LESS/LEQ/GT/GEQ/EQ/NEQ, JMP, JIF_FALSE, CALL, RETURN, CALLHOST
IRGenerator (AST → IR):
- Slot tabanlı register: parametreler slot 0..n, lokaller/geçiciler sonrası
- freshSlot() monoton sayaç — slot asla geri verilmez
- Backpatch: ileri-jump için emitJumpIfFalse(-1) → patchJump(idx)
- Geri-jump: loopStart = currentInstrIndex() → emitJumpUnconditional(loopStart)
- Builtin tespiti: resolvedSymbol->isBuiltin → CALLHOST
Interpreter (bytecode VM):
- Her iterasyonda callStack.back() taze alınır (referans güvenliği)
- CALL: yeni frame + argüman kopyası + continue
- RETURN: değer caller slotuna, frame pop + continue
- ip CALL/RETURN'den önce ilerler — caller doğru noktadan devam eder
- DIV: sıfıra bölme → runtime_error
Doğrulama:
build/saqut run file:examples/fibonacci.sqt → 55 / 55 ✓
tests/run.sh → TUM TESTLER GECTI ✓
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 19:17:30 +03:00
abdussamedulutas
e488f29c23
feat(ir-vm): fibonacci.sqt çalışıyor — IR üretici + bytecode VM
...
IR instruction seti (14 opcode): LOAD_CONST, LOAD_SLOT, ADD/SUB/MUL/DIV/MOD,
LESS/LEQ/GT/GEQ/EQ/NEQ, JMP, JIF_FALSE, CALL, RETURN, CALLHOST
IRGenerator (AST → IR):
- Slot tabanlı register: parametreler slot 0..n, lokaller/geçiciler sonrası
- freshSlot() monoton sayaç — slot asla geri verilmez
- Backpatch: ileri-jump için emitJumpIfFalse(-1) → patchJump(idx)
- Geri-jump: loopStart = currentInstrIndex() → emitJumpUnconditional(loopStart)
- Builtin tespiti: resolvedSymbol->isBuiltin → CALLHOST
Interpreter (bytecode VM):
- Her iterasyonda callStack.back() taze alınır (referans güvenliği)
- CALL: yeni frame + argüman kopyası + continue
- RETURN: değer caller slotuna, frame pop + continue
- ip CALL/RETURN'den önce ilerler — caller doğru noktadan devam eder
- DIV: sıfıra bölme → runtime_error
Doğrulama:
build/saqut run file:examples/fibonacci.sqt → 55 / 55 ✓
tests/run.sh → TUM TESTLER GECTI ✓
2026-06-18 19:17:30 +03:00
abdussamedulutas
8453dcd796
chore: CLAUDE.md güncelle + gen_large.py + large.sqt ekle
...
- CLAUDE.md: Faz 2/3 tamamlandı, yeni komutlar (check), nlohmann/json,
semantic/ klasörü, performans optimizasyonu notları güncellendi
- scripts/gen_large.py: 2.3MB geçerli .sqt dosyası üreten benchmark script'i
- examples/large.sqt: 5000 fonksiyon, 90K satır, performans test fixture'ı
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 18:40:30 +03:00
abdussamedulutas
490db7ca31
chore: CLAUDE.md güncelle + gen_large.py + large.sqt ekle
...
- CLAUDE.md: Faz 2/3 tamamlandı, yeni komutlar (check), nlohmann/json,
semantic/ klasörü, performans optimizasyonu notları güncellendi
- scripts/gen_large.py: 2.3MB geçerli .sqt dosyası üreten benchmark script'i
- examples/large.sqt: 5000 fonksiyon, 90K satır, performans test fixture'ı
2026-06-18 18:40:30 +03:00
abdussamedulutas
2b9888c021
perf(tokenizer): switch dispatch + unordered_map keyword lookup
...
Önceki: for döngüsü içinde her token için include() 63 kez çağrılıyordu
→ 66.9M include() çağrısı, zamanın %81'i
Sonraki:
- Operatör/delimiter: switch(c0) + getchar(1) ile O(1) dispatch
- Keyword: readIdentifier() → unordered_map::find() O(1) lookup
- include() yalnızca // /* */ için (2-3 çağrı/yorum satırı)
Sonuç (2.3MB, 90K satır, debug build):
tokens: 11.5s → 2.4s (−79%)
check: 12.7s → 3.7s (−71%)
gprof ÖNCE: %81 include() (66.9M çağrı)
gprof SONRA: include() %0.00 — artık ölçülemez
Profil dosyaları: docs/perf-before.txt, docs/perf-after.txt
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 18:35:10 +03:00
abdussamedulutas
68a9e07f8e
perf(tokenizer): switch dispatch + unordered_map keyword lookup
...
Önceki: for döngüsü içinde her token için include() 63 kez çağrılıyordu
→ 66.9M include() çağrısı, zamanın %81'i
Sonraki:
- Operatör/delimiter: switch(c0) + getchar(1) ile O(1) dispatch
- Keyword: readIdentifier() → unordered_map::find() O(1) lookup
- include() yalnızca // /* */ için (2-3 çağrı/yorum satırı)
Sonuç (2.3MB, 90K satır, debug build):
tokens: 11.5s → 2.4s (−79%)
check: 12.7s → 3.7s (−71%)
gprof ÖNCE: %81 include() (66.9M çağrı)
gprof SONRA: include() %0.00 — artık ölçülemez
Profil dosyaları: docs/perf-before.txt, docs/perf-after.txt
2026-06-18 18:35:10 +03:00
abdussamedulutas
aa4d9fb8c2
perf: include() parametresini std::string → std::string_view yap
...
Tokenizer her token için ~84 kez include() çağırıyor.
Önceki imza std::string (değer kopyası) aldığından her çağrıda
heap allocation yapılıyordu. string_view + explicit std::string()
cast'larının kaldırılmasıyla 2.3 MB dosyada tokens süresi
17.6s → 11.9s (−32%).
Kök neden: src/tokenizer/tokenizer.cpp satır 44/61/73'teki
std::string(kw/del/op) explicit cast'ları string_view tablolardan
gereksiz kopya üretiyordu.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 18:03:54 +03:00
abdussamedulutas
ecaba688ae
perf: include() parametresini std::string → std::string_view yap
...
Tokenizer her token için ~84 kez include() çağırıyor.
Önceki imza std::string (değer kopyası) aldığından her çağrıda
heap allocation yapılıyordu. string_view + explicit std::string()
cast'larının kaldırılmasıyla 2.3 MB dosyada tokens süresi
17.6s → 11.9s (−32%).
Kök neden: src/tokenizer/tokenizer.cpp satır 44/61/73'teki
std::string(kw/del/op) explicit cast'ları string_view tablolardan
gereksiz kopya üretiyordu.
2026-06-18 18:03:54 +03:00
abdussamedulutas
e84828b631
feat(faz3): semantik analiz — tip denetimi + yapısal doğrulama ( #72 )
...
- src/semantic/type_checker: her ExpressionNode'a resolvedType atar
* literal bağlama-göre tiplenir (float x = 1 → uyarısız)
* değişken→değişken genişletme → W004
* daraltma / farklı tip → E003
* fonksiyon çağrısı argüman sayısı/tipi → E008
* return tipi uyumsuzluğu → E003 (checkAssign üzerinden)
- src/semantic/structural_validator: kontrol akışı kuralları
* break/continue döngü dışı → E004
* return fonksiyon dışı → E005
- W004 diagnostic kataloğa eklendi
- saqut check komutu: tokenize→parse→collect→typecheck→validate
- examples/semantic/: widening, narrowing, bad_return, break_outside, bad_args
- MISSION-FAZ3.md eklendi
Doğrulama:
fibonacci.sqt → 0 hata 0 uyarı ✓
widening.sqt → W004 ✓
narrowing.sqt → E003 ✓
break_outside.sqt → E004 ✓
bad_args.sqt → E008 ✓
tests/run.sh → TUM TESTLER GECTI ✓
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 17:20:06 +03:00
abdussamedulutas
999edaeaa9
feat(faz3): semantik analiz — tip denetimi + yapısal doğrulama ( #72 )
...
- src/semantic/type_checker: her ExpressionNode'a resolvedType atar
* literal bağlama-göre tiplenir (float x = 1 → uyarısız)
* değişken→değişken genişletme → W004
* daraltma / farklı tip → E003
* fonksiyon çağrısı argüman sayısı/tipi → E008
* return tipi uyumsuzluğu → E003 (checkAssign üzerinden)
- src/semantic/structural_validator: kontrol akışı kuralları
* break/continue döngü dışı → E004
* return fonksiyon dışı → E005
- W004 diagnostic kataloğa eklendi
- saqut check komutu: tokenize→parse→collect→typecheck→validate
- examples/semantic/: widening, narrowing, bad_return, break_outside, bad_args
- MISSION-FAZ3.md eklendi
Doğrulama:
fibonacci.sqt → 0 hata 0 uyarı ✓
widening.sqt → W004 ✓
narrowing.sqt → E003 ✓
break_outside.sqt → E004 ✓
bad_args.sqt → E008 ✓
tests/run.sh → TUM TESTLER GECTI ✓
2026-06-18 17:20:06 +03:00
abdussamedulutas
b071dab54c
feat(symbols): --compact bayrağı + referenceCount alanı
...
- CliArgs'e compact bool eklendi; --compact ile boşluksuz JSON çıktısı
- symbols çıktısında her sembol için referenceCount (references.size()) alanı eklendi
- fibonacci.sqt onarıldı: araç hatası sonucu silinen '{' geri konuldu
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 16:44:03 +03:00
abdussamedulutas
9227b92549
feat(symbols): --compact bayrağı + referenceCount alanı
...
- CliArgs'e compact bool eklendi; --compact ile boşluksuz JSON çıktısı
- symbols çıktısında her sembol için referenceCount (references.size()) alanı eklendi
- fibonacci.sqt onarıldı: araç hatası sonucu silinen '{' geri konuldu
2026-06-18 16:44:03 +03:00
abdussamedulutas
dc41a5df59
refactor: nlohmann/json entegrasyonu — string birleştirme yerine nesne API
...
- src/vendor/nlohmann/json.hpp eklendi (single-header, MIT)
- SourceLocation → toJsonObj() + toJson() (nlohmann)
- Type → toJsonObj() + toJson() (nlohmann, özyinelemeli)
- Diagnostic → toJsonObj() + toJson() (nlohmann)
- DiagnosticEngine→ toJsonObj() + toJson() (nlohmann)
- symbols.hpp → tamamen nlohmann ile yeniden yazıldı
Tüm toJson() imzaları std::string döndürmeye devam eder;
AST JsonObject builder'ı dokunulmadı (ayrı katman).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 16:21:58 +03:00
abdussamedulutas
1923524056
refactor: nlohmann/json entegrasyonu — string birleştirme yerine nesne API
...
- src/vendor/nlohmann/json.hpp eklendi (single-header, MIT)
- SourceLocation → toJsonObj() + toJson() (nlohmann)
- Type → toJsonObj() + toJson() (nlohmann, özyinelemeli)
- Diagnostic → toJsonObj() + toJson() (nlohmann)
- DiagnosticEngine→ toJsonObj() + toJson() (nlohmann)
- symbols.hpp → tamamen nlohmann ile yeniden yazıldı
Tüm toJson() imzaları std::string döndürmeye devam eder;
AST JsonObject builder'ı dokunulmadı (ayrı katman).
2026-06-18 16:21:58 +03:00
abdussamedulutas
e223995f20
feat(symbols): JSON çıktı + syntax hata toleransı
...
- symbols komutu artık JSON üretiyor: file, symbols[], diagnostics
Her sembol: name, kind, type, typeDetail, definition (file+satır+sütun),
references[], isBuiltin — LSP tüketimine hazır format
- parser: parseProgram() ilerleme olmayana token atla (guard ekle)
Bozuk top-level syntax (ör: `}`, eksik parametre listesi) artık
ayrıştırmayı durdurmak yerine sonraki geçerli bildirimi bulmaya devam eder
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 16:11:34 +03:00
abdussamedulutas
a37f6b0ff1
feat(symbols): JSON çıktı + syntax hata toleransı
...
- symbols komutu artık JSON üretiyor: file, symbols[], diagnostics
Her sembol: name, kind, type, typeDetail, definition (file+satır+sütun),
references[], isBuiltin — LSP tüketimine hazır format
- parser: parseProgram() ilerleme olmayana token atla (guard ekle)
Bozuk top-level syntax (ör: `}`, eksik parametre listesi) artık
ayrıştırmayı durdurmak yerine sonraki geçerli bildirimi bulmaya devam eder
2026-06-18 16:11:34 +03:00