76 lines
2.0 KiB
Plaintext
76 lines
2.0 KiB
Plaintext
// regen.cm — regenerate .mach bytecode files
|
|
// Run with: ./cell --core . regen.cm
|
|
|
|
var fd = use("fd")
|
|
var json = use("json")
|
|
var tokenize = use("tokenize")
|
|
var parse = use("parse")
|
|
var fold = use("fold")
|
|
var mcode = use("mcode")
|
|
var streamline = use("streamline")
|
|
|
|
var files = [
|
|
{src: "tokenize.cm", name: "tokenize", out: "tokenize.mach"},
|
|
{src: "parse.cm", name: "parse", out: "parse.mach"},
|
|
{src: "fold.cm", name: "fold", out: "fold.mach"},
|
|
{src: "mcode.cm", name: "mcode", out: "mcode.mach"},
|
|
{src: "streamline.cm", name: "streamline", out: "streamline.mach"},
|
|
{src: "qbe.cm", name: "qbe", out: "qbe.mach"},
|
|
{src: "qbe_emit.cm", name: "qbe_emit", out: "qbe_emit.mach"},
|
|
{src: "internal/bootstrap.cm", name: "bootstrap", out: "internal/bootstrap.mach"},
|
|
{src: "internal/engine.cm", name: "engine", out: "internal/engine.mach"}
|
|
]
|
|
|
|
var i = 0
|
|
var entry = null
|
|
var src = null
|
|
var tok_result = null
|
|
var ast = null
|
|
var folded = null
|
|
var compiled = null
|
|
var optimized = null
|
|
var mcode_json = null
|
|
var bytecode = null
|
|
var f = null
|
|
var errs = null
|
|
var ei = 0
|
|
var e = null
|
|
var had_errors = false
|
|
|
|
while (i < length(files)) {
|
|
entry = files[i]
|
|
src = text(fd.slurp(entry.src))
|
|
tok_result = tokenize(src, entry.src)
|
|
ast = parse(tok_result.tokens, src, entry.src, tokenize)
|
|
// Check for parse/semantic errors
|
|
errs = ast.errors
|
|
if (errs != null && length(errs) > 0) {
|
|
ei = 0
|
|
while (ei < length(errs)) {
|
|
e = errs[ei]
|
|
if (e.line != null) {
|
|
print(`${entry.src}:${text(e.line)}:${text(e.column)}: error: ${e.message}`)
|
|
} else {
|
|
print(`${entry.src}: error: ${e.message}`)
|
|
}
|
|
ei = ei + 1
|
|
}
|
|
had_errors = true
|
|
i = i + 1
|
|
continue
|
|
}
|
|
folded = fold(ast)
|
|
compiled = mcode(folded)
|
|
optimized = streamline(compiled)
|
|
mcode_json = json.encode(optimized)
|
|
bytecode = mach_compile_mcode_bin(entry.name, mcode_json)
|
|
f = fd.open(entry.out, "w")
|
|
fd.write(f, bytecode)
|
|
fd.close(f)
|
|
print(`wrote ${entry.out}`)
|
|
i = i + 1
|
|
}
|
|
if (had_errors) {
|
|
print("regen aborted: fix errors above")
|
|
}
|