53 lines
2.0 KiB
Plaintext
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 } }
|
|
|