UNPKG

eggtended-js

Version:

A extended version of the Egg programming language from the Eloquent Javascript book.

81 lines (61 loc) 1.93 kB
const process = require("process"); const readline = require("readline"); const { Lexer } = require("../parser/lexer.js"); const { Parser } = require("../parser/parse.js"); const { Semantic } = require("../parser/semantic.js"); const { TopEnv } = require("../interp/environment.js"); const { Eggvm } = require("../interp/eggvm.js"); const extensions = require("./extensions.js"); const colors = require("./colors.js"); const repl = () => { // Create the REPL environment const topEnv = Object.create(TopEnv); const lexer = new Lexer(); const parser = new Parser(); const semantic = new Semantic(); topEnv["__symboltable__"] = semantic.symboltable; let program = ""; let stack = 0; extensions.eggInfo(); try { const rl = readline.createInterface(process.stdin, process.stdout, line => { return extensions.eggCompleter(line, topEnv); }); rl.setPrompt(extensions.getPromptLine()); rl.prompt(); rl.on("line", line => { program += line + "\n"; // Count the number of LPS (+) or RPS (-) stack = lexer.getParBalance(program); if (stack <= 0) { try { const tree = parser.parse(program); semantic.check(tree); Eggvm.eval(tree, topEnv); } catch (err) { console.log(`${colors.RED} Error:: ${err} ${colors.DEFAULT}`); } finally { program = ""; stack = 0; } } rl.setPrompt(extensions.getPromptLine() + "..".repeat(stack)); rl.prompt(); }); rl.on("close", extensions.eggExit); rl.on("SIGINT", () => { console.log(`\n${colors.GREEN}\n--> Expression discarded ${colors.DEFAULT}`); program = ""; stack = 0; rl.clearLine(process.stdout); rl.setPrompt(extensions.getPromptLine()); rl.prompt(); }); } catch (err) { console.log(err); extensions.eggHelp(); } }; module.exports = { repl };