cookeylang-ts
Version:
A dynamic, interpreted language.
84 lines (83 loc) • 3.14 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.repl = exports.interpretFile = exports.interpretText = void 0;
const fs_1 = require("fs");
const readline = __importStar(require("readline"));
const lexer_1 = require("./lexer");
const parser_1 = require("./parser");
const interpreter_1 = require("./interpreter");
const resolver_1 = require("./resolver");
const astprinter_1 = require("./debug/astprinter");
const tokprinter_1 = require("./debug/tokprinter");
async function interpretText(code, file, debug = false) {
const lex = new lexer_1.Lexer(code, file);
const tokens = lex.init();
if (lex.hasError)
return;
if (debug)
console.log(tokprinter_1.tokenPrinter(tokens));
const parser = new parser_1.Parser(tokens, file);
const trees = parser.init();
if (parser.hasError)
return;
if (debug) {
const astprnt = new astprinter_1.AstPrinter(trees);
console.log(astprnt.init());
}
const interpreter = new interpreter_1.Interpreter(trees);
const resolver = new resolver_1.Resolver(interpreter);
resolver.init(trees);
if (resolver.hasError)
return;
let result = interpreter.init();
console.log(result);
return result;
}
exports.interpretText = interpretText;
async function interpretFile(file, debug = false) {
const code = await fs_1.promises.readFile(file, "utf-8");
return interpretText(code, file, debug);
}
exports.interpretFile = interpretFile;
function repl() {
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
let code = "";
let indentation = 0;
console.log("CookeyLang REPL");
console.log("Press ^C or \x1b[1mEXIT\x1b[0m to exit.");
process.stdout.write("> ");
rl.on("line", async (inp) => {
if (inp == "EXIT")
process.exit(0);
if (inp == "{")
indentation++;
if (inp == "}" && indentation > 0)
indentation--;
code += inp;
if (indentation == 0) {
await interpretText(code, "repl");
code = "";
}
process.stdout.write("> ");
});
}
exports.repl = repl;