ethos/src/main.ts
2026-03-11 09:54:21 +01:00

43 lines
1.1 KiB
TypeScript

import * as ast from "./ast.ts";
import * as front from "./front/mod.ts";
import * as middle from "./middle.ts";
import { MirInterpreter } from "./mir_interpreter.ts";
const filename = Deno.args[0];
const text = await Deno.readTextFile(filename);
const fileAst = front.parse(filename, text);
const resols = front.resolve(filename, text, fileAst);
const checker = new front.Checker(filename, text, fileAst, resols);
let mainFn: ast.NodeWithKind<"FnStmt"> | null = null;
fileAst.visit({
visit(node) {
if (node.kind.tag === "FnStmt" && node.kind.ident === "main") {
if (mainFn) {
console.error("error: multiple 'main' functions");
Deno.exit(1);
}
ast.assertNodeWithKind(node, "FnStmt");
mainFn = node;
}
},
});
if (!mainFn) {
console.error("error: no 'main' function");
Deno.exit(1);
}
const m = new middle.MiddleLowerer(resols, checker);
const mainMiddleFn = m.lowerFn(mainFn);
if (!Deno.args.includes("--test")) {
console.log(mainMiddleFn.pretty());
}
const interp = new MirInterpreter();
interp.eval(mainMiddleFn);