[Test] Döngüler — while / do-while / for Davranış Farkları #100

Closed
opened 2026-06-14 22:26:26 +03:00 by saqut · 1 comment
Owner

Giriş (Nedir, Neden Önemli?)

Üç döngü yapısının (while, do-while, for) birbirinden farklı davrandığı noktalar — özellikle do-while'ın gövdeyi en az bir kez çalıştırması — derleyicide kolayca karıştırılabilecek köşe durumlardır (edge case). Bu issue, bu farkları somut kodla sabitler.


Test Kodu 1 — Üç döngü de aynı sayıları üretmeli (examples/tests/donguler_temel.sqt)

int main() {
    int i = 0;
    while (i < 3) {
        print(i);
        i = i + 1;
    }

    int j = 0;
    do {
        print(j);
        j = j + 1;
    } while (j < 3);

    for (int k = 0; k < 3; k = k + 1) {
        print(k);
    }
    return 0;
}

Beklenen Çıktı

0
1
2
0
1
2
0
1
2

Test Kodu 2 — do-while koşulu en baştan yanlışsa bile gövde bir kez çalışır (examples/tests/do_while_en_az_bir.sqt)

int main() {
    int x = 5;
    do {
        print(x);
        x = x + 1;
    } while (x < 0);   // baştan yanlış!
    return 0;
}

Beklenen Çıktı

5

(Eğer çıktı boş ise — yani do-while, while gibi davranıyorsa — bu bir bug'dır: do-while'ın AST düğümü/IR alçaltması while ile aynı koddan üretilmiş ve gövdeyi koşuldan sonra kontrol etmiyor olabilir.)


Açık Sorular / Bağlı Fazlar

  • for döngüsünün üç parçası (init; condition; step) ayrı ayrı AST düğümlerinde mi tutuluyor, yoksa while'a "alçaltılıyor" (desugar) mu? İkinci durumda, for (int k = 0; ...) içindeki k'nın scope'u (sadece for bloğuna özel mi?) Faz 2'de doğru kurulmalı.
  • break/continue (E004 ile ilişkili) bu üç döngü türünde de test edilmeli — ayrı bir test dosyası (donguler_break_continue.sqt) eklenebilir.

İmza/Yorum: do-while/while karışıklığı, "derleyici neredeyse bitti ama syntax X yanlış davranıyor" tarzı klasik bug'lardandır — bu test erken yazılırsa erken yakalanır.

### Giriş (Nedir, Neden Önemli?) Üç döngü yapısının (`while`, `do-while`, `for`) **birbirinden farklı** davrandığı noktalar — özellikle `do-while`'ın gövdeyi **en az bir kez** çalıştırması — derleyicide kolayca karıştırılabilecek köşe durumlardır (edge case). Bu issue, bu farkları somut kodla sabitler. --- ### Test Kodu 1 — Üç döngü de aynı sayıları üretmeli (`examples/tests/donguler_temel.sqt`) ```c int main() { int i = 0; while (i < 3) { print(i); i = i + 1; } int j = 0; do { print(j); j = j + 1; } while (j < 3); for (int k = 0; k < 3; k = k + 1) { print(k); } return 0; } ``` ### Beklenen Çıktı ``` 0 1 2 0 1 2 0 1 2 ``` --- ### Test Kodu 2 — `do-while` koşulu en baştan yanlışsa bile gövde bir kez çalışır (`examples/tests/do_while_en_az_bir.sqt`) ```c int main() { int x = 5; do { print(x); x = x + 1; } while (x < 0); // baştan yanlış! return 0; } ``` ### Beklenen Çıktı ``` 5 ``` (Eğer çıktı **boş** ise — yani `do-while`, `while` gibi davranıyorsa — bu bir **bug**'dır: `do-while`'ın AST düğümü/IR alçaltması `while` ile aynı koddan üretilmiş ve gövdeyi koşuldan **sonra** kontrol etmiyor olabilir.) --- ### Açık Sorular / Bağlı Fazlar - `for` döngüsünün üç parçası (`init; condition; step`) ayrı ayrı `AST` düğümlerinde mi tutuluyor, yoksa `while`'a "alçaltılıyor" (desugar) mu? İkinci durumda, `for (int k = 0; ...)` içindeki `k`'nın scope'u (sadece `for` bloğuna özel mi?) Faz 2'de doğru kurulmalı. - `break`/`continue` (E004 ile ilişkili) bu üç döngü türünde de test edilmeli — ayrı bir test dosyası (`donguler_break_continue.sqt`) eklenebilir. *İmza/Yorum:* `do-while`/`while` karışıklığı, "derleyici neredeyse bitti ama syntax X yanlış davranıyor" tarzı klasik bug'lardandır — bu test erken yazılırsa erken yakalanır.
saqut added the
test-senaryosu
label 2026-06-14 22:26:26 +03:00
Author
Owner

İki golden test eklendi: loops/basic.sqt (while/do-while/for üçü de 0,1,2 üretiyor) ve loops/do_while_once.sqt (koşul baştan yanlış → gövde yine de bir kez çalışıyor; 5 çıktısı). 9/9 ctest geçti.

İki golden test eklendi: `loops/basic.sqt` (while/do-while/for üçü de 0,1,2 üretiyor) ve `loops/do_while_once.sqt` (koşul baştan yanlış → gövde yine de bir kez çalışıyor; 5 çıktısı). 9/9 ctest geçti.
saqut closed this issue 2026-06-18 22:33:33 +03:00
Sign in to join this conversation.
No description provided.