154 lines
5.7 KiB
Python
154 lines
5.7 KiB
Python
"""
|
||
saQut büyük kaynak dosyası üretici.
|
||
Sözdizimsel ve semantik olarak geçerli, çeşitli yapılar içeren
|
||
gerçekçi bir .sqt dosyası üretir.
|
||
|
||
Hedef: ~1 MB
|
||
"""
|
||
|
||
import sys
|
||
import random
|
||
|
||
random.seed(42)
|
||
|
||
lines = []
|
||
|
||
def emit(s=""):
|
||
lines.append(s)
|
||
|
||
# ── Başlık ────────────────────────────────────────────────────────────────────
|
||
emit("// saQut büyük kaynak dosyası — otomatik üretildi (gen_large.py)")
|
||
emit("// Amaç: ast / symbols / check komutları için performans ölçümü")
|
||
emit()
|
||
|
||
# ── Struct tanımları ──────────────────────────────────────────────────────────
|
||
STRUCT_COUNT = 20
|
||
for i in range(STRUCT_COUNT):
|
||
emit(f"struct Vec{i} {{")
|
||
emit(f" int x;")
|
||
emit(f" int y;")
|
||
emit(f" int z;")
|
||
emit(f" float w;")
|
||
emit(f"}}")
|
||
emit()
|
||
|
||
# ── Global değişkenler ────────────────────────────────────────────────────────
|
||
for i in range(50):
|
||
emit(f"int g_{i} = {i * 3 + 1};")
|
||
emit()
|
||
|
||
# ── Yardımcı: rastgele aritmetik ifade (derinlik sınırlı) ─────────────────────
|
||
def expr(depth=0, vars=None):
|
||
if vars is None:
|
||
vars = ["a", "b", "c", "x", "n"]
|
||
if depth >= 3 or random.random() < 0.35:
|
||
choice = random.random()
|
||
if choice < 0.5 and vars:
|
||
return random.choice(vars)
|
||
elif choice < 0.8:
|
||
return str(random.randint(1, 100))
|
||
else:
|
||
return str(random.randint(1, 20))
|
||
ops = ["+", "-", "*"]
|
||
op = random.choice(ops)
|
||
return f"({expr(depth+1, vars)} {op} {expr(depth+1, vars)})"
|
||
|
||
def cond(vars=None):
|
||
if vars is None:
|
||
vars = ["a", "b", "n"]
|
||
ops = ["<", ">", "<=", ">=", "==", "!="]
|
||
op = random.choice(ops)
|
||
lhs = expr(0, vars)
|
||
rhs = expr(0, vars)
|
||
return f"{lhs} {op} {rhs}"
|
||
|
||
# ── Fonksiyon gövdesi üreteci ─────────────────────────────────────────────────
|
||
def gen_body(fn_idx, local_vars, indent=1):
|
||
pad = " " * indent
|
||
code = []
|
||
|
||
# 2-5 lokal değişken tanımı — sadece declare edilenleri ifadelerde kullan
|
||
n_vars = random.randint(2, 5)
|
||
declared = []
|
||
for v in local_vars[:n_vars]:
|
||
# İlk değişken sadece sabitle başlatılır (henüz başka değişken yok)
|
||
init = expr(0, declared if declared else ["1"])
|
||
code.append(f"{pad}int {v} = {init};")
|
||
declared.append(v)
|
||
local_vars = declared # bundan sonra sadece declare edilenleri kullan
|
||
|
||
# 1-3 if bloğu
|
||
for _ in range(random.randint(1, 3)):
|
||
c = cond(local_vars)
|
||
then_val = expr(0, local_vars)
|
||
code.append(f"{pad}if ({c}) {{")
|
||
code.append(f"{pad} {local_vars[0]} = {then_val};")
|
||
if random.random() < 0.4:
|
||
else_val = expr(0, local_vars)
|
||
code.append(f"{pad}}} else {{")
|
||
code.append(f"{pad} {local_vars[0]} = {else_val};")
|
||
code.append(f"{pad}}}")
|
||
|
||
# 0-2 for döngüsü
|
||
for _ in range(random.randint(0, 2)):
|
||
bound = random.randint(3, 15)
|
||
inner = expr(0, local_vars)
|
||
code.append(f"{pad}for (int i = 0; i < {bound}; i = i + 1) {{")
|
||
code.append(f"{pad} {local_vars[0]} = {local_vars[0]} + {inner};")
|
||
code.append(f"{pad}}}")
|
||
|
||
# return
|
||
ret_val = expr(0, local_vars)
|
||
code.append(f"{pad}return {ret_val};")
|
||
return code
|
||
|
||
# ── Fonksiyon tanımları ───────────────────────────────────────────────────────
|
||
# Toplam ~5000 fonksiyon → ~1 MB hedef
|
||
FUNC_COUNT = 5000
|
||
func_names = [f"fn_{i:04d}" for i in range(FUNC_COUNT)]
|
||
func_params = {} # fname → n_params (çağrı sırasında eşleştirmek için)
|
||
|
||
for i, fname in enumerate(func_names):
|
||
# Parametre listesi (0-3 parametre)
|
||
n_params = random.randint(0, 3)
|
||
func_params[fname] = n_params
|
||
params = [f"int p{j}" for j in range(n_params)]
|
||
param_str = ", ".join(params)
|
||
|
||
# Lokal değişken adları
|
||
local_vars = ["a", "b", "c", "d", "e",
|
||
f"v{i % 10}", f"w{i % 7}"]
|
||
|
||
emit(f"int {fname}({param_str}) {{")
|
||
for line in gen_body(i, local_vars):
|
||
emit(line)
|
||
emit("}")
|
||
emit()
|
||
|
||
# ── Main ──────────────────────────────────────────────────────────────────────
|
||
emit("int main() {")
|
||
emit(" int result = 0;")
|
||
emit()
|
||
|
||
# Her 50 fonksiyonu bir kere çağır — argüman sayısı imzayla eşleştirildi
|
||
for i in range(0, FUNC_COUNT, 50):
|
||
fname = func_names[i]
|
||
n_params = func_params[fname]
|
||
args = ", ".join(str(random.randint(1, 20)) for _ in range(n_params))
|
||
emit(f" result = result + {fname}({args});")
|
||
|
||
emit()
|
||
emit(" print(result);")
|
||
emit(" return 0;")
|
||
emit("}")
|
||
|
||
# ── Yaz ───────────────────────────────────────────────────────────────────────
|
||
output = "\n".join(lines) + "\n"
|
||
path = sys.argv[1] if len(sys.argv) > 1 else "examples/large.sqt"
|
||
|
||
with open(path, "w", encoding="utf-8") as f:
|
||
f.write(output)
|
||
|
||
size_kb = len(output.encode("utf-8")) / 1024
|
||
print(f"Üretildi: {path} ({size_kb:.1f} KB, {len(lines)} satır)")
|