feat: ADR-024/025/021 — string concat, try/catch/throw, nullable akış-analizi #115

Merged
saqut merged 60 commits from 0.1.0 into master 2026-06-20 21:36:43 +03:00
6 changed files with 65 additions and 9 deletions
Showing only changes of commit 636bfcc6d5 - Show all commits

View File

@ -101,4 +101,18 @@ foreach(SQT_FILE ${ALL_GOLDEN_SQT})
-P "${CMAKE_SOURCE_DIR}/cmake/run_golden_error.cmake" -P "${CMAKE_SOURCE_DIR}/cmake/run_golden_error.cmake"
) )
endif() endif()
# Negatif test: .runtime_error çalışma zamanı hatası beklenen golden testler.
# Aynı altyapı: exit code != 0 + stderr içeriği kontrolü.
set(RUNTIME_ERROR_EXPECTED "${CMAKE_SOURCE_DIR}/tests/golden/${BASE}.runtime_error")
if(EXISTS "${RUNTIME_ERROR_EXPECTED}")
add_test(
NAME "golden_${TNAME}_runtime_error"
COMMAND ${CMAKE_COMMAND}
-DBINARY=${SAQUT_BINARY}
-DSOURCE=${SQT_FILE}
-DEXPECTED=${RUNTIME_ERROR_EXPECTED}
-P "${CMAKE_SOURCE_DIR}/cmake/run_golden_error.cmake"
)
endif()
endforeach() endforeach()

View File

@ -376,12 +376,13 @@ int IRGenerator::generateExpression(ASTNode* node) {
return varSlot; return varSlot;
} }
// Birleşik atama: += -= *= /= // Birleşik atama: += -= *= /= %=
// x += y ≡ x = x + y // x OP= y ≡ x = x OP y
if (bin->Operator == TokenType::PLUS_EQUAL || if (bin->Operator == TokenType::PLUS_EQUAL ||
bin->Operator == TokenType::MINUS_EQUAL || bin->Operator == TokenType::MINUS_EQUAL ||
bin->Operator == TokenType::STAR_EQUAL || bin->Operator == TokenType::STAR_EQUAL ||
bin->Operator == TokenType::SLASH_EQUAL) { bin->Operator == TokenType::SLASH_EQUAL ||
bin->Operator == TokenType::PERCENT_EQUAL) {
auto* lhsId = (IdentifierNode*)bin->Left; auto* lhsId = (IdentifierNode*)bin->Left;
std::string varName = lhsId->parserToken.token->token; std::string varName = lhsId->parserToken.token->token;
@ -392,6 +393,7 @@ int IRGenerator::generateExpression(ASTNode* node) {
if (bin->Operator == TokenType::MINUS_EQUAL) arithOp = Opcode::SUB; if (bin->Operator == TokenType::MINUS_EQUAL) arithOp = Opcode::SUB;
else if (bin->Operator == TokenType::STAR_EQUAL) arithOp = Opcode::MUL; else if (bin->Operator == TokenType::STAR_EQUAL) arithOp = Opcode::MUL;
else if (bin->Operator == TokenType::SLASH_EQUAL) arithOp = Opcode::DIV; else if (bin->Operator == TokenType::SLASH_EQUAL) arithOp = Opcode::DIV;
else if (bin->Operator == TokenType::PERCENT_EQUAL) arithOp = Opcode::MOD;
int resultSlot = freshSlot(); int resultSlot = freshSlot();
emitBinaryOp(arithOp, resultSlot, varSlot, rhsSlot); emitBinaryOp(arithOp, resultSlot, varSlot, rhsSlot);

View File

@ -0,0 +1,4 @@
2
1
0
2

View File

@ -0,0 +1,27 @@
// B8: %= bileşik atama doğru IR üretmeli.
// Elle hesap: 17%5=2, 10%3=1, 0%4=0, zincir: 20+5=25-3=22*2=44/4=11%3=2
int main() {
int a = 17;
a %= 5;
print(a); // 2
int b = 10;
b %= 3;
print(b); // 1
int c = 0;
c %= 4;
print(c); // 0
// Tüm bileşik atamalar zinciri (regresyon)
int x = 20;
x += 5; // 25
x -= 3; // 22
x *= 2; // 44
x /= 4; // 11
x %= 3; // 2
print(x); // 2
return 0;
}

View File

@ -0,0 +1 @@
sıfıra bölme \(mod\)

View File

@ -0,0 +1,8 @@
// Runtime test: a %= 0 → çalışma zamanı sıfıra bölme hatası vermeli.
int main() {
int a = 7;
a %= 0;
print(a);
return 0;
}