Files
hakorune/apps/selfhost/compiler/boxes/mir_emitter_box.nyash

53 lines
2.0 KiB
Plaintext

// MirEmitterBox — Minimal MIR JSON v0 emitter (M2 MVP)
// Scope: Return(Int) only (const + ret). Safe default to 0 when not found.
// Future: add Binary/Compare/ExternCall/BoxCall lowering incrementally.
box MirEmitterBox {
// Extract first Return(Int) value from Stage-1 JSON (very small string scan)
_extract_return_int(ast_json) {
if ast_json == null { return 0 }
// Look for '"type":"Return"'
local p = ast_json.lastIndexOf("\"type\":\"Return\"")
if p < 0 { p = ast_json.indexOf("\"type\":\"Return\"") }
if p < 0 { return 0 }
// From there, search for '"type":"Int","value":'
local q = ast_json.indexOf("\"type\":\"Int\",\"value\":", p)
if q < 0 { return 0 }
q = q + 23 // length of the marker
// Read consecutive digits (optional minus not handled in Stage-1 yet)
local n = ast_json.length()
local i = q
local s = ""
loop(i < n) {
local ch = ast_json.substring(i, i+1)
if ch >= "0" && ch <= "9" { s = s + ch i = i + 1 } else { break }
}
if s.length() == 0 { return 0 }
// String to int via addition loop
local val = 0
local k = 0
local m = s.length()
loop(k < m) {
local d = s.substring(k, k+1)
local dv = 0
if d == "1" { dv = 1 } else { if d == "2" { dv = 2 } else { if d == "3" { dv = 3 } else { if d == "4" { dv = 4 } else { if d == "5" { dv = 5 } else { if d == "6" { dv = 6 } else { if d == "7" { dv = 7 } else { if d == "8" { dv = 8 } else { if d == "9" { dv = 9 } } } } } } } } }
val = val * 10 + dv
k = k + 1
}
return val
}
// Build minimal MIR JSON v0: main with const -> ret
emit_mir_min(ast_json) {
local retv = me._extract_return_int(ast_json)
local s = "{\"functions\":[{\"name\":\"main\",\"params\":[],\"blocks\":[{\"id\":0,\"instructions\":["
s = s + "{\\\"op\\\":\\\"const\\\",\\\"value\\\":{\\\"type\\\":\\\"i64\\\",\\\"value\\\":" + retv + "},\\\"dst\\\":1},"
s = s + "{\\\"op\\\":\\\"ret\\\",\\\"value\\\":1}"
s = s + "]}]}]}"
return s
}
}
static box MirEmitterStub { main(args) { return 0 } }