saqut
786812c717
feat(string+error+null): ADR-024/025/021 uygulama — string concat, try/catch/throw, nullable akış-analizi
...
## String cilası (ADR-024)
- STRING_CONCAT opcode: s1 + s2 ve s1 += s2 → yeni string üretir
- Tip denetleyicide string + string → string; içerik == zaten vardı
- Golden: tests/golden/string/concat.sqt
## Hata yönetimi (ADR-025, #57 )
- AST: TryStatementNode, ThrowStatementNode
- Parser: try { } catch (Error e) { }, throw <ifade>;
- IR: ENTER_TRY / LEAVE_TRY / THROW opcode'ları + backpatch
- VM: TryFrame yığını + pendingThrow_ unwind; runtime hatalar (DIV/0, OOB)
artık yakalanabilir Error nesnesi olarak yükseltiliyor
- Builtin: Error{line,col,message,trace,code} sembol tablosuna kayıtlı
- Golden: tests/golden/error/basic_catch.sqt, throw_and_nested.sqt
## Null akış-analizi (ADR-021 — REVİZE, a!/??/?. yasak)
- Type: nullable bool alanı; asNullable/asNonNull/equalsBase/isNullLiteral
- fromName("int?") → nullable int; toString() → "int?"
- Parser: T? değişken/parametre/dönüş tipi; int? f() dispatch bug'ı düzeltildi
- IR: LOAD_NULL opcode; null literal → Value::null()
- Tip denetleyici:
- checkAssign: T? ← null OK; T ← T? E003; T? ← T OK (widening)
- Nullable operand aritmetikte/karşılaştırmada E003
- MemberAccess: nullable nesnede doğrudan erişim E003
- Nested: if (a != null) → then'de non-null
- Guard: if (a == null) return; → sonrasında non-null
- &&: sol null-check → sağ tarafta non-null
- Golden: tests/golden/null/{narrowing,and_narrowing,nullable_assign_error,nullable_operand_error}
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YAu3MGu3sWAUvTu7N9agPk
2026-06-20 21:34:25 +03:00
saqut
996868efeb
feat(float): float/double aritmetik runtime ( #44 )
...
- value.hpp: ValueKind::Float + floatValue alanı; toString() noktalı gösterim
- instruction.hpp: LOAD_FLOAT, FADD, FSUB, FMUL, FDIV, FNEG, INT_TO_FLOAT, FLOAT_TO_INT
- instruction.hpp: Instruction.floatValue alanı (double)
- ir_generator: LOAD_FLOAT emit; int→float çevrimi (bağlama-göre literal, INT_TO_FLOAT);
generateBinaryArithmetic float-aware (FADD/FSUB/FMUL/FDIV seçimi)
- interpreter: LOAD_FLOAT/FADD/FSUB/FMUL/FDIV/FNEG/INT_TO_FLOAT/FLOAT_TO_INT case'leri
- print: val.toString() ile float değerleri "3.14" formatında yazdırır
- ir_function: LOAD_FLOAT/FNEG/INT_TO_FLOAT/FLOAT_TO_INT dump; FADD/FSUB/FMUL/FDIV sembol
- golden test: tests/golden/float/basic.sqt (22 test geçiyor)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-20 16:37:59 +03:00
saqut
435c8bcb96
feat(struct+null): struct runtime + ValueKind::Null + E010 ADR-020 revizyonu
...
- value.hpp: ValueKind::Nil → ValueKind::Null (saQut'ta null anahtar sözcüğü)
- object.hpp: StructObject : Object eklendi (alanlar sıralı Value[] olarak)
- instruction.hpp: STRUCT_NEW, FIELD_GET, FIELD_SET opcodes
- ir_generator: struct layout haritası (sembol tablosundan), VariableDecl struct init,
MemberAccess okuma/yazma codegen
- interpreter: STRUCT_NEW/FIELD_GET/FIELD_SET + referans semantiği
- ir_function: STRUCT_NEW/FIELD_GET/FIELD_SET dump
- symbol_table: structLayouts haritası + getFieldIndex/getFieldType yardımcıları
- symbol_collector: StructDecl her zaman structFields_ girişi açar; structLayouts doldurur
- E010 devre dışı — ADR-020: struct alanları referans semantiği taşır, by-value döngü yok
- type_checker: MemberAccess struct alan tipi çözümlendi; IndexExpression array eleman tipi
- parser: parseStatement'a "TypeName VarName" → parseVariableDecl desteği (struct değişkeni)
- golden test: tests/golden/struct/basic.sqt (21 test geçiyor)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-20 16:33:51 +03:00
saqut
f1cb983b69
feat(array): GC-hazır nesne modeli + array runtime (ADR-020/022/023)
...
- src/vm/object.hpp: Object, ArrayObject, Heap (v1: toplama yok, mark-sweep kancaları hazır)
- src/vm/value.hpp: ValueKind::Ref + Nil eklendi (ADR-020/021)
- src/ir/instruction.hpp: ARRAY_NEW/GET/SET/LEN opcodes
- src/ir/ir_generator: array literal + a[i] okuma/yazma codegen
- src/parser: [1,2,3] array literal, int[] tip sözdizimi (Java/C# stili)
- src/vm/interpreter: ARRAY_NEW/GET/SET/LEN, sınır kontrolü, referans semantiği
- EQUAL_EQUAL/NOT_EQUAL: Ref türü için kimlik karşılaştırması (ADR-023)
- type.hpp: Type::fromName "int[]" vb. array tipleri destekliyor
- golden test: tests/golden/array/ref_semantics.sqt (referans semantiği, kimlik ==)
- 20 golden test geçiyor
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-20 16:18:23 +03:00
saqut
3c31f606d6
docs(ir): LOAD_GLOBAL/STORE_GLOBAL modül-düzeyi olarak yeniden çerçevelendi
...
Global değil — her değişken kendi dosyasına (modülüne) aittir.
ES6 modül mantığı: ortak global alan yok, yalnızca modül kapsamlı değişkenler.
İlgili: #53 (IRFunction.moduleId), #54 (Symbol.sourceModule)
Teknik borç: TODO.md #modül-scope başlığı
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-20 15:16:40 +03:00
saqut
808efc5b4a
feat(ir,vm): #45 bitwise operatörler + #38 global değişken IR (Seçenek A)
...
#45 — BAND, BOR, SHL, SHR (binary) ve BNOT (unary ~) opcode'ları eklendi.
Bileşik atama &=, |=, <<=, >>= destekleniyor.
Sabit katlama güncellendi. ^ (XOR) CARET çakışması nedeniyle atlandı.
#38 — LOAD_GLOBAL / STORE_GLOBAL opcode'ları eklendi (Seçenek A: gerçek global slot).
IRProgram.globalCount + globalNames; Interpreter.globalSlots_.
Global init ifadeleri main'in başında üretiliyor.
Tüm fonksiyonlar global alana erişebilir.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-20 15:00:32 +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
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
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