UNPKG

cookeylang-ts

Version:
84 lines (83 loc) 3.14 kB
"use strict"; 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;